Token Skullybois Rising

 

Overview ERC-721

Total Supply:
326 SKBOIS

Holders:
66 addresses

Transfers:
-

Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
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:
SkullyBois

Compiler Version
v0.8.1+commit.df193b15

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-07-25
*/

pragma solidity ^0.8.0;


// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
/**
 * @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);
}


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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * 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;

    /**
     * @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 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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @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);
}


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)
/**
 * @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 `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)
/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

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


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

        return account.code.length > 0;
    }

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

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

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

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

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

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

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

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

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

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

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

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

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

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


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

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


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)
/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

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

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

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

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

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


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


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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: address zero is not a valid owner");
        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: invalid token ID");
        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) {
        _requireMinted(tokenId);

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

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        return _tokenApprovals[tokenId];
    }

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token 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: caller is not token 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) {
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == 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);

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

        _afterTokenTransfer(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 from incorrect owner");
        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);

        _afterTokenTransfer(from, to, tokenId);
    }

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

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits an {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    /// @solidity memory-safe-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` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/extensions/ERC721URIStorage.sol)
/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        _requireMinted(tokenId);

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @dev See {ERC721-_burn}. This override additionally checks to see if a
     * token-specific URI was set for the token, and if so, it deletes the token URI from
     * the storage mapping.
     */
    function _burn(uint256 tokenId) internal virtual override {
        super._burn(tokenId);

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}


// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)
/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. 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;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}


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

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

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

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

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

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

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

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

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


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

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

    /**
     * @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);
}


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


contract SkullyBois is ERC721URIStorage,Ownable{
  using Counters for Counters.Counter;
  Counters.Counter private _tokenIds;
  uint256 private _currentToken;
  uint256 private _price;
  uint256 private _maxMintable;
  string private _customBaseURI;
  uint256 private _royaltyAmount;
  uint256 private _maxMintPerTx;
  uint256 private _maxPerWallet;
  bytes4 private constant _INTERFACE_ID_ERC2981 = 0x2a55205a;
  bool private _privateSale;
  bool private _mintActive;
 
  ERC721Enumerable contract1 = ERC721Enumerable(0x0000000000000000000000000000000000000000);
  ERC721Enumerable contract2 = ERC721Enumerable(0x0000000000000000000000000000000000000000);
  constructor() ERC721("Skullybois Rising", "SKBOIS") {
    _customBaseURI = 'ipfs://QmcNbjpQ7VepEGKtr7TcLZbp8oESe6nPexH6MQ5WTsHX3m/';
    _price = 25 * 1000000000000000000;  //price in wei 
    _maxMintable = 1234; 
    _royaltyAmount = 750;
    _maxPerWallet = 9999;
    _maxMintPerTx = 20; 
    _mintActive = false; 
    _privateSale = false;
  }
  mapping(address => bool) whitelistedAddresses;
  function addUser(address[] memory _addressToWhitelist) public onlyOwner {
    
    for(uint i=0;i< _addressToWhitelist.length ;i++){
    whitelistedAddresses[_addressToWhitelist[i]] = true;
  }
  }
  function removeUser(address[] memory _addressToRemove) public onlyOwner {
    
    for(uint i=0;i< _addressToRemove.length ;i++){
    whitelistedAddresses[_addressToRemove[i]] = false;
  }
  }
  function verifyUser(address _whitelistedAddress) public view returns(bool) {
    if (_privateSale == true)return whitelistedAddresses[_whitelistedAddress];
    else if (_privateSale==false){return true;}
  }

  function setBaseURI(string memory customBaseURI_) public onlyOwner {
    _customBaseURI = customBaseURI_;
  }
  function isHolder(address holder) public view returns (bool _holder){
    if(_privateSale && contract1.balanceOf(holder)>0 || contract2.balanceOf(holder)>0){_holder = true; return _holder;}
    else if (_privateSale && !(contract1.balanceOf(holder)>0) && !(contract2.balanceOf(holder)>0)){_holder = false; return _holder;}
    else if (_privateSale==false){return true;}
  }
  function setMintActive(bool status) public onlyOwner {
    _mintActive = status;
  }
  function setPrivateSale(bool status) public onlyOwner {
    _privateSale = status;
  }
  function setPrice(uint256 priceInMilli) public onlyOwner {
    _price = priceInMilli * 10000000000000000;
  }
  function setMaxMintable(uint256 max) public onlyOwner {
    _maxMintable = max;
  }
  function setMaxPerTx(uint256 max) public onlyOwner {
    _maxMintPerTx = max;
  }
  function setMaxPerWallet(uint256 max) public onlyOwner {
    _maxPerWallet = max;
  }
  function setRoyalty(uint256 royalty) public onlyOwner {
    _royaltyAmount = royalty;
  }
  //remember to set the contracts to valid contract addresses, or even this contract's address or else minting won't work
  function setContract1(ERC721Enumerable c1) public onlyOwner {
    contract1 = c1;
  }
  function setContract2(ERC721Enumerable c2) public onlyOwner {
    contract2 = c2;
  }

  function mint(uint256 quantity) public payable {
    require(isHolder(msg.sender) || verifyUser(msg.sender), "not whitelisted, wait until public sale");
    require(quantity+balanceOf(msg.sender) <= _maxPerWallet, "you minted/are minting more than the max amount");
    require(_mintActive, "Minting is not active.");
    require(quantity <= _maxMintPerTx, "Cannot mint that many at once.");
    require(msg.value >= (_price * quantity), "Not enough FTM sent.");
  
    payable(owner()).transfer(msg.value);

    for(uint i = 0; i < quantity; i++) {
      _privateMint(msg.sender);
    }
  }

  function totalSupply() public view returns (uint256) {
    return _tokenIds.current();
  }

  function _privateMint(address recipient) private {
    _tokenIds.increment();
    require(_tokenIds.current() <= _maxMintable, "Project is finished minting.");

    uint256 newItemId = _tokenIds.current();
    _mint(recipient, newItemId);
  }

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

  function royaltyInfo(
    uint256 _tokenId, 
    uint256 _salePrice
  ) external view returns (address receiver, uint256 royaltyAmount) {
    return (owner(), ((_salePrice * _royaltyAmount) / 10000));
  }

  function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721) returns (bool) {
    if (interfaceId == _INTERFACE_ID_ERC2981) {
      return true;
    }
    return super.supportsInterface(interfaceId);
  } 
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address[]","name":"_addressToWhitelist","type":"address[]"}],"name":"addUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"}],"name":"isHolder","outputs":[{"internalType":"bool","name":"_holder","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addressToRemove","type":"address[]"}],"name":"removeUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"customBaseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ERC721Enumerable","name":"c1","type":"address"}],"name":"setContract1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ERC721Enumerable","name":"c2","type":"address"}],"name":"setContract2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"max","type":"uint256"}],"name":"setMaxMintable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"max","type":"uint256"}],"name":"setMaxPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"max","type":"uint256"}],"name":"setMaxPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"setMintActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"priceInMilli","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"setPrivateSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"royalty","type":"uint256"}],"name":"setRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_whitelistedAddress","type":"address"}],"name":"verifyUser","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

60806040526000601060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200009557600080fd5b506040518060400160405280601181526020017f536b756c6c79626f697320526973696e670000000000000000000000000000008152506040518060400160405280600681526020017f534b424f4953000000000000000000000000000000000000000000000000000081525081600090805190602001906200011a929190620002c5565b50806001908051906020019062000133929190620002c5565b505050620001566200014a620001f760201b60201c565b620001ff60201b60201c565b604051806060016040528060368152602001620042c160369139600c908051906020019062000187929190620002c5565b5068015af1d78b58c40000600a819055506104d2600b819055506102ee600d8190555061270f600f819055506014600e819055506000601060016101000a81548160ff0219169083151502179055506000601060006101000a81548160ff021916908315150217905550620003da565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002d39062000375565b90600052602060002090601f016020900481019282620002f7576000855562000343565b82601f106200031257805160ff191683800117855562000343565b8280016001018555821562000343579182015b828111156200034257825182559160200191906001019062000325565b5b50905062000352919062000356565b5090565b5b808211156200037157600081600090555060010162000357565b5090565b600060028204905060018216806200038e57607f821691505b60208210811415620003a557620003a4620003ab565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b613ed780620003ea6000396000f3fe6080604052600436106101ee5760003560e01c8063769315a41161010d578063b88d4fde116100a0578063d4d7b19a1161006f578063d4d7b19a146106e5578063e268e4d314610722578063e985e9c51461074b578063ee1cc94414610788578063f2fde38b146107b1576101ee565b8063b88d4fde1461062d578063c6f6f21614610656578063c87b56dd1461067f578063cdfca7f2146106bc576101ee565b806395d89b41116100dc57806395d89b4114610594578063993847d1146105bf578063a0712d68146105e8578063a22cb46514610604576101ee565b8063769315a4146104ee57806389462c38146105175780638da5cb5b1461054057806391b7f5ed1461056b576101ee565b80632a55205a1161018557806355f804b31161015457806355f804b3146104345780636352211e1461045d57806370a082311461049a578063715018a6146104d7576101ee565b80632a55205a146103675780634209a2e1146103a557806342842e0e146103ce5780634d813120146103f7576101ee565b806317ef67c6116101c157806317ef67c6146102c157806318160ddd146102ea57806323b872dd1461031557806325d387b51461033e576101ee565b806301ffc9a7146101f357806306fdde0314610230578063081812fc1461025b578063095ea7b314610298575b600080fd5b3480156101ff57600080fd5b5061021a60048036038101906102159190612d0b565b6107da565b6040516102279190613272565b60405180910390f35b34801561023c57600080fd5b50610245610843565b604051610252919061328d565b60405180910390f35b34801561026757600080fd5b50610282600480360381019061027d9190612dc7565b6108d5565b60405161028f91906131e2565b60405180910390f35b3480156102a457600080fd5b506102bf60048036038101906102ba9190612c65565b61091b565b005b3480156102cd57600080fd5b506102e860048036038101906102e39190612d5d565b610a33565b005b3480156102f657600080fd5b506102ff610a7f565b60405161030c919061350f565b60405180910390f35b34801561032157600080fd5b5061033c60048036038101906103379190612b5f565b610a90565b005b34801561034a57600080fd5b5061036560048036038101906103609190612dc7565b610af0565b005b34801561037357600080fd5b5061038e60048036038101906103899190612e19565b610b02565b60405161039c929190613249565b60405180910390f35b3480156103b157600080fd5b506103cc60048036038101906103c79190612dc7565b610b33565b005b3480156103da57600080fd5b506103f560048036038101906103f09190612b5f565b610b45565b005b34801561040357600080fd5b5061041e60048036038101906104199190612afa565b610b65565b60405161042b9190613272565b60405180910390f35b34801561044057600080fd5b5061045b60048036038101906104569190612d86565b610c02565b005b34801561046957600080fd5b50610484600480360381019061047f9190612dc7565b610c24565b60405161049191906131e2565b60405180910390f35b3480156104a657600080fd5b506104c160048036038101906104bc9190612afa565b610cd6565b6040516104ce919061350f565b60405180910390f35b3480156104e357600080fd5b506104ec610d8e565b005b3480156104fa57600080fd5b5061051560048036038101906105109190612ca1565b610da2565b005b34801561052357600080fd5b5061053e60048036038101906105399190612d5d565b610e65565b005b34801561054c57600080fd5b50610555610eb1565b60405161056291906131e2565b60405180910390f35b34801561057757600080fd5b50610592600480360381019061058d9190612dc7565b610edb565b005b3480156105a057600080fd5b506105a9610eff565b6040516105b6919061328d565b60405180910390f35b3480156105cb57600080fd5b506105e660048036038101906105e19190612ce2565b610f91565b005b61060260048036038101906105fd9190612dc7565b610fb6565b005b34801561061057600080fd5b5061062b60048036038101906106269190612c29565b6111c3565b005b34801561063957600080fd5b50610654600480360381019061064f9190612bae565b6111d9565b005b34801561066257600080fd5b5061067d60048036038101906106789190612dc7565b61123b565b005b34801561068b57600080fd5b506106a660048036038101906106a19190612dc7565b61124d565b6040516106b3919061328d565b60405180910390f35b3480156106c857600080fd5b506106e360048036038101906106de9190612ca1565b611360565b005b3480156106f157600080fd5b5061070c60048036038101906107079190612afa565b611423565b6040516107199190613272565b60405180910390f35b34801561072e57600080fd5b5061074960048036038101906107449190612dc7565b611765565b005b34801561075757600080fd5b50610772600480360381019061076d9190612b23565b611777565b60405161077f9190613272565b60405180910390f35b34801561079457600080fd5b506107af60048036038101906107aa9190612ce2565b61180b565b005b3480156107bd57600080fd5b506107d860048036038101906107d39190612afa565b611830565b005b6000632a55205a60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610832576001905061083e565b61083b826118b4565b90505b919050565b606060008054610852906137fd565b80601f016020809104026020016040519081016040528092919081815260200182805461087e906137fd565b80156108cb5780601f106108a0576101008083540402835291602001916108cb565b820191906000526020600020905b8154815290600101906020018083116108ae57829003601f168201915b5050505050905090565b60006108e082611996565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061092682610c24565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610997576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098e9061348f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109b66119e1565b73ffffffffffffffffffffffffffffffffffffffff1614806109e557506109e4816109df6119e1565b611777565b5b610a24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1b906133cf565b60405180910390fd5b610a2e83836119e9565b505050565b610a3b611aa2565b80601060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000610a8b6008611b20565b905090565b610aa1610a9b6119e1565b82611b2e565b610ae0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad7906134ef565b60405180910390fd5b610aeb838383611bc3565b505050565b610af8611aa2565b80600b8190555050565b600080610b0d610eb1565b612710600d5485610b1e91906136a7565b610b289190613676565b915091509250929050565b610b3b611aa2565b80600d8190555050565b610b60838383604051806020016040528060008152506111d9565b505050565b600060011515601060009054906101000a900460ff1615151415610bd757601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050610bfd565b60001515601060009054906101000a900460ff1615151415610bfc5760019050610bfd565b5b919050565b610c0a611aa2565b80600c9080519060200190610c2092919061285e565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ccd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc49061346f565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3e9061336f565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d96611aa2565b610da06000611e2a565b565b610daa611aa2565b60005b8151811015610e6157600060126000848481518110610df5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610e5990613860565b915050610dad565b5050565b610e6d611aa2565b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610ee3611aa2565b662386f26fc1000081610ef691906136a7565b600a8190555050565b606060018054610f0e906137fd565b80601f0160208091040260200160405190810160405280929190818152602001828054610f3a906137fd565b8015610f875780601f10610f5c57610100808354040283529160200191610f87565b820191906000526020600020905b815481529060010190602001808311610f6a57829003601f168201915b5050505050905090565b610f99611aa2565b80601060006101000a81548160ff02191690831515021790555050565b610fbf33611423565b80610fcf5750610fce33610b65565b5b61100e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110059061344f565b60405180910390fd5b600f5461101a33610cd6565b826110259190613620565b1115611066576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105d906134cf565b60405180910390fd5b601060019054906101000a900460ff166110b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ac906134af565b60405180910390fd5b600e548111156110fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f1906133af565b60405180910390fd5b80600a5461110891906136a7565b34101561114a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111419061338f565b60405180910390fd5b611152610eb1565b73ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611197573d6000803e3d6000fd5b5060005b818110156111bf576111ac33611ef0565b80806111b790613860565b91505061119b565b5050565b6111d56111ce6119e1565b8383611f64565b5050565b6111ea6111e46119e1565b83611b2e565b611229576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611220906134ef565b60405180910390fd5b611235848484846120d1565b50505050565b611243611aa2565b80600e8190555050565b606061125882611996565b6000600660008481526020019081526020016000208054611278906137fd565b80601f01602080910402602001604051908101604052809291908181526020018280546112a4906137fd565b80156112f15780601f106112c6576101008083540402835291602001916112f1565b820191906000526020600020905b8154815290600101906020018083116112d457829003601f168201915b50505050509050600061130261212d565b905060008151141561131857819250505061135b565b60008251111561134d5780826040516020016113359291906131be565b6040516020818303038152906040529250505061135b565b611356846121bf565b925050505b919050565b611368611aa2565b60005b815181101561141f576001601260008484815181106113b3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061141790613860565b91505061136b565b5050565b6000601060009054906101000a900460ff1680156114eb57506000601060029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b815260040161149991906131e2565b60206040518083038186803b1580156114b157600080fd5b505afa1580156114c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114e99190612df0565b115b806115a057506000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b815260040161154e91906131e2565b60206040518083038186803b15801561156657600080fd5b505afa15801561157a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159e9190612df0565b115b156115ae5760019050611760565b601060009054906101000a900460ff16801561167557506000601060029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b815260040161162291906131e2565b60206040518083038186803b15801561163a57600080fd5b505afa15801561164e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116729190612df0565b11155b801561172c57506000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b81526004016116d991906131e2565b60206040518083038186803b1580156116f157600080fd5b505afa158015611705573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117299190612df0565b11155b1561173a5760009050611760565b60001515601060009054906101000a900460ff161515141561175f5760019050611760565b5b919050565b61176d611aa2565b80600f8190555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611813611aa2565b80601060016101000a81548160ff02191690831515021790555050565b611838611aa2565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156118a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189f906132cf565b60405180910390fd5b6118b181611e2a565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061197f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061198f575061198e82612227565b5b9050919050565b61199f81612291565b6119de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d59061346f565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611a5c83610c24565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611aaa6119e1565b73ffffffffffffffffffffffffffffffffffffffff16611ac8610eb1565b73ffffffffffffffffffffffffffffffffffffffff1614611b1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b159061342f565b60405180910390fd5b565b600081600001549050919050565b600080611b3a83610c24565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611b7c5750611b7b8185611777565b5b80611bba57508373ffffffffffffffffffffffffffffffffffffffff16611ba2846108d5565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611be382610c24565b73ffffffffffffffffffffffffffffffffffffffff1614611c39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c30906132ef565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ca9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca09061332f565b60405180910390fd5b611cb48383836122fd565b611cbf6000826119e9565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d0f9190613701565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d669190613620565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611e25838383612302565b505050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611efa6008612307565b600b54611f076008611b20565b1115611f48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3f9061340f565b60405180910390fd5b6000611f546008611b20565b9050611f60828261231d565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611fd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fca9061334f565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516120c49190613272565b60405180910390a3505050565b6120dc848484611bc3565b6120e8848484846124f7565b612127576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211e906132af565b60405180910390fd5b50505050565b6060600c805461213c906137fd565b80601f0160208091040260200160405190810160405280929190818152602001828054612168906137fd565b80156121b55780601f1061218a576101008083540402835291602001916121b5565b820191906000526020600020905b81548152906001019060200180831161219857829003601f168201915b5050505050905090565b60606121ca82611996565b60006121d461212d565b905060008151116121f4576040518060200160405280600081525061221f565b806121fe8461268e565b60405160200161220f9291906131be565b6040516020818303038152906040525b915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b505050565b505050565b6001816000016000828254019250508190555050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561238d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612384906133ef565b60405180910390fd5b61239681612291565b156123d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cd9061330f565b60405180910390fd5b6123e2600083836122fd565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124329190613620565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46124f360008383612302565b5050565b60006125188473ffffffffffffffffffffffffffffffffffffffff1661283b565b15612681578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026125416119e1565b8786866040518563ffffffff1660e01b815260040161256394939291906131fd565b602060405180830381600087803b15801561257d57600080fd5b505af19250505080156125ae57506040513d601f19601f820116820180604052508101906125ab9190612d34565b60015b612631573d80600081146125de576040519150601f19603f3d011682016040523d82523d6000602084013e6125e3565b606091505b50600081511415612629576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612620906132af565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612686565b600190505b949350505050565b606060008214156126d6576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612836565b600082905060005b600082146127085780806126f190613860565b915050600a826127019190613676565b91506126de565b60008167ffffffffffffffff81111561274a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561277c5781602001600182028036833780820191505090505b5090505b6000851461282f576001826127959190613701565b9150600a856127a491906138a9565b60306127b09190613620565b60f81b8183815181106127ec577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856128289190613676565b9450612780565b8093505050505b919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b82805461286a906137fd565b90600052602060002090601f01602090048101928261288c57600085556128d3565b82601f106128a557805160ff19168380011785556128d3565b828001600101855582156128d3579182015b828111156128d25782518255916020019190600101906128b7565b5b5090506128e091906128e4565b5090565b5b808211156128fd5760008160009055506001016128e5565b5090565b600061291461290f8461354f565b61352a565b9050808382526020820190508285602086028201111561293357600080fd5b60005b85811015612963578161294988826129e9565b845260208401935060208301925050600181019050612936565b5050509392505050565b600061298061297b8461357b565b61352a565b90508281526020810184848401111561299857600080fd5b6129a38482856137bb565b509392505050565b60006129be6129b9846135ac565b61352a565b9050828152602081018484840111156129d657600080fd5b6129e18482856137bb565b509392505050565b6000813590506129f881613e2e565b92915050565b600082601f830112612a0f57600080fd5b8135612a1f848260208601612901565b91505092915050565b600081359050612a3781613e45565b92915050565b600081359050612a4c81613e5c565b92915050565b600081519050612a6181613e5c565b92915050565b600082601f830112612a7857600080fd5b8135612a8884826020860161296d565b91505092915050565b600081359050612aa081613e73565b92915050565b600082601f830112612ab757600080fd5b8135612ac78482602086016129ab565b91505092915050565b600081359050612adf81613e8a565b92915050565b600081519050612af481613e8a565b92915050565b600060208284031215612b0c57600080fd5b6000612b1a848285016129e9565b91505092915050565b60008060408385031215612b3657600080fd5b6000612b44858286016129e9565b9250506020612b55858286016129e9565b9150509250929050565b600080600060608486031215612b7457600080fd5b6000612b82868287016129e9565b9350506020612b93868287016129e9565b9250506040612ba486828701612ad0565b9150509250925092565b60008060008060808587031215612bc457600080fd5b6000612bd2878288016129e9565b9450506020612be3878288016129e9565b9350506040612bf487828801612ad0565b925050606085013567ffffffffffffffff811115612c1157600080fd5b612c1d87828801612a67565b91505092959194509250565b60008060408385031215612c3c57600080fd5b6000612c4a858286016129e9565b9250506020612c5b85828601612a28565b9150509250929050565b60008060408385031215612c7857600080fd5b6000612c86858286016129e9565b9250506020612c9785828601612ad0565b9150509250929050565b600060208284031215612cb357600080fd5b600082013567ffffffffffffffff811115612ccd57600080fd5b612cd9848285016129fe565b91505092915050565b600060208284031215612cf457600080fd5b6000612d0284828501612a28565b91505092915050565b600060208284031215612d1d57600080fd5b6000612d2b84828501612a3d565b91505092915050565b600060208284031215612d4657600080fd5b6000612d5484828501612a52565b91505092915050565b600060208284031215612d6f57600080fd5b6000612d7d84828501612a91565b91505092915050565b600060208284031215612d9857600080fd5b600082013567ffffffffffffffff811115612db257600080fd5b612dbe84828501612aa6565b91505092915050565b600060208284031215612dd957600080fd5b6000612de784828501612ad0565b91505092915050565b600060208284031215612e0257600080fd5b6000612e1084828501612ae5565b91505092915050565b60008060408385031215612e2c57600080fd5b6000612e3a85828601612ad0565b9250506020612e4b85828601612ad0565b9150509250929050565b612e5e81613735565b82525050565b612e6d81613747565b82525050565b6000612e7e826135dd565b612e8881856135f3565b9350612e988185602086016137ca565b612ea181613996565b840191505092915050565b6000612eb7826135e8565b612ec18185613604565b9350612ed18185602086016137ca565b612eda81613996565b840191505092915050565b6000612ef0826135e8565b612efa8185613615565b9350612f0a8185602086016137ca565b80840191505092915050565b6000612f23603283613604565b9150612f2e826139a7565b604082019050919050565b6000612f46602683613604565b9150612f51826139f6565b604082019050919050565b6000612f69602583613604565b9150612f7482613a45565b604082019050919050565b6000612f8c601c83613604565b9150612f9782613a94565b602082019050919050565b6000612faf602483613604565b9150612fba82613abd565b604082019050919050565b6000612fd2601983613604565b9150612fdd82613b0c565b602082019050919050565b6000612ff5602983613604565b915061300082613b35565b604082019050919050565b6000613018601483613604565b915061302382613b84565b602082019050919050565b600061303b601e83613604565b915061304682613bad565b602082019050919050565b600061305e603e83613604565b915061306982613bd6565b604082019050919050565b6000613081602083613604565b915061308c82613c25565b602082019050919050565b60006130a4601c83613604565b91506130af82613c4e565b602082019050919050565b60006130c7602083613604565b91506130d282613c77565b602082019050919050565b60006130ea602783613604565b91506130f582613ca0565b604082019050919050565b600061310d601883613604565b915061311882613cef565b602082019050919050565b6000613130602183613604565b915061313b82613d18565b604082019050919050565b6000613153601683613604565b915061315e82613d67565b602082019050919050565b6000613176602f83613604565b915061318182613d90565b604082019050919050565b6000613199602e83613604565b91506131a482613ddf565b604082019050919050565b6131b8816137b1565b82525050565b60006131ca8285612ee5565b91506131d68284612ee5565b91508190509392505050565b60006020820190506131f76000830184612e55565b92915050565b60006080820190506132126000830187612e55565b61321f6020830186612e55565b61322c60408301856131af565b818103606083015261323e8184612e73565b905095945050505050565b600060408201905061325e6000830185612e55565b61326b60208301846131af565b9392505050565b60006020820190506132876000830184612e64565b92915050565b600060208201905081810360008301526132a78184612eac565b905092915050565b600060208201905081810360008301526132c881612f16565b9050919050565b600060208201905081810360008301526132e881612f39565b9050919050565b6000602082019050818103600083015261330881612f5c565b9050919050565b6000602082019050818103600083015261332881612f7f565b9050919050565b6000602082019050818103600083015261334881612fa2565b9050919050565b6000602082019050818103600083015261336881612fc5565b9050919050565b6000602082019050818103600083015261338881612fe8565b9050919050565b600060208201905081810360008301526133a88161300b565b9050919050565b600060208201905081810360008301526133c88161302e565b9050919050565b600060208201905081810360008301526133e881613051565b9050919050565b6000602082019050818103600083015261340881613074565b9050919050565b6000602082019050818103600083015261342881613097565b9050919050565b60006020820190508181036000830152613448816130ba565b9050919050565b60006020820190508181036000830152613468816130dd565b9050919050565b6000602082019050818103600083015261348881613100565b9050919050565b600060208201905081810360008301526134a881613123565b9050919050565b600060208201905081810360008301526134c881613146565b9050919050565b600060208201905081810360008301526134e881613169565b9050919050565b600060208201905081810360008301526135088161318c565b9050919050565b600060208201905061352460008301846131af565b92915050565b6000613534613545565b9050613540828261382f565b919050565b6000604051905090565b600067ffffffffffffffff82111561356a57613569613967565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561359657613595613967565b5b61359f82613996565b9050602081019050919050565b600067ffffffffffffffff8211156135c7576135c6613967565b5b6135d082613996565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061362b826137b1565b9150613636836137b1565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561366b5761366a6138da565b5b828201905092915050565b6000613681826137b1565b915061368c836137b1565b92508261369c5761369b613909565b5b828204905092915050565b60006136b2826137b1565b91506136bd836137b1565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156136f6576136f56138da565b5b828202905092915050565b600061370c826137b1565b9150613717836137b1565b92508282101561372a576137296138da565b5b828203905092915050565b600061374082613791565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061378a82613735565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156137e85780820151818401526020810190506137cd565b838111156137f7576000848401525b50505050565b6000600282049050600182168061381557607f821691505b6020821081141561382957613828613938565b5b50919050565b61383882613996565b810181811067ffffffffffffffff8211171561385757613856613967565b5b80604052505050565b600061386b826137b1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561389e5761389d6138da565b5b600182019050919050565b60006138b4826137b1565b91506138bf836137b1565b9250826138cf576138ce613909565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f7567682046544d2073656e742e000000000000000000000000600082015250565b7f43616e6e6f74206d696e742074686174206d616e79206174206f6e63652e0000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f50726f6a6563742069732066696e6973686564206d696e74696e672e00000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f6e6f742077686974656c69737465642c207761697420756e74696c207075626c60008201527f69632073616c6500000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4d696e74696e67206973206e6f74206163746976652e00000000000000000000600082015250565b7f796f75206d696e7465642f617265206d696e74696e67206d6f7265207468616e60008201527f20746865206d617820616d6f756e740000000000000000000000000000000000602082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b613e3781613735565b8114613e4257600080fd5b50565b613e4e81613747565b8114613e5957600080fd5b50565b613e6581613753565b8114613e7057600080fd5b50565b613e7c8161377f565b8114613e8757600080fd5b50565b613e93816137b1565b8114613e9e57600080fd5b5056fea2646970667358221220289d4962990ca3ca6d2c6664287153e544ea3c7f9b87880faf4b4ef5dbecbb7e64736f6c63430008010033697066733a2f2f516d634e626a70513756657045474b74723754634c5a6270386f455365366e50657848364d51355754734858336d2f

Deployed ByteCode Sourcemap

48289:4697:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52751:231;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22176:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23689:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23206:417;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51276:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52069:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24389:336;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50791:85;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52536:209;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;51058:91;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24796:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49781:210;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49997:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21887:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21618:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39458:103;;;;;;;;;;;;;:::i;:::-;;49580:197;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51367:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38810;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50676:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22345:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50584:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51460:603;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23932:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25052:323;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50880:83;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34845:624;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49374:202;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50112:378;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50967:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24158:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50494:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39716:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52751:231;52844:4;48699:10;52876:21;;52861:36;;;:11;:36;;;;52857:70;;;52915:4;52908:11;;;;52857:70;52940:36;52964:11;52940:23;:36::i;:::-;52933:43;;52751:231;;;;:::o;22176:100::-;22230:13;22263:5;22256:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22176:100;:::o;23689:171::-;23765:7;23785:23;23800:7;23785:14;:23::i;:::-;23828:15;:24;23844:7;23828:24;;;;;;;;;;;;;;;;;;;;;23821:31;;23689:171;;;:::o;23206:417::-;23287:13;23303:23;23318:7;23303:14;:23::i;:::-;23287:39;;23351:5;23345:11;;:2;:11;;;;23337:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23445:5;23429:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;23454:37;23471:5;23478:12;:10;:12::i;:::-;23454:16;:37::i;:::-;23429:62;23407:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;23594:21;23603:2;23607:7;23594:8;:21::i;:::-;23206:417;;;:::o;51276:87::-;38696:13;:11;:13::i;:::-;51355:2:::1;51343:9;;:14;;;;;;;;;;;;;;;;;;51276:87:::0;:::o;52069:92::-;52113:7;52136:19;:9;:17;:19::i;:::-;52129:26;;52069:92;:::o;24389:336::-;24584:41;24603:12;:10;:12::i;:::-;24617:7;24584:18;:41::i;:::-;24576:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;24689:28;24699:4;24705:2;24709:7;24689:9;:28::i;:::-;24389:336;;;:::o;50791:85::-;38696:13;:11;:13::i;:::-;50867:3:::1;50852:12;:18;;;;50791:85:::0;:::o;52536:209::-;52634:16;52652:21;52690:7;:5;:7::i;:::-;52732:5;52714:14;;52701:10;:27;;;;:::i;:::-;52700:37;;;;:::i;:::-;52682:57;;;;52536:209;;;;;:::o;51058:91::-;38696:13;:11;:13::i;:::-;51136:7:::1;51119:14;:24;;;;51058:91:::0;:::o;24796:185::-;24934:39;24951:4;24957:2;24961:7;24934:39;;;;;;;;;;;;:16;:39::i;:::-;24796:185;;;:::o;49781:210::-;49850:4;49883;49867:20;;:12;;;;;;;;;;;:20;;;49863:123;;;49895:20;:41;49916:19;49895:41;;;;;;;;;;;;;;;;;;;;;;;;;49888:48;;;;49863:123;49966:5;49952:19;;:12;;;;;;;;;;;:19;;;49948:38;;;49980:4;49973:11;;;;49948:38;49781:210;;;;:::o;49997:111::-;38696:13;:11;:13::i;:::-;50088:14:::1;50071;:31;;;;;;;;;;;;:::i;:::-;;49997:111:::0;:::o;21887:222::-;21959:7;21979:13;21995:7;:16;22003:7;21995:16;;;;;;;;;;;;;;;;;;;;;21979:32;;22047:1;22030:19;;:5;:19;;;;22022:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;22096:5;22089:12;;;21887:222;;;:::o;21618:207::-;21690:7;21735:1;21718:19;;:5;:19;;;;21710:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21801:9;:16;21811:5;21801:16;;;;;;;;;;;;;;;;21794:23;;21618:207;;;:::o;39458:103::-;38696:13;:11;:13::i;:::-;39523:30:::1;39550:1;39523:18;:30::i;:::-;39458:103::o:0;49580:197::-;38696:13;:11;:13::i;:::-;49669:6:::1;49665:107;49681:16;:23;49678:1;:26;49665:107;;;49761:5;49717:20;:41;49738:16;49755:1;49738:19;;;;;;;;;;;;;;;;;;;;;;49717:41;;;;;;;;;;;;;;;;:49;;;;;;;;;;;;;;;;;;49706:3;;;;;:::i;:::-;;;;49665:107;;;;49580:197:::0;:::o;51367:87::-;38696:13;:11;:13::i;:::-;51446:2:::1;51434:9;;:14;;;;;;;;;;;;;;;;;;51367:87:::0;:::o;38810:::-;38856:7;38883:6;;;;;;;;;;;38876:13;;38810:87;:::o;50676:111::-;38696:13;:11;:13::i;:::-;50764:17:::1;50749:12;:32;;;;:::i;:::-;50740:6;:41;;;;50676:111:::0;:::o;22345:104::-;22401:13;22434:7;22427:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22345:104;:::o;50584:88::-;38696:13;:11;:13::i;:::-;50660:6:::1;50645:12;;:21;;;;;;;;;;;;;;;;;;50584:88:::0;:::o;51460:603::-;51522:20;51531:10;51522:8;:20::i;:::-;:46;;;;51546:22;51557:10;51546;:22::i;:::-;51522:46;51514:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;51661:13;;51636:21;51646:10;51636:9;:21::i;:::-;51627:8;:30;;;;:::i;:::-;:47;;51619:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;51741:11;;;;;;;;;;;51733:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;51806:13;;51794:8;:25;;51786:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51892:8;51883:6;;:17;;;;:::i;:::-;51869:9;:32;;51861:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;51945:7;:5;:7::i;:::-;51937:25;;:36;51963:9;51937:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51986:6;51982:76;52002:8;51998:1;:12;51982:76;;;52026:24;52039:10;52026:12;:24::i;:::-;52012:3;;;;;:::i;:::-;;;;51982:76;;;;51460:603;:::o;23932:155::-;24027:52;24046:12;:10;:12::i;:::-;24060:8;24070;24027:18;:52::i;:::-;23932:155;;:::o;25052:323::-;25226:41;25245:12;:10;:12::i;:::-;25259:7;25226:18;:41::i;:::-;25218:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;25329:38;25343:4;25349:2;25353:7;25362:4;25329:13;:38::i;:::-;25052:323;;;;:::o;50880:83::-;38696:13;:11;:13::i;:::-;50954:3:::1;50938:13;:19;;;;50880:83:::0;:::o;34845:624::-;34918:13;34944:23;34959:7;34944:14;:23::i;:::-;34980;35006:10;:19;35017:7;35006:19;;;;;;;;;;;34980:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35036:18;35057:10;:8;:10::i;:::-;35036:31;;35165:1;35149:4;35143:18;:23;35139:72;;;35190:9;35183:16;;;;;;35139:72;35341:1;35321:9;35315:23;:27;35311:108;;;35390:4;35396:9;35373:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;35359:48;;;;;;35311:108;35438:23;35453:7;35438:14;:23::i;:::-;35431:30;;;;34845:624;;;;:::o;49374:202::-;38696:13;:11;:13::i;:::-;49463:6:::1;49459:112;49475:19;:26;49472:1;:29;49459:112;;;49561:4;49514:20;:44;49535:19;49555:1;49535:22;;;;;;;;;;;;;;;;;;;;;;49514:44;;;;;;;;;;;;;;;;:51;;;;;;;;;;;;;;;;;;49503:3;;;;;:::i;:::-;;;;49459:112;;;;49374:202:::0;:::o;50112:378::-;50167:12;50190;;;;;;;;;;;:45;;;;;50234:1;50206:9;;;;;;;;;;;:19;;;50226:6;50206:27;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:29;50190:45;:78;;;;50267:1;50239:9;;;;;;;;;;;:19;;;50259:6;50239:27;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:29;50190:78;50187:298;;;50280:4;50270:14;;50286;;50187:298;50317:12;;;;;;;;;;;:48;;;;;50363:1;50335:9;;;;;;;;;;;:19;;;50355:6;50335:27;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:29;50333:32;50317:48;:84;;;;;50399:1;50371:9;;;;;;;;;;;:19;;;50391:6;50371:27;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:29;50369:32;50317:84;50313:172;;;50413:5;50403:15;;50420:14;;50313:172;50465:5;50451:19;;:12;;;;;;;;;;;:19;;;50447:38;;;50479:4;50472:11;;;;50447:38;50112:378;;;;:::o;50967:87::-;38696:13;:11;:13::i;:::-;51045:3:::1;51029:13;:19;;;;50967:87:::0;:::o;24158:164::-;24255:4;24279:18;:25;24298:5;24279:25;;;;;;;;;;;;;;;:35;24305:8;24279:35;;;;;;;;;;;;;;;;;;;;;;;;;24272:42;;24158:164;;;;:::o;50494:86::-;38696:13;:11;:13::i;:::-;50568:6:::1;50554:11;;:20;;;;;;;;;;;;;;;;;;50494:86:::0;:::o;39716:201::-;38696:13;:11;:13::i;:::-;39825:1:::1;39805:22;;:8;:22;;;;39797:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;39881:28;39900:8;39881:18;:28::i;:::-;39716:201:::0;:::o;21249:305::-;21351:4;21403:25;21388:40;;;:11;:40;;;;:105;;;;21460:33;21445:48;;;:11;:48;;;;21388:105;:158;;;;21510:36;21534:11;21510:23;:36::i;:::-;21388:158;21368:178;;21249:305;;;:::o;31664:135::-;31746:16;31754:7;31746;:16::i;:::-;31738:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;31664:135;:::o;16386:98::-;16439:7;16466:10;16459:17;;16386:98;:::o;30943:174::-;31045:2;31018:15;:24;31034:7;31018:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;31101:7;31097:2;31063:46;;31072:23;31087:7;31072:14;:23::i;:::-;31063:46;;;;;;;;;;;;30943:174;;:::o;38975:132::-;39050:12;:10;:12::i;:::-;39039:23;;:7;:5;:7::i;:::-;:23;;;39031:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38975:132::o;37068:114::-;37133:7;37160;:14;;;37153:21;;37068:114;;;:::o;27176:264::-;27269:4;27286:13;27302:23;27317:7;27302:14;:23::i;:::-;27286:39;;27355:5;27344:16;;:7;:16;;;:52;;;;27364:32;27381:5;27388:7;27364:16;:32::i;:::-;27344:52;:87;;;;27424:7;27400:31;;:20;27412:7;27400:11;:20::i;:::-;:31;;;27344:87;27336:96;;;27176:264;;;;:::o;30199:625::-;30358:4;30331:31;;:23;30346:7;30331:14;:23::i;:::-;:31;;;30323:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;30437:1;30423:16;;:2;:16;;;;30415:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30493:39;30514:4;30520:2;30524:7;30493:20;:39::i;:::-;30597:29;30614:1;30618:7;30597:8;:29::i;:::-;30658:1;30639:9;:15;30649:4;30639:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30687:1;30670:9;:13;30680:2;30670:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30718:2;30699:7;:16;30707:7;30699:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30757:7;30753:2;30738:27;;30747:4;30738:27;;;;;;;;;;;;30778:38;30798:4;30804:2;30808:7;30778:19;:38::i;:::-;30199:625;;;:::o;40077:191::-;40151:16;40170:6;;;;;;;;;;;40151:25;;40196:8;40187:6;;:17;;;;;;;;;;;;;;;;;;40251:8;40220:40;;40241:8;40220:40;;;;;;;;;;;;40077:191;;:::o;52167:248::-;52223:21;:9;:19;:21::i;:::-;52282:12;;52259:19;:9;:17;:19::i;:::-;:35;;52251:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;52336:17;52356:19;:9;:17;:19::i;:::-;52336:39;;52382:27;52388:9;52399;52382:5;:27::i;:::-;52167:248;;:::o;31260:315::-;31415:8;31406:17;;:5;:17;;;;31398:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;31502:8;31464:18;:25;31483:5;31464:25;;;;;;;;;;;;;;;:35;31490:8;31464:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;31548:8;31526:41;;31541:5;31526:41;;;31558:8;31526:41;;;;;;:::i;:::-;;;;;;;;31260:315;;;:::o;26256:313::-;26412:28;26422:4;26428:2;26432:7;26412:9;:28::i;:::-;26459:47;26482:4;26488:2;26492:7;26501:4;26459:22;:47::i;:::-;26451:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;26256:313;;;;:::o;52421:109::-;52481:13;52510:14;52503:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52421:109;:::o;22520:281::-;22593:13;22619:23;22634:7;22619:14;:23::i;:::-;22655:21;22679:10;:8;:10::i;:::-;22655:34;;22731:1;22713:7;22707:21;:25;:86;;;;;;;;;;;;;;;;;22759:7;22768:18;:7;:16;:18::i;:::-;22742:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22707:86;22700:93;;;22520:281;;;:::o;19781:157::-;19866:4;19905:25;19890:40;;;:11;:40;;;;19883:47;;19781:157;;;:::o;26882:127::-;26947:4;26999:1;26971:30;;:7;:16;26979:7;26971:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26964:37;;26882:127;;;:::o;33788:126::-;;;;:::o;34299:125::-;;;;:::o;37190:127::-;37297:1;37279:7;:14;;;:19;;;;;;;;;;;37190:127;:::o;28774:439::-;28868:1;28854:16;;:2;:16;;;;28846:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28927:16;28935:7;28927;:16::i;:::-;28926:17;28918:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28989:45;29018:1;29022:2;29026:7;28989:20;:45::i;:::-;29064:1;29047:9;:13;29057:2;29047:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29095:2;29076:7;:16;29084:7;29076:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29140:7;29136:2;29115:33;;29132:1;29115:33;;;;;;;;;;;;29161:44;29189:1;29193:2;29197:7;29161:19;:44::i;:::-;28774:439;;:::o;32363:853::-;32517:4;32538:15;:2;:13;;;:15::i;:::-;32534:675;;;32590:2;32574:36;;;32611:12;:10;:12::i;:::-;32625:4;32631:7;32640:4;32574:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;32570:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32832:1;32815:6;:13;:18;32811:328;;;32858:60;;;;;;;;;;:::i;:::-;;;;;;;;32811:328;33089:6;33083:13;33074:6;33070:2;33066:15;33059:38;32570:584;32706:41;;;32696:51;;;:6;:51;;;;32689:58;;;;;32534:675;33193:4;33186:11;;32363:853;;;;;;;:::o;16947:723::-;17003:13;17233:1;17224:5;:10;17220:53;;;17251:10;;;;;;;;;;;;;;;;;;;;;17220:53;17283:12;17298:5;17283:20;;17314:14;17339:78;17354:1;17346:4;:9;17339:78;;17372:8;;;;;:::i;:::-;;;;17403:2;17395:10;;;;;:::i;:::-;;;17339:78;;;17427:19;17459:6;17449:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17427:39;;17477:154;17493:1;17484:5;:10;17477:154;;17521:1;17511:11;;;;;:::i;:::-;;;17588:2;17580:5;:10;;;;:::i;:::-;17567:2;:24;;;;:::i;:::-;17554:39;;17537:6;17544;17537:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;17617:2;17608:11;;;;;:::i;:::-;;;17477:154;;;17655:6;17641:21;;;;;16947:723;;;;:::o;8470:326::-;8530:4;8787:1;8765:7;:19;;;:23;8758:30;;8470:326;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:623:1:-;;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;274:6;267:5;260:21;300:4;293:5;289:16;282:23;;325:6;375:3;367:4;359:6;355:17;350:3;346:27;343:36;340:2;;;392:1;389;382:12;340:2;420:1;405:236;430:6;427:1;424:13;405:236;;;497:3;525:37;558:3;546:10;525:37;:::i;:::-;520:3;513:50;592:4;587:3;583:14;576:21;;626:4;621:3;617:14;610:21;;465:176;452:1;449;445:9;440:14;;405:236;;;409:14;126:521;;;;;;;:::o;653:343::-;;755:65;771:48;812:6;771:48;:::i;:::-;755:65;:::i;:::-;746:74;;843:6;836:5;829:21;881:4;874:5;870:16;919:3;910:6;905:3;901:16;898:25;895:2;;;936:1;933;926:12;895:2;949:41;983:6;978:3;973;949:41;:::i;:::-;736:260;;;;;;:::o;1002:345::-;;1105:66;1121:49;1163:6;1121:49;:::i;:::-;1105:66;:::i;:::-;1096:75;;1194:6;1187:5;1180:21;1232:4;1225:5;1221:16;1270:3;1261:6;1256:3;1252:16;1249:25;1246:2;;;1287:1;1284;1277:12;1246:2;1300:41;1334:6;1329:3;1324;1300:41;:::i;:::-;1086:261;;;;;;:::o;1353:139::-;;1437:6;1424:20;1415:29;;1453:33;1480:5;1453:33;:::i;:::-;1405:87;;;;:::o;1515:303::-;;1635:3;1628:4;1620:6;1616:17;1612:27;1602:2;;1653:1;1650;1643:12;1602:2;1693:6;1680:20;1718:94;1808:3;1800:6;1793:4;1785:6;1781:17;1718:94;:::i;:::-;1709:103;;1592:226;;;;;:::o;1824:133::-;;1905:6;1892:20;1883:29;;1921:30;1945:5;1921:30;:::i;:::-;1873:84;;;;:::o;1963:137::-;;2046:6;2033:20;2024:29;;2062:32;2088:5;2062:32;:::i;:::-;2014:86;;;;:::o;2106:141::-;;2193:6;2187:13;2178:22;;2209:32;2235:5;2209:32;:::i;:::-;2168:79;;;;:::o;2266:271::-;;2370:3;2363:4;2355:6;2351:17;2347:27;2337:2;;2388:1;2385;2378:12;2337:2;2428:6;2415:20;2453:78;2527:3;2519:6;2512:4;2504:6;2500:17;2453:78;:::i;:::-;2444:87;;2327:210;;;;;:::o;2543:189::-;;2652:6;2639:20;2630:29;;2668:58;2720:5;2668:58;:::i;:::-;2620:112;;;;:::o;2752:273::-;;2857:3;2850:4;2842:6;2838:17;2834:27;2824:2;;2875:1;2872;2865:12;2824:2;2915:6;2902:20;2940:79;3015:3;3007:6;3000:4;2992:6;2988:17;2940:79;:::i;:::-;2931:88;;2814:211;;;;;:::o;3031:139::-;;3115:6;3102:20;3093:29;;3131:33;3158:5;3131:33;:::i;:::-;3083:87;;;;:::o;3176:143::-;;3264:6;3258:13;3249:22;;3280:33;3307:5;3280:33;:::i;:::-;3239:80;;;;:::o;3325:262::-;;3433:2;3421:9;3412:7;3408:23;3404:32;3401:2;;;3449:1;3446;3439:12;3401:2;3492:1;3517:53;3562:7;3553:6;3542:9;3538:22;3517:53;:::i;:::-;3507:63;;3463:117;3391:196;;;;:::o;3593:407::-;;;3718:2;3706:9;3697:7;3693:23;3689:32;3686:2;;;3734:1;3731;3724:12;3686:2;3777:1;3802:53;3847:7;3838:6;3827:9;3823:22;3802:53;:::i;:::-;3792:63;;3748:117;3904:2;3930:53;3975:7;3966:6;3955:9;3951:22;3930:53;:::i;:::-;3920:63;;3875:118;3676:324;;;;;:::o;4006:552::-;;;;4148:2;4136:9;4127:7;4123:23;4119:32;4116:2;;;4164:1;4161;4154:12;4116:2;4207:1;4232:53;4277:7;4268:6;4257:9;4253:22;4232:53;:::i;:::-;4222:63;;4178:117;4334:2;4360:53;4405:7;4396:6;4385:9;4381:22;4360:53;:::i;:::-;4350:63;;4305:118;4462:2;4488:53;4533:7;4524:6;4513:9;4509:22;4488:53;:::i;:::-;4478:63;;4433:118;4106:452;;;;;:::o;4564:809::-;;;;;4732:3;4720:9;4711:7;4707:23;4703:33;4700:2;;;4749:1;4746;4739:12;4700:2;4792:1;4817:53;4862:7;4853:6;4842:9;4838:22;4817:53;:::i;:::-;4807:63;;4763:117;4919:2;4945:53;4990:7;4981:6;4970:9;4966:22;4945:53;:::i;:::-;4935:63;;4890:118;5047:2;5073:53;5118:7;5109:6;5098:9;5094:22;5073:53;:::i;:::-;5063:63;;5018:118;5203:2;5192:9;5188:18;5175:32;5234:18;5226:6;5223:30;5220:2;;;5266:1;5263;5256:12;5220:2;5294:62;5348:7;5339:6;5328:9;5324:22;5294:62;:::i;:::-;5284:72;;5146:220;4690:683;;;;;;;:::o;5379:401::-;;;5501:2;5489:9;5480:7;5476:23;5472:32;5469:2;;;5517:1;5514;5507:12;5469:2;5560:1;5585:53;5630:7;5621:6;5610:9;5606:22;5585:53;:::i;:::-;5575:63;;5531:117;5687:2;5713:50;5755:7;5746:6;5735:9;5731:22;5713:50;:::i;:::-;5703:60;;5658:115;5459:321;;;;;:::o;5786:407::-;;;5911:2;5899:9;5890:7;5886:23;5882:32;5879:2;;;5927:1;5924;5917:12;5879:2;5970:1;5995:53;6040:7;6031:6;6020:9;6016:22;5995:53;:::i;:::-;5985:63;;5941:117;6097:2;6123:53;6168:7;6159:6;6148:9;6144:22;6123:53;:::i;:::-;6113:63;;6068:118;5869:324;;;;;:::o;6199:405::-;;6332:2;6320:9;6311:7;6307:23;6303:32;6300:2;;;6348:1;6345;6338:12;6300:2;6419:1;6408:9;6404:17;6391:31;6449:18;6441:6;6438:30;6435:2;;;6481:1;6478;6471:12;6435:2;6509:78;6579:7;6570:6;6559:9;6555:22;6509:78;:::i;:::-;6499:88;;6362:235;6290:314;;;;:::o;6610:256::-;;6715:2;6703:9;6694:7;6690:23;6686:32;6683:2;;;6731:1;6728;6721:12;6683:2;6774:1;6799:50;6841:7;6832:6;6821:9;6817:22;6799:50;:::i;:::-;6789:60;;6745:114;6673:193;;;;:::o;6872:260::-;;6979:2;6967:9;6958:7;6954:23;6950:32;6947:2;;;6995:1;6992;6985:12;6947:2;7038:1;7063:52;7107:7;7098:6;7087:9;7083:22;7063:52;:::i;:::-;7053:62;;7009:116;6937:195;;;;:::o;7138:282::-;;7256:2;7244:9;7235:7;7231:23;7227:32;7224:2;;;7272:1;7269;7262:12;7224:2;7315:1;7340:63;7395:7;7386:6;7375:9;7371:22;7340:63;:::i;:::-;7330:73;;7286:127;7214:206;;;;:::o;7426:312::-;;7559:2;7547:9;7538:7;7534:23;7530:32;7527:2;;;7575:1;7572;7565:12;7527:2;7618:1;7643:78;7713:7;7704:6;7693:9;7689:22;7643:78;:::i;:::-;7633:88;;7589:142;7517:221;;;;:::o;7744:375::-;;7862:2;7850:9;7841:7;7837:23;7833:32;7830:2;;;7878:1;7875;7868:12;7830:2;7949:1;7938:9;7934:17;7921:31;7979:18;7971:6;7968:30;7965:2;;;8011:1;8008;8001:12;7965:2;8039:63;8094:7;8085:6;8074:9;8070:22;8039:63;:::i;:::-;8029:73;;7892:220;7820:299;;;;:::o;8125:262::-;;8233:2;8221:9;8212:7;8208:23;8204:32;8201:2;;;8249:1;8246;8239:12;8201:2;8292:1;8317:53;8362:7;8353:6;8342:9;8338:22;8317:53;:::i;:::-;8307:63;;8263:117;8191:196;;;;:::o;8393:284::-;;8512:2;8500:9;8491:7;8487:23;8483:32;8480:2;;;8528:1;8525;8518:12;8480:2;8571:1;8596:64;8652:7;8643:6;8632:9;8628:22;8596:64;:::i;:::-;8586:74;;8542:128;8470:207;;;;:::o;8683:407::-;;;8808:2;8796:9;8787:7;8783:23;8779:32;8776:2;;;8824:1;8821;8814:12;8776:2;8867:1;8892:53;8937:7;8928:6;8917:9;8913:22;8892:53;:::i;:::-;8882:63;;8838:117;8994:2;9020:53;9065:7;9056:6;9045:9;9041:22;9020:53;:::i;:::-;9010:63;;8965:118;8766:324;;;;;:::o;9096:118::-;9183:24;9201:5;9183:24;:::i;:::-;9178:3;9171:37;9161:53;;:::o;9220:109::-;9301:21;9316:5;9301:21;:::i;:::-;9296:3;9289:34;9279:50;;:::o;9335:360::-;;9449:38;9481:5;9449:38;:::i;:::-;9503:70;9566:6;9561:3;9503:70;:::i;:::-;9496:77;;9582:52;9627:6;9622:3;9615:4;9608:5;9604:16;9582:52;:::i;:::-;9659:29;9681:6;9659:29;:::i;:::-;9654:3;9650:39;9643:46;;9425:270;;;;;:::o;9701:364::-;;9817:39;9850:5;9817:39;:::i;:::-;9872:71;9936:6;9931:3;9872:71;:::i;:::-;9865:78;;9952:52;9997:6;9992:3;9985:4;9978:5;9974:16;9952:52;:::i;:::-;10029:29;10051:6;10029:29;:::i;:::-;10024:3;10020:39;10013:46;;9793:272;;;;;:::o;10071:377::-;;10205:39;10238:5;10205:39;:::i;:::-;10260:89;10342:6;10337:3;10260:89;:::i;:::-;10253:96;;10358:52;10403:6;10398:3;10391:4;10384:5;10380:16;10358:52;:::i;:::-;10435:6;10430:3;10426:16;10419:23;;10181:267;;;;;:::o;10454:366::-;;10617:67;10681:2;10676:3;10617:67;:::i;:::-;10610:74;;10693:93;10782:3;10693:93;:::i;:::-;10811:2;10806:3;10802:12;10795:19;;10600:220;;;:::o;10826:366::-;;10989:67;11053:2;11048:3;10989:67;:::i;:::-;10982:74;;11065:93;11154:3;11065:93;:::i;:::-;11183:2;11178:3;11174:12;11167:19;;10972:220;;;:::o;11198:366::-;;11361:67;11425:2;11420:3;11361:67;:::i;:::-;11354:74;;11437:93;11526:3;11437:93;:::i;:::-;11555:2;11550:3;11546:12;11539:19;;11344:220;;;:::o;11570:366::-;;11733:67;11797:2;11792:3;11733:67;:::i;:::-;11726:74;;11809:93;11898:3;11809:93;:::i;:::-;11927:2;11922:3;11918:12;11911:19;;11716:220;;;:::o;11942:366::-;;12105:67;12169:2;12164:3;12105:67;:::i;:::-;12098:74;;12181:93;12270:3;12181:93;:::i;:::-;12299:2;12294:3;12290:12;12283:19;;12088:220;;;:::o;12314:366::-;;12477:67;12541:2;12536:3;12477:67;:::i;:::-;12470:74;;12553:93;12642:3;12553:93;:::i;:::-;12671:2;12666:3;12662:12;12655:19;;12460:220;;;:::o;12686:366::-;;12849:67;12913:2;12908:3;12849:67;:::i;:::-;12842:74;;12925:93;13014:3;12925:93;:::i;:::-;13043:2;13038:3;13034:12;13027:19;;12832:220;;;:::o;13058:366::-;;13221:67;13285:2;13280:3;13221:67;:::i;:::-;13214:74;;13297:93;13386:3;13297:93;:::i;:::-;13415:2;13410:3;13406:12;13399:19;;13204:220;;;:::o;13430:366::-;;13593:67;13657:2;13652:3;13593:67;:::i;:::-;13586:74;;13669:93;13758:3;13669:93;:::i;:::-;13787:2;13782:3;13778:12;13771:19;;13576:220;;;:::o;13802:366::-;;13965:67;14029:2;14024:3;13965:67;:::i;:::-;13958:74;;14041:93;14130:3;14041:93;:::i;:::-;14159:2;14154:3;14150:12;14143:19;;13948:220;;;:::o;14174:366::-;;14337:67;14401:2;14396:3;14337:67;:::i;:::-;14330:74;;14413:93;14502:3;14413:93;:::i;:::-;14531:2;14526:3;14522:12;14515:19;;14320:220;;;:::o;14546:366::-;;14709:67;14773:2;14768:3;14709:67;:::i;:::-;14702:74;;14785:93;14874:3;14785:93;:::i;:::-;14903:2;14898:3;14894:12;14887:19;;14692:220;;;:::o;14918:366::-;;15081:67;15145:2;15140:3;15081:67;:::i;:::-;15074:74;;15157:93;15246:3;15157:93;:::i;:::-;15275:2;15270:3;15266:12;15259:19;;15064:220;;;:::o;15290:366::-;;15453:67;15517:2;15512:3;15453:67;:::i;:::-;15446:74;;15529:93;15618:3;15529:93;:::i;:::-;15647:2;15642:3;15638:12;15631:19;;15436:220;;;:::o;15662:366::-;;15825:67;15889:2;15884:3;15825:67;:::i;:::-;15818:74;;15901:93;15990:3;15901:93;:::i;:::-;16019:2;16014:3;16010:12;16003:19;;15808:220;;;:::o;16034:366::-;;16197:67;16261:2;16256:3;16197:67;:::i;:::-;16190:74;;16273:93;16362:3;16273:93;:::i;:::-;16391:2;16386:3;16382:12;16375:19;;16180:220;;;:::o;16406:366::-;;16569:67;16633:2;16628:3;16569:67;:::i;:::-;16562:74;;16645:93;16734:3;16645:93;:::i;:::-;16763:2;16758:3;16754:12;16747:19;;16552:220;;;:::o;16778:366::-;;16941:67;17005:2;17000:3;16941:67;:::i;:::-;16934:74;;17017:93;17106:3;17017:93;:::i;:::-;17135:2;17130:3;17126:12;17119:19;;16924:220;;;:::o;17150:366::-;;17313:67;17377:2;17372:3;17313:67;:::i;:::-;17306:74;;17389:93;17478:3;17389:93;:::i;:::-;17507:2;17502:3;17498:12;17491:19;;17296:220;;;:::o;17522:118::-;17609:24;17627:5;17609:24;:::i;:::-;17604:3;17597:37;17587:53;;:::o;17646:435::-;;17848:95;17939:3;17930:6;17848:95;:::i;:::-;17841:102;;17960:95;18051:3;18042:6;17960:95;:::i;:::-;17953:102;;18072:3;18065:10;;17830:251;;;;;:::o;18087:222::-;;18218:2;18207:9;18203:18;18195:26;;18231:71;18299:1;18288:9;18284:17;18275:6;18231:71;:::i;:::-;18185:124;;;;:::o;18315:640::-;;18548:3;18537:9;18533:19;18525:27;;18562:71;18630:1;18619:9;18615:17;18606:6;18562:71;:::i;:::-;18643:72;18711:2;18700:9;18696:18;18687:6;18643:72;:::i;:::-;18725;18793:2;18782:9;18778:18;18769:6;18725:72;:::i;:::-;18844:9;18838:4;18834:20;18829:2;18818:9;18814:18;18807:48;18872:76;18943:4;18934:6;18872:76;:::i;:::-;18864:84;;18515:440;;;;;;;:::o;18961:332::-;;19120:2;19109:9;19105:18;19097:26;;19133:71;19201:1;19190:9;19186:17;19177:6;19133:71;:::i;:::-;19214:72;19282:2;19271:9;19267:18;19258:6;19214:72;:::i;:::-;19087:206;;;;;:::o;19299:210::-;;19424:2;19413:9;19409:18;19401:26;;19437:65;19499:1;19488:9;19484:17;19475:6;19437:65;:::i;:::-;19391:118;;;;:::o;19515:313::-;;19666:2;19655:9;19651:18;19643:26;;19715:9;19709:4;19705:20;19701:1;19690:9;19686:17;19679:47;19743:78;19816:4;19807:6;19743:78;:::i;:::-;19735:86;;19633:195;;;;:::o;19834:419::-;;20038:2;20027:9;20023:18;20015:26;;20087:9;20081:4;20077:20;20073:1;20062:9;20058:17;20051:47;20115:131;20241:4;20115:131;:::i;:::-;20107:139;;20005:248;;;:::o;20259:419::-;;20463:2;20452:9;20448:18;20440:26;;20512:9;20506:4;20502:20;20498:1;20487:9;20483:17;20476:47;20540:131;20666:4;20540:131;:::i;:::-;20532:139;;20430:248;;;:::o;20684:419::-;;20888:2;20877:9;20873:18;20865:26;;20937:9;20931:4;20927:20;20923:1;20912:9;20908:17;20901:47;20965:131;21091:4;20965:131;:::i;:::-;20957:139;;20855:248;;;:::o;21109:419::-;;21313:2;21302:9;21298:18;21290:26;;21362:9;21356:4;21352:20;21348:1;21337:9;21333:17;21326:47;21390:131;21516:4;21390:131;:::i;:::-;21382:139;;21280:248;;;:::o;21534:419::-;;21738:2;21727:9;21723:18;21715:26;;21787:9;21781:4;21777:20;21773:1;21762:9;21758:17;21751:47;21815:131;21941:4;21815:131;:::i;:::-;21807:139;;21705:248;;;:::o;21959:419::-;;22163:2;22152:9;22148:18;22140:26;;22212:9;22206:4;22202:20;22198:1;22187:9;22183:17;22176:47;22240:131;22366:4;22240:131;:::i;:::-;22232:139;;22130:248;;;:::o;22384:419::-;;22588:2;22577:9;22573:18;22565:26;;22637:9;22631:4;22627:20;22623:1;22612:9;22608:17;22601:47;22665:131;22791:4;22665:131;:::i;:::-;22657:139;;22555:248;;;:::o;22809:419::-;;23013:2;23002:9;22998:18;22990:26;;23062:9;23056:4;23052:20;23048:1;23037:9;23033:17;23026:47;23090:131;23216:4;23090:131;:::i;:::-;23082:139;;22980:248;;;:::o;23234:419::-;;23438:2;23427:9;23423:18;23415:26;;23487:9;23481:4;23477:20;23473:1;23462:9;23458:17;23451:47;23515:131;23641:4;23515:131;:::i;:::-;23507:139;;23405:248;;;:::o;23659:419::-;;23863:2;23852:9;23848:18;23840:26;;23912:9;23906:4;23902:20;23898:1;23887:9;23883:17;23876:47;23940:131;24066:4;23940:131;:::i;:::-;23932:139;;23830:248;;;:::o;24084:419::-;;24288:2;24277:9;24273:18;24265:26;;24337:9;24331:4;24327:20;24323:1;24312:9;24308:17;24301:47;24365:131;24491:4;24365:131;:::i;:::-;24357:139;;24255:248;;;:::o;24509:419::-;;24713:2;24702:9;24698:18;24690:26;;24762:9;24756:4;24752:20;24748:1;24737:9;24733:17;24726:47;24790:131;24916:4;24790:131;:::i;:::-;24782:139;;24680:248;;;:::o;24934:419::-;;25138:2;25127:9;25123:18;25115:26;;25187:9;25181:4;25177:20;25173:1;25162:9;25158:17;25151:47;25215:131;25341:4;25215:131;:::i;:::-;25207:139;;25105:248;;;:::o;25359:419::-;;25563:2;25552:9;25548:18;25540:26;;25612:9;25606:4;25602:20;25598:1;25587:9;25583:17;25576:47;25640:131;25766:4;25640:131;:::i;:::-;25632:139;;25530:248;;;:::o;25784:419::-;;25988:2;25977:9;25973:18;25965:26;;26037:9;26031:4;26027:20;26023:1;26012:9;26008:17;26001:47;26065:131;26191:4;26065:131;:::i;:::-;26057:139;;25955:248;;;:::o;26209:419::-;;26413:2;26402:9;26398:18;26390:26;;26462:9;26456:4;26452:20;26448:1;26437:9;26433:17;26426:47;26490:131;26616:4;26490:131;:::i;:::-;26482:139;;26380:248;;;:::o;26634:419::-;;26838:2;26827:9;26823:18;26815:26;;26887:9;26881:4;26877:20;26873:1;26862:9;26858:17;26851:47;26915:131;27041:4;26915:131;:::i;:::-;26907:139;;26805:248;;;:::o;27059:419::-;;27263:2;27252:9;27248:18;27240:26;;27312:9;27306:4;27302:20;27298:1;27287:9;27283:17;27276:47;27340:131;27466:4;27340:131;:::i;:::-;27332:139;;27230:248;;;:::o;27484:419::-;;27688:2;27677:9;27673:18;27665:26;;27737:9;27731:4;27727:20;27723:1;27712:9;27708:17;27701:47;27765:131;27891:4;27765:131;:::i;:::-;27757:139;;27655:248;;;:::o;27909:222::-;;28040:2;28029:9;28025:18;28017:26;;28053:71;28121:1;28110:9;28106:17;28097:6;28053:71;:::i;:::-;28007:124;;;;:::o;28137:129::-;;28198:20;;:::i;:::-;28188:30;;28227:33;28255:4;28247:6;28227:33;:::i;:::-;28178:88;;;:::o;28272:75::-;;28338:2;28332:9;28322:19;;28312:35;:::o;28353:311::-;;28520:18;28512:6;28509:30;28506:2;;;28542:18;;:::i;:::-;28506:2;28592:4;28584:6;28580:17;28572:25;;28652:4;28646;28642:15;28634:23;;28435:229;;;:::o;28670:307::-;;28821:18;28813:6;28810:30;28807:2;;;28843:18;;:::i;:::-;28807:2;28881:29;28903:6;28881:29;:::i;:::-;28873:37;;28965:4;28959;28955:15;28947:23;;28736:241;;;:::o;28983:308::-;;29135:18;29127:6;29124:30;29121:2;;;29157:18;;:::i;:::-;29121:2;29195:29;29217:6;29195:29;:::i;:::-;29187:37;;29279:4;29273;29269:15;29261:23;;29050:241;;;:::o;29297:98::-;;29382:5;29376:12;29366:22;;29355:40;;;:::o;29401:99::-;;29487:5;29481:12;29471:22;;29460:40;;;:::o;29506:168::-;;29623:6;29618:3;29611:19;29663:4;29658:3;29654:14;29639:29;;29601:73;;;;:::o;29680:169::-;;29798:6;29793:3;29786:19;29838:4;29833:3;29829:14;29814:29;;29776:73;;;;:::o;29855:148::-;;29994:3;29979:18;;29969:34;;;;:::o;30009:305::-;;30068:20;30086:1;30068:20;:::i;:::-;30063:25;;30102:20;30120:1;30102:20;:::i;:::-;30097:25;;30256:1;30188:66;30184:74;30181:1;30178:81;30175:2;;;30262:18;;:::i;:::-;30175:2;30306:1;30303;30299:9;30292:16;;30053:261;;;;:::o;30320:185::-;;30377:20;30395:1;30377:20;:::i;:::-;30372:25;;30411:20;30429:1;30411:20;:::i;:::-;30406:25;;30450:1;30440:2;;30455:18;;:::i;:::-;30440:2;30497:1;30494;30490:9;30485:14;;30362:143;;;;:::o;30511:348::-;;30574:20;30592:1;30574:20;:::i;:::-;30569:25;;30608:20;30626:1;30608:20;:::i;:::-;30603:25;;30796:1;30728:66;30724:74;30721:1;30718:81;30713:1;30706:9;30699:17;30695:105;30692:2;;;30803:18;;:::i;:::-;30692:2;30851:1;30848;30844:9;30833:20;;30559:300;;;;:::o;30865:191::-;;30925:20;30943:1;30925:20;:::i;:::-;30920:25;;30959:20;30977:1;30959:20;:::i;:::-;30954:25;;30998:1;30995;30992:8;30989:2;;;31003:18;;:::i;:::-;30989:2;31048:1;31045;31041:9;31033:17;;30910:146;;;;:::o;31062:96::-;;31128:24;31146:5;31128:24;:::i;:::-;31117:35;;31107:51;;;:::o;31164:90::-;;31241:5;31234:13;31227:21;31216:32;;31206:48;;;:::o;31260:149::-;;31336:66;31329:5;31325:78;31314:89;;31304:105;;;:::o;31415:121::-;;31506:24;31524:5;31506:24;:::i;:::-;31495:35;;31485:51;;;:::o;31542:126::-;;31619:42;31612:5;31608:54;31597:65;;31587:81;;;:::o;31674:77::-;;31740:5;31729:16;;31719:32;;;:::o;31757:154::-;31841:6;31836:3;31831;31818:30;31903:1;31894:6;31889:3;31885:16;31878:27;31808:103;;;:::o;31917:307::-;31985:1;31995:113;32009:6;32006:1;32003:13;31995:113;;;32094:1;32089:3;32085:11;32079:18;32075:1;32070:3;32066:11;32059:39;32031:2;32028:1;32024:10;32019:15;;31995:113;;;32126:6;32123:1;32120:13;32117:2;;;32206:1;32197:6;32192:3;32188:16;32181:27;32117:2;31966:258;;;;:::o;32230:320::-;;32311:1;32305:4;32301:12;32291:22;;32358:1;32352:4;32348:12;32379:18;32369:2;;32435:4;32427:6;32423:17;32413:27;;32369:2;32497;32489:6;32486:14;32466:18;32463:38;32460:2;;;32516:18;;:::i;:::-;32460:2;32281:269;;;;:::o;32556:281::-;32639:27;32661:4;32639:27;:::i;:::-;32631:6;32627:40;32769:6;32757:10;32754:22;32733:18;32721:10;32718:34;32715:62;32712:2;;;32780:18;;:::i;:::-;32712:2;32820:10;32816:2;32809:22;32599:238;;;:::o;32843:233::-;;32905:24;32923:5;32905:24;:::i;:::-;32896:33;;32951:66;32944:5;32941:77;32938:2;;;33021:18;;:::i;:::-;32938:2;33068:1;33061:5;33057:13;33050:20;;32886:190;;;:::o;33082:176::-;;33131:20;33149:1;33131:20;:::i;:::-;33126:25;;33165:20;33183:1;33165:20;:::i;:::-;33160:25;;33204:1;33194:2;;33209:18;;:::i;:::-;33194:2;33250:1;33247;33243:9;33238:14;;33116:142;;;;:::o;33264:180::-;33312:77;33309:1;33302:88;33409:4;33406:1;33399:15;33433:4;33430:1;33423:15;33450:180;33498:77;33495:1;33488:88;33595:4;33592:1;33585:15;33619:4;33616:1;33609:15;33636:180;33684:77;33681:1;33674:88;33781:4;33778:1;33771:15;33805:4;33802:1;33795:15;33822:180;33870:77;33867:1;33860:88;33967:4;33964:1;33957:15;33991:4;33988:1;33981:15;34008:102;;34100:2;34096:7;34091:2;34084:5;34080:14;34076:28;34066:38;;34056:54;;;:::o;34116:237::-;34256:34;34252:1;34244:6;34240:14;34233:58;34325:20;34320:2;34312:6;34308:15;34301:45;34222:131;:::o;34359:225::-;34499:34;34495:1;34487:6;34483:14;34476:58;34568:8;34563:2;34555:6;34551:15;34544:33;34465:119;:::o;34590:224::-;34730:34;34726:1;34718:6;34714:14;34707:58;34799:7;34794:2;34786:6;34782:15;34775:32;34696:118;:::o;34820:178::-;34960:30;34956:1;34948:6;34944:14;34937:54;34926:72;:::o;35004:223::-;35144:34;35140:1;35132:6;35128:14;35121:58;35213:6;35208:2;35200:6;35196:15;35189:31;35110:117;:::o;35233:175::-;35373:27;35369:1;35361:6;35357:14;35350:51;35339:69;:::o;35414:228::-;35554:34;35550:1;35542:6;35538:14;35531:58;35623:11;35618:2;35610:6;35606:15;35599:36;35520:122;:::o;35648:170::-;35788:22;35784:1;35776:6;35772:14;35765:46;35754:64;:::o;35824:180::-;35964:32;35960:1;35952:6;35948:14;35941:56;35930:74;:::o;36010:249::-;36150:34;36146:1;36138:6;36134:14;36127:58;36219:32;36214:2;36206:6;36202:15;36195:57;36116:143;:::o;36265:182::-;36405:34;36401:1;36393:6;36389:14;36382:58;36371:76;:::o;36453:178::-;36593:30;36589:1;36581:6;36577:14;36570:54;36559:72;:::o;36637:182::-;36777:34;36773:1;36765:6;36761:14;36754:58;36743:76;:::o;36825:226::-;36965:34;36961:1;36953:6;36949:14;36942:58;37034:9;37029:2;37021:6;37017:15;37010:34;36931:120;:::o;37057:174::-;37197:26;37193:1;37185:6;37181:14;37174:50;37163:68;:::o;37237:220::-;37377:34;37373:1;37365:6;37361:14;37354:58;37446:3;37441:2;37433:6;37429:15;37422:28;37343:114;:::o;37463:172::-;37603:24;37599:1;37591:6;37587:14;37580:48;37569:66;:::o;37641:234::-;37781:34;37777:1;37769:6;37765:14;37758:58;37850:17;37845:2;37837:6;37833:15;37826:42;37747:128;:::o;37881:233::-;38021:34;38017:1;38009:6;38005:14;37998:58;38090:16;38085:2;38077:6;38073:15;38066:41;37987:127;:::o;38120:122::-;38193:24;38211:5;38193:24;:::i;:::-;38186:5;38183:35;38173:2;;38232:1;38229;38222:12;38173:2;38163:79;:::o;38248:116::-;38318:21;38333:5;38318:21;:::i;:::-;38311:5;38308:32;38298:2;;38354:1;38351;38344:12;38298:2;38288:76;:::o;38370:120::-;38442:23;38459:5;38442:23;:::i;:::-;38435:5;38432:34;38422:2;;38480:1;38477;38470:12;38422:2;38412:78;:::o;38496:172::-;38594:49;38637:5;38594:49;:::i;:::-;38587:5;38584:60;38574:2;;38658:1;38655;38648:12;38574:2;38564:104;:::o;38674:122::-;38747:24;38765:5;38747:24;:::i;:::-;38740:5;38737:35;38727:2;;38786:1;38783;38776:12;38727:2;38717:79;:::o

Swarm Source

ipfs://289d4962990ca3ca6d2c6664287153e544ea3c7f9b87880faf4b4ef5dbecbb7e
Loading