ETH Price: $3,563.62 (+2.89%)
Gas: 118 Gwei

LondonToken_0.3 (VERSE)
 

Overview

TokenID

4258766904

Total Transfers

-

Market

Fully Diluted Market Cap

$0.00

Circulating Supply Market Cap

-
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
LondonToken

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 14 of 18: LondonToken.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.13;

import "./Ownable.sol";
import "./ERC721.sol";
import "./ERC2981PerTokenRoyalties.sol";
import {DefaultOperatorFilterer} from "./DefaultOperatorFilterer.sol";

/// @custom:security-contact [email protected]
contract LondonToken is
    ERC721,
    Ownable,
    ERC2981PerTokenRoyalties,
    DefaultOperatorFilterer
{
    constructor(
        string memory uri_,
        address minter_,
        address gatewayManager_
    ) ERC721("LondonToken_0.3", "VERSE", uri_) {
        mintingManager = minter_;
        gatewayManager = gatewayManager_;
    }

    /**
     * @dev OS Operator filtering
     */
    function setApprovalForAll(address operator, bool approved)
        public
        override
        onlyAllowedOperatorApproval(operator)
    {
        super.setApprovalForAll(operator, approved);
    }

    /**
     * @dev OS Operator filtering
     */
    function approve(address operator, uint256 tokenId)
        public
        override
        onlyAllowedOperatorApproval(operator)
    {
        super.approve(operator, tokenId);
    }

    /**
     * @dev OS Operator filtering
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public override onlyAllowedOperator(from) {
        super.transferFrom(from, to, tokenId);
    }

    /**
     * @dev OS Operator filtering
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public override onlyAllowedOperator(from) {
        super.safeTransferFrom(from, to, tokenId);
    }

    /**
     * @dev OS Operator filtering
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) public override onlyAllowedOperator(from) {
        super.safeTransferFrom(from, to, tokenId, data);
    }

    address public mintingManager;

    address public gatewayManager;

    /**
     * @dev Creates a token with `id`, and assigns them to `to`.
     * In addition it sets the royalties for `royaltyRecipient` of the value `royaltyValue`.
     * Method emits two transfer events.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     */
    function mintWithCreator(
        address creator,
        address to,
        uint256 tokenId,
        string memory cid,
        address royaltyRecipient,
        uint256 royaltyValue
    ) public onlyMinter {
        require(to != address(0), "mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

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

        if (royaltyValue > 0) {
            _setTokenRoyalty(tokenId, royaltyRecipient, royaltyValue);
        }

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

    /**
     * @dev Creates a token with `id`, and assigns them to `to`.
     * In addition it sets the royalties for `royaltyRecipient` of the value `royaltyValue`.
     * Method emits two transfer events.
     *
     * Emits a {Transfer} events for intermediate artist.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function batchMintWithCreator(
        address[] memory to,
        address creator,
        uint256[] memory tokenIds,
        string[] memory tokenCids,
        address royaltyRecipient,
        uint256 royaltyValue
    ) public onlyMinter {
        require(
            tokenIds.length == to.length && tokenIds.length == tokenCids.length,
            "Arrays length mismatch"
        );

        for (uint256 i = 0; i < tokenIds.length; i++) {
            mintWithCreator(
                creator,
                to[i],
                tokenIds[i],
                tokenCids[i],
                royaltyRecipient,
                royaltyValue
            );
        }
    }

    modifier onlyMinter() {
        require(msg.sender == mintingManager);
        _;
    }

    modifier onlyGatewayManager() {
        require(msg.sender == gatewayManager);
        _;
    }

    function tokenURI(uint256 tokenId)
        public
        view
        override(ERC721)
        returns (string memory)
    {
        return super.tokenURI(tokenId);
    }

    /**
     * @dev Checks for supported interface.
     *
     */
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(ERC721, ERC2981Base)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }

    /**
     * @dev Sets royalties for `tokenId` and `tokenRecipient` with royalty value `royaltyValue`.
     *
     */
    function setRoyalties(
        uint256 tokenId,
        address royaltyRecipient,
        uint256 royaltyValue
    ) public onlyOwner {
        _setTokenRoyalty(tokenId, royaltyRecipient, royaltyValue);
    }

    /**
     * @dev Sets new minter for the contract.
     *
     */
    function setMintingManager(address minter_) public onlyOwner {
        mintingManager = minter_;
    }

    /**
     * @dev Sets new gateway manager for the contract.
     *
     */
    function setGatewayManager(address gatewayManager_) public onlyOwner {
        gatewayManager = gatewayManager_;
    }

    /**
     * @dev Sets base URI for metadata.
     *
     */
    function setURI(string memory newuri) public onlyGatewayManager {
        _setURI(newuri);
    }

    /**
     * @dev Sets IPFS cid metadata hash for token id `tokenId`.
     *
     */
    function setCID(uint256 tokenId, string memory cid)
        public
        onlyGatewayManager
    {
        _cids[tokenId] = cid;
    }

    /**
     * @dev Sets IPFS cid metadata hash for token id `tokenId`.
     *
     */
    function setCIDs(uint256[] memory tokenIds, string[] memory cids_)
        public
        onlyGatewayManager
    {
        require(
            tokenIds.length == cids_.length,
            "ERC1155: Arrays length mismatch"
        );
        for (uint256 i = 0; i < tokenIds.length; i++) {
            _cids[tokenIds[i]] = cids_[i];
        }
    }
}

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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

File 3 of 18: DefaultOperatorFilterer.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

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

/**
 * @title  DefaultOperatorFilterer
 * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription.
 */
abstract contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}

File 4 of 18: ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

File 5 of 18: ERC2981Base.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.13;

import "./ERC165.sol";

import "./IERC2981Royalties.sol";

/// @dev This is a contract used to add ERC2981 support to ERC721 and 1155
abstract contract ERC2981Base is ERC165, IERC2981Royalties {
    struct RoyaltyInfo {
        address recipient;
        uint24 amount;
    }

    /// @inheritdoc	ERC165
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override
        returns (bool)
    {
        return
            interfaceId == type(IERC2981Royalties).interfaceId ||
            super.supportsInterface(interfaceId);
    }
}

File 6 of 18: ERC2981PerTokenRoyalties.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.13;

import "./ERC165.sol";

import "./ERC2981Base.sol";

/// @dev This is a contract used to add ERC2981 support to ERC721 and 1155
abstract contract ERC2981PerTokenRoyalties is ERC2981Base {
    mapping(uint256 => RoyaltyInfo) internal _royalties;

    /// @dev Sets token royalties
    /// @param tokenId the token id fir which we register the royalties
    /// @param recipient recipient of the royalties
    /// @param value percentage (using 2 decimals - 10000 = 100, 0 = 0)
    function _setTokenRoyalty(
        uint256 tokenId,
        address recipient,
        uint256 value
    ) internal {
        require(value <= 10000, "ERC2981Royalties: Too high");
        _royalties[tokenId] = RoyaltyInfo(recipient, uint24(value));
    }

    /// @inheritdoc	IERC2981Royalties
    function royaltyInfo(uint256 tokenId, uint256 value)
        external
        view
        override
        returns (address receiver, uint256 royaltyAmount)
    {
        RoyaltyInfo memory royalties = _royalties[tokenId];
        receiver = royalties.recipient;
        royaltyAmount = (value * royalties.amount) / 10000;
    }
}

File 7 of 18: ERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/ERC721.sol)

pragma solidity 0.8.13;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./IERC721Metadata.sol";
import "./Address.sol";
import "./Context.sol";
import "./Strings.sol";
import "./ERC165.sol";

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

    // Mapping owner address to token count
    mapping(address => uint256) public _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;

    // Mapping from token ID to the IPFS cid
    mapping(uint256 => string) public _cids;

    // Used as the URI for all token types by relying on ID substitution, e.g.
    string public _baseUri;

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

    /**
     * @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 = _ownerOf(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, _cids[tokenId]))
                : "";
    }

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substitution mechanism
     */
    function _setURI(string memory newuri_) internal virtual {
        _baseUri = newuri_;
    }

    /**
     * @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 or 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 or 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 or 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 the owner of the `tokenId`. Does NOT revert if token doesn't exist
     */
    function _ownerOf(uint256 tokenId) internal view virtual returns (address) {
        return _owners[tokenId];
    }

    /**
     * @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 _ownerOf(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 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,
        string memory cid
    ) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

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

        // Check that tokenId was not minted by `_beforeTokenTransfer` hook
        require(!_exists(tokenId), "ERC721: token already minted");

        unchecked {
            // Will not overflow unless all 2**256 token ids are minted to the same owner.
            // Given that tokens are minted one by one, it is impossible in practice that
            // this ever happens. Might change if we allow batch minting.
            // The ERC fails to describe this case.
            _balances[to] += 1;
        }

        _owners[tokenId] = to;
        _cids[tokenId] = cid;

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

        _afterTokenTransfer(address(0), to, tokenId, 1);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     * This is an internal function that does not check if the sender is authorized to operate on the token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

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

        // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook
        owner = ERC721.ownerOf(tokenId);

        // Clear approvals
        delete _tokenApprovals[tokenId];

        unchecked {
            // Cannot overflow, as that would require more tokens to be burned/transferred
            // out than the owner initially received through minting and transferring in.
            _balances[owner] -= 1;
        }
        delete _owners[tokenId];

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

        _afterTokenTransfer(owner, address(0), tokenId, 1);
    }

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

        // Check that tokenId was not transferred by `_beforeTokenTransfer` hook
        require(
            ERC721.ownerOf(tokenId) == from,
            "ERC721: transfer from incorrect owner"
        );

        // Clear approvals from the previous owner
        delete _tokenApprovals[tokenId];

        unchecked {
            // `_balances[from]` cannot overflow for the same reason as described in `_burn`:
            // `from`'s balance is the number of token held, which is at least one before the current
            // transfer.
            // `_balances[to]` could overflow in the conditions described in `_mint`. That would require
            // all 2**256 token ids to be minted, which in practice is impossible.
            _balances[from] -= 1;
            _balances[to] += 1;
        }
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId, 1);
    }

    /**
     * @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. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`.
     * - When `from` is zero, the tokens will be minted for `to`.
     * - When `to` is zero, ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256, /* firstTokenId */
        uint256 batchSize
    ) internal virtual {
        if (batchSize > 1) {
            if (from != address(0)) {
                _balances[from] -= batchSize;
            }
            if (to != address(0)) {
                _balances[to] += batchSize;
            }
        }
    }

    /**
     * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`.
     * - When `from` is zero, the tokens were minted for `to`.
     * - When `to` is zero, ``from``'s tokens were burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 firstTokenId,
        uint256 batchSize
    ) internal virtual {}
}

File 8 of 18: IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

File 9 of 18: IERC2981Royalties.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.13;

/// @title IERC2981Royalties
/// @dev Interface for the ERC2981 - Token Royalty standard
interface IERC2981Royalties {
    /// @notice Called with the sale price to determine how much royalty
    //          is owed and to whom.
    /// @param _tokenId - the NFT asset queried for royalty information
    /// @param _value - the sale price of the NFT asset specified by _tokenId
    /// @return _receiver - address of who should be sent the royalty payment
    /// @return _royaltyAmount - the royalty payment amount for value sale price
    function royaltyInfo(uint256 _tokenId, uint256 _value)
        external
        view
        returns (address _receiver, uint256 _royaltyAmount);
}

File 10 of 18: IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * 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: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
     * understand this adds an external call which potentially creates a reentrancy vulnerability.
     *
     * 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);
}

File 11 of 18: IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";

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

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

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

File 12 of 18: IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

File 13 of 18: IOperatorFilterRegistry.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);
    function register(address registrant) external;
    function registerAndSubscribe(address registrant, address subscription) external;
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;
    function unregister(address addr) external;
    function updateOperator(address registrant, address operator, bool filtered) external;
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
    function subscribe(address registrant, address registrantToSubscribe) external;
    function unsubscribe(address registrant, bool copyExistingEntries) external;
    function subscriptionOf(address addr) external returns (address registrant);
    function subscribers(address registrant) external returns (address[] memory);
    function subscriberAt(address registrant, uint256 index) external returns (address);
    function copyEntriesOf(address registrant, address registrantToCopy) external;
    function isOperatorFiltered(address registrant, address operator) external returns (bool);
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
    function filteredOperators(address addr) external returns (address[] memory);
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
    function isRegistered(address addr) external returns (bool);
    function codeHashOf(address addr) external returns (bytes32);
}

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 16 of 18: OperatorFilterer.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

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

/**
 * @title  OperatorFilterer
 * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another
 *         registrant's entries in the OperatorFilterRegistry.
 * @dev    This smart contract is meant to be inherited by token contracts so they can use the following:
 *         - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods.
 *         - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods.
 */
abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (subscribe) {
                OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    OPERATOR_FILTER_REGISTRY.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator(address from) virtual {
        // Allow spending tokens from addresses with balance
        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
        // from an EOA.
        if (from != msg.sender) {
            _checkFilterOperator(msg.sender);
        }
        _;
    }

    modifier onlyAllowedOperatorApproval(address operator) virtual {
        _checkFilterOperator(operator);
        _;
    }

    function _checkFilterOperator(address operator) internal view virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
                revert OperatorNotAllowed(operator);
            }
        }
    }
}

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

pragma solidity ^0.8.0;

import "./Context.sol";

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

import "./Math.sol";

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

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"uri_","type":"string"},{"internalType":"address","name":"minter_","type":"address"},{"internalType":"address","name":"gatewayManager_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"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":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_balances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_baseUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_cids","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_owners","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","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":"address[]","name":"to","type":"address[]"},{"internalType":"address","name":"creator","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"string[]","name":"tokenCids","type":"string[]"},{"internalType":"address","name":"royaltyRecipient","type":"address"},{"internalType":"uint256","name":"royaltyValue","type":"uint256"}],"name":"batchMintWithCreator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gatewayManager","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"creator","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"cid","type":"string"},{"internalType":"address","name":"royaltyRecipient","type":"address"},{"internalType":"uint256","name":"royaltyValue","type":"uint256"}],"name":"mintWithCreator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintingManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"value","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":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"cid","type":"string"}],"name":"setCID","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"string[]","name":"cids_","type":"string[]"}],"name":"setCIDs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"gatewayManager_","type":"address"}],"name":"setGatewayManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"minter_","type":"address"}],"name":"setMintingManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"royaltyRecipient","type":"address"},{"internalType":"uint256","name":"royaltyValue","type":"uint256"}],"name":"setRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newuri","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":[{"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"}]

60806040523480156200001157600080fd5b50604051620049113803806200491183398181016040528101906200003791906200072b565b733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600f81526020017f4c6f6e646f6e546f6b656e5f302e3300000000000000000000000000000000008152506040518060400160405280600581526020017f5645525345000000000000000000000000000000000000000000000000000000815250868260009080519060200190620000d392919062000479565b508160019080519060200190620000ec92919062000479565b5080600790805190602001906200010592919062000479565b50505050620001296200011d620003ab60201b60201c565b620003b360201b60201c565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156200031e578015620001e4576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b8152600401620001aa929190620007b7565b600060405180830381600087803b158015620001c557600080fd5b505af1158015620001da573d6000803e3d6000fd5b505050506200031d565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146200029e576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b815260040162000264929190620007b7565b600060405180830381600087803b1580156200027f57600080fd5b505af115801562000294573d6000803e3d6000fd5b505050506200031c565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b8152600401620002e79190620007e4565b600060405180830381600087803b1580156200030257600080fd5b505af115801562000317573d6000803e3d6000fd5b505050505b5b5b505081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505062000865565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620004879062000830565b90600052602060002090601f016020900481019282620004ab5760008555620004f7565b82601f10620004c657805160ff1916838001178555620004f7565b82800160010185558215620004f7579182015b82811115620004f6578251825591602001919060010190620004d9565b5b5090506200050691906200050a565b5090565b5b80821115620005255760008160009055506001016200050b565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620005928262000547565b810181811067ffffffffffffffff82111715620005b457620005b362000558565b5b80604052505050565b6000620005c962000529565b9050620005d7828262000587565b919050565b600067ffffffffffffffff821115620005fa57620005f962000558565b5b620006058262000547565b9050602081019050919050565b60005b838110156200063257808201518184015260208101905062000615565b8381111562000642576000848401525b50505050565b60006200065f6200065984620005dc565b620005bd565b9050828152602081018484840111156200067e576200067d62000542565b5b6200068b84828562000612565b509392505050565b600082601f830112620006ab57620006aa6200053d565b5b8151620006bd84826020860162000648565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620006f382620006c6565b9050919050565b6200070581620006e6565b81146200071157600080fd5b50565b6000815190506200072581620006fa565b92915050565b60008060006060848603121562000747576200074662000533565b5b600084015167ffffffffffffffff81111562000768576200076762000538565b5b620007768682870162000693565b9350506020620007898682870162000714565b92505060406200079c8682870162000714565b9150509250925092565b620007b181620006e6565b82525050565b6000604082019050620007ce6000830185620007a6565b620007dd6020830184620007a6565b9392505050565b6000602082019050620007fb6000830184620007a6565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200084957607f821691505b6020821081036200085f576200085e62000801565b5b50919050565b61409c80620008756000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c806370a082311161010f5780639e426399116100a2578063d0414c9d11610071578063d0414c9d146105b4578063e2c7f338146105d2578063e985e9c5146105ee578063f2fde38b1461061e576101f0565b80639e42639914610530578063a22cb4651461054c578063b88d4fde14610568578063c87b56dd14610584576101f0565b80638d2bb093116100de5780638d2bb093146104a85780638da5cb5b146104c457806395d89b41146104e2578063992924a614610500576101f0565b806370a0823114610422578063715018a6146104525780637d1bbf7b1461045c57806382295a2d1461048c576101f0565b80633a33002211610187578063588844321161015657806358884432146103885780636352211e146103a65780636c52c3fb146103d65780636ebcf607146103f2576101f0565b80633a330022146103145780633e63eb2a1461033057806341f434341461034e57806342842e0e1461036c576101f0565b8063095ea7b3116101c3578063095ea7b31461028f57806323b872dd146102ab5780632a55205a146102c7578063337648b2146102f8576101f0565b806301ffc9a7146101f557806302fe53051461022557806306fdde0314610241578063081812fc1461025f575b600080fd5b61020f600480360381019061020a91906127a9565b61063a565b60405161021c91906127f1565b60405180910390f35b61023f600480360381019061023a9190612952565b61064c565b005b6102496106b2565b6040516102569190612a23565b60405180910390f35b61027960048036038101906102749190612a7b565b610744565b6040516102869190612ae9565b60405180910390f35b6102a960048036038101906102a49190612b30565b61078a565b005b6102c560048036038101906102c09190612b70565b6107a3565b005b6102e160048036038101906102dc9190612bc3565b6107f2565b6040516102ef929190612c12565b60405180910390f35b610312600480360381019061030d9190612de4565b6108c3565b005b61032e60048036038101906103299190612e5c565b6109e1565b005b610338610a2d565b6040516103459190612a23565b60405180910390f35b610356610abb565b6040516103639190612ee8565b60405180910390f35b61038660048036038101906103819190612b70565b610acd565b005b610390610b1c565b60405161039d9190612ae9565b60405180910390f35b6103c060048036038101906103bb9190612a7b565b610b42565b6040516103cd9190612ae9565b60405180910390f35b6103f060048036038101906103eb9190612e5c565b610bc8565b005b61040c60048036038101906104079190612e5c565b610c14565b6040516104199190612f03565b60405180910390f35b61043c60048036038101906104379190612e5c565b610c2c565b6040516104499190612f03565b60405180910390f35b61045a610ce3565b005b61047660048036038101906104719190612a7b565b610cf7565b6040516104839190612a23565b60405180910390f35b6104a660048036038101906104a19190612f1e565b610d97565b005b6104c260048036038101906104bd9190612f7a565b610e1d565b005b6104cc6110d4565b6040516104d99190612ae9565b60405180910390f35b6104ea6110fe565b6040516104f79190612a23565b60405180910390f35b61051a60048036038101906105159190612a7b565b611190565b6040516105279190612ae9565b60405180910390f35b61054a600480360381019061054591906130e6565b6111c3565b005b610566600480360381019061056191906131f3565b6112f2565b005b610582600480360381019061057d91906132d4565b61130b565b005b61059e60048036038101906105999190612a7b565b61135c565b6040516105ab9190612a23565b60405180910390f35b6105bc61136e565b6040516105c99190612ae9565b60405180910390f35b6105ec60048036038101906105e79190613357565b611394565b005b610608600480360381019061060391906133aa565b6113ac565b60405161061591906127f1565b60405180910390f35b61063860048036038101906106339190612e5c565b611440565b005b6000610645826114c3565b9050919050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146106a657600080fd5b6106af8161153d565b50565b6060600080546106c190613419565b80601f01602080910402602001604051908101604052809291908181526020018280546106ed90613419565b801561073a5780601f1061070f5761010080835404028352916020019161073a565b820191906000526020600020905b81548152906001019060200180831161071d57829003601f168201915b5050505050905090565b600061074f82611557565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81610794816115a2565b61079e838361169f565b505050565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146107e1576107e0336115a2565b5b6107ec8484846117b6565b50505050565b6000806000600960008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900462ffffff1662ffffff1662ffffff1681525050905080600001519250612710816020015162ffffff16856108af9190613479565b6108b99190613502565b9150509250929050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461091d57600080fd5b8051825114610961576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109589061357f565b60405180910390fd5b60005b82518110156109dc578181815181106109805761097f61359f565b5b60200260200101516006600085848151811061099f5761099e61359f565b5b6020026020010151815260200190815260200160002090805190602001906109c892919061269a565b5080806109d4906135ce565b915050610964565b505050565b6109e9611816565b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60078054610a3a90613419565b80601f0160208091040260200160405190810160405280929190818152602001828054610a6690613419565b8015610ab35780601f10610a8857610100808354040283529160200191610ab3565b820191906000526020600020905b815481529060010190602001808311610a9657829003601f168201915b505050505081565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b0b57610b0a336115a2565b5b610b16848484611894565b50505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080610b4e836118b4565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610bbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb690613662565b60405180910390fd5b80915050919050565b610bd0611816565b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60036020528060005260406000206000915090505481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c93906136f4565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610ceb611816565b610cf560006118f1565b565b60066020528060005260406000206000915090508054610d1690613419565b80601f0160208091040260200160405190810160405280929190818152602001828054610d4290613419565b8015610d8f5780601f10610d6457610100808354040283529160200191610d8f565b820191906000526020600020905b815481529060010190602001808311610d7257829003601f168201915b505050505081565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610df157600080fd5b80600660008481526020019081526020016000209080519060200190610e1892919061269a565b505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e7757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610ee6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edd90613760565b60405180910390fd5b610eef846119b7565b15610f2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f26906137cc565b60405180910390fd5b6001600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610f7f91906137ec565b92505081905550846002600086815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600660008681526020019081526020016000209080519060200190610fff92919061269a565b506000811115611015576110148483836119f8565b5b838673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461110d90613419565b80601f016020809104026020016040519081016040528092919081815260200182805461113990613419565b80156111865780601f1061115b57610100808354040283529160200191611186565b820191906000526020600020905b81548152906001019060200180831161116957829003601f168201915b5050505050905090565b60026020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461121d57600080fd5b8551845114801561122f575082518451145b61126e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112659061388e565b60405180910390fd5b60005b84518110156112e9576112d6868883815181106112915761129061359f565b5b60200260200101518784815181106112ac576112ab61359f565b5b60200260200101518785815181106112c7576112c661359f565b5b60200260200101518787610e1d565b80806112e1906135ce565b915050611271565b50505050505050565b816112fc816115a2565b6113068383611af4565b505050565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461134957611348336115a2565b5b61135585858585611b0a565b5050505050565b606061136782611b6c565b9050919050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61139c611816565b6113a78383836119f8565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611448611816565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036114b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ae90613920565b60405180910390fd5b6114c0816118f1565b50565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611536575061153582611c61565b5b9050919050565b806007908051906020019061155392919061269a565b5050565b611560816119b7565b61159f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159690613662565b60405180910390fd5b50565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561169c576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611619929190613940565b602060405180830381865afa158015611636573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061165a919061397e565b61169b57806040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016116929190612ae9565b60405180910390fd5b5b50565b60006116aa82610b42565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361171a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171190613a1d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16611739611d43565b73ffffffffffffffffffffffffffffffffffffffff161480611768575061176781611762611d43565b6113ac565b5b6117a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179e90613aaf565b60405180910390fd5b6117b18383611d4b565b505050565b6117c76117c1611d43565b82611e04565b611806576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117fd90613b41565b60405180910390fd5b611811838383611e99565b505050565b61181e611d43565b73ffffffffffffffffffffffffffffffffffffffff1661183c6110d4565b73ffffffffffffffffffffffffffffffffffffffff1614611892576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188990613bad565b60405180910390fd5b565b6118af8383836040518060200160405280600081525061130b565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008073ffffffffffffffffffffffffffffffffffffffff166119d9836118b4565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b612710811115611a3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3490613c19565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff1681526020018262ffffff168152506009600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548162ffffff021916908362ffffff160217905550905050505050565b611b06611aff611d43565b8383612192565b5050565b611b1b611b15611d43565b83611e04565b611b5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5190613b41565b60405180910390fd5b611b66848484846122fe565b50505050565b6060611b7782611557565b600060078054611b8690613419565b80601f0160208091040260200160405190810160405280929190818152602001828054611bb290613419565b8015611bff5780601f10611bd457610100808354040283529160200191611bff565b820191906000526020600020905b815481529060010190602001808311611be257829003601f168201915b505050505090506000815111611c245760405180602001604052806000815250611c59565b8060066000858152602001908152602001600020604051602001611c49929190613d09565b6040516020818303038152906040525b915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611d2c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611d3c5750611d3b8261235a565b5b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611dbe83610b42565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611e1083610b42565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611e525750611e5181856113ac565b5b80611e9057508373ffffffffffffffffffffffffffffffffffffffff16611e7884610744565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611eb982610b42565b73ffffffffffffffffffffffffffffffffffffffff1614611f0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0690613d9f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7590613e31565b60405180910390fd5b611f8b83838360016123c4565b8273ffffffffffffffffffffffffffffffffffffffff16611fab82610b42565b73ffffffffffffffffffffffffffffffffffffffff1614612001576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff890613d9f565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461218d83838360016124ea565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612200576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f790613e9d565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516122f191906127f1565b60405180910390a3505050565b612309848484611e99565b612315848484846124f0565b612354576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234b90613f2f565b60405180910390fd5b50505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60018111156124e457600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146124585780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124509190613f4f565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146124e35780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124db91906137ec565b925050819055505b5b50505050565b50505050565b60006125118473ffffffffffffffffffffffffffffffffffffffff16612677565b1561266a578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261253a611d43565b8786866040518563ffffffff1660e01b815260040161255c9493929190613fd8565b6020604051808303816000875af192505050801561259857506040513d601f19601f820116820180604052508101906125959190614039565b60015b61261a573d80600081146125c8576040519150601f19603f3d011682016040523d82523d6000602084013e6125cd565b606091505b506000815103612612576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260990613f2f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061266f565b600190505b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b8280546126a690613419565b90600052602060002090601f0160209004810192826126c8576000855561270f565b82601f106126e157805160ff191683800117855561270f565b8280016001018555821561270f579182015b8281111561270e5782518255916020019190600101906126f3565b5b50905061271c9190612720565b5090565b5b80821115612739576000816000905550600101612721565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61278681612751565b811461279157600080fd5b50565b6000813590506127a38161277d565b92915050565b6000602082840312156127bf576127be612747565b5b60006127cd84828501612794565b91505092915050565b60008115159050919050565b6127eb816127d6565b82525050565b600060208201905061280660008301846127e2565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61285f82612816565b810181811067ffffffffffffffff8211171561287e5761287d612827565b5b80604052505050565b600061289161273d565b905061289d8282612856565b919050565b600067ffffffffffffffff8211156128bd576128bc612827565b5b6128c682612816565b9050602081019050919050565b82818337600083830152505050565b60006128f56128f0846128a2565b612887565b90508281526020810184848401111561291157612910612811565b5b61291c8482856128d3565b509392505050565b600082601f8301126129395761293861280c565b5b81356129498482602086016128e2565b91505092915050565b60006020828403121561296857612967612747565b5b600082013567ffffffffffffffff8111156129865761298561274c565b5b61299284828501612924565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156129d55780820151818401526020810190506129ba565b838111156129e4576000848401525b50505050565b60006129f58261299b565b6129ff81856129a6565b9350612a0f8185602086016129b7565b612a1881612816565b840191505092915050565b60006020820190508181036000830152612a3d81846129ea565b905092915050565b6000819050919050565b612a5881612a45565b8114612a6357600080fd5b50565b600081359050612a7581612a4f565b92915050565b600060208284031215612a9157612a90612747565b5b6000612a9f84828501612a66565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612ad382612aa8565b9050919050565b612ae381612ac8565b82525050565b6000602082019050612afe6000830184612ada565b92915050565b612b0d81612ac8565b8114612b1857600080fd5b50565b600081359050612b2a81612b04565b92915050565b60008060408385031215612b4757612b46612747565b5b6000612b5585828601612b1b565b9250506020612b6685828601612a66565b9150509250929050565b600080600060608486031215612b8957612b88612747565b5b6000612b9786828701612b1b565b9350506020612ba886828701612b1b565b9250506040612bb986828701612a66565b9150509250925092565b60008060408385031215612bda57612bd9612747565b5b6000612be885828601612a66565b9250506020612bf985828601612a66565b9150509250929050565b612c0c81612a45565b82525050565b6000604082019050612c276000830185612ada565b612c346020830184612c03565b9392505050565b600067ffffffffffffffff821115612c5657612c55612827565b5b602082029050602081019050919050565b600080fd5b6000612c7f612c7a84612c3b565b612887565b90508083825260208201905060208402830185811115612ca257612ca1612c67565b5b835b81811015612ccb5780612cb78882612a66565b845260208401935050602081019050612ca4565b5050509392505050565b600082601f830112612cea57612ce961280c565b5b8135612cfa848260208601612c6c565b91505092915050565b600067ffffffffffffffff821115612d1e57612d1d612827565b5b602082029050602081019050919050565b6000612d42612d3d84612d03565b612887565b90508083825260208201905060208402830185811115612d6557612d64612c67565b5b835b81811015612dac57803567ffffffffffffffff811115612d8a57612d8961280c565b5b808601612d978982612924565b85526020850194505050602081019050612d67565b5050509392505050565b600082601f830112612dcb57612dca61280c565b5b8135612ddb848260208601612d2f565b91505092915050565b60008060408385031215612dfb57612dfa612747565b5b600083013567ffffffffffffffff811115612e1957612e1861274c565b5b612e2585828601612cd5565b925050602083013567ffffffffffffffff811115612e4657612e4561274c565b5b612e5285828601612db6565b9150509250929050565b600060208284031215612e7257612e71612747565b5b6000612e8084828501612b1b565b91505092915050565b6000819050919050565b6000612eae612ea9612ea484612aa8565b612e89565b612aa8565b9050919050565b6000612ec082612e93565b9050919050565b6000612ed282612eb5565b9050919050565b612ee281612ec7565b82525050565b6000602082019050612efd6000830184612ed9565b92915050565b6000602082019050612f186000830184612c03565b92915050565b60008060408385031215612f3557612f34612747565b5b6000612f4385828601612a66565b925050602083013567ffffffffffffffff811115612f6457612f6361274c565b5b612f7085828601612924565b9150509250929050565b60008060008060008060c08789031215612f9757612f96612747565b5b6000612fa589828a01612b1b565b9650506020612fb689828a01612b1b565b9550506040612fc789828a01612a66565b945050606087013567ffffffffffffffff811115612fe857612fe761274c565b5b612ff489828a01612924565b935050608061300589828a01612b1b565b92505060a061301689828a01612a66565b9150509295509295509295565b600067ffffffffffffffff82111561303e5761303d612827565b5b602082029050602081019050919050565b600061306261305d84613023565b612887565b9050808382526020820190506020840283018581111561308557613084612c67565b5b835b818110156130ae578061309a8882612b1b565b845260208401935050602081019050613087565b5050509392505050565b600082601f8301126130cd576130cc61280c565b5b81356130dd84826020860161304f565b91505092915050565b60008060008060008060c0878903121561310357613102612747565b5b600087013567ffffffffffffffff8111156131215761312061274c565b5b61312d89828a016130b8565b965050602061313e89828a01612b1b565b955050604087013567ffffffffffffffff81111561315f5761315e61274c565b5b61316b89828a01612cd5565b945050606087013567ffffffffffffffff81111561318c5761318b61274c565b5b61319889828a01612db6565b93505060806131a989828a01612b1b565b92505060a06131ba89828a01612a66565b9150509295509295509295565b6131d0816127d6565b81146131db57600080fd5b50565b6000813590506131ed816131c7565b92915050565b6000806040838503121561320a57613209612747565b5b600061321885828601612b1b565b9250506020613229858286016131de565b9150509250929050565b600067ffffffffffffffff82111561324e5761324d612827565b5b61325782612816565b9050602081019050919050565b600061327761327284613233565b612887565b90508281526020810184848401111561329357613292612811565b5b61329e8482856128d3565b509392505050565b600082601f8301126132bb576132ba61280c565b5b81356132cb848260208601613264565b91505092915050565b600080600080608085870312156132ee576132ed612747565b5b60006132fc87828801612b1b565b945050602061330d87828801612b1b565b935050604061331e87828801612a66565b925050606085013567ffffffffffffffff81111561333f5761333e61274c565b5b61334b878288016132a6565b91505092959194509250565b6000806000606084860312156133705761336f612747565b5b600061337e86828701612a66565b935050602061338f86828701612b1b565b92505060406133a086828701612a66565b9150509250925092565b600080604083850312156133c1576133c0612747565b5b60006133cf85828601612b1b565b92505060206133e085828601612b1b565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061343157607f821691505b602082108103613444576134436133ea565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061348482612a45565b915061348f83612a45565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156134c8576134c761344a565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061350d82612a45565b915061351883612a45565b925082613528576135276134d3565b5b828204905092915050565b7f455243313135353a20417272617973206c656e677468206d69736d6174636800600082015250565b6000613569601f836129a6565b915061357482613533565b602082019050919050565b600060208201905081810360008301526135988161355c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006135d982612a45565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361360b5761360a61344a565b5b600182019050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b600061364c6018836129a6565b915061365782613616565b602082019050919050565b6000602082019050818103600083015261367b8161363f565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006136de6029836129a6565b91506136e982613682565b604082019050919050565b6000602082019050818103600083015261370d816136d1565b9050919050565b7f6d696e7420746f20746865207a65726f20616464726573730000000000000000600082015250565b600061374a6018836129a6565b915061375582613714565b602082019050919050565b600060208201905081810360008301526137798161373d565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006137b6601c836129a6565b91506137c182613780565b602082019050919050565b600060208201905081810360008301526137e5816137a9565b9050919050565b60006137f782612a45565b915061380283612a45565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156138375761383661344a565b5b828201905092915050565b7f417272617973206c656e677468206d69736d6174636800000000000000000000600082015250565b60006138786016836129a6565b915061388382613842565b602082019050919050565b600060208201905081810360008301526138a78161386b565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061390a6026836129a6565b9150613915826138ae565b604082019050919050565b60006020820190508181036000830152613939816138fd565b9050919050565b60006040820190506139556000830185612ada565b6139626020830184612ada565b9392505050565b600081519050613978816131c7565b92915050565b60006020828403121561399457613993612747565b5b60006139a284828501613969565b91505092915050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613a076021836129a6565b9150613a12826139ab565b604082019050919050565b60006020820190508181036000830152613a36816139fa565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000613a99603d836129a6565b9150613aa482613a3d565b604082019050919050565b60006020820190508181036000830152613ac881613a8c565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000613b2b602d836129a6565b9150613b3682613acf565b604082019050919050565b60006020820190508181036000830152613b5a81613b1e565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613b976020836129a6565b9150613ba282613b61565b602082019050919050565b60006020820190508181036000830152613bc681613b8a565b9050919050565b7f45524332393831526f79616c746965733a20546f6f2068696768000000000000600082015250565b6000613c03601a836129a6565b9150613c0e82613bcd565b602082019050919050565b60006020820190508181036000830152613c3281613bf6565b9050919050565b600081905092915050565b6000613c4f8261299b565b613c598185613c39565b9350613c698185602086016129b7565b80840191505092915050565b60008190508160005260206000209050919050565b60008154613c9781613419565b613ca18186613c39565b94506001821660008114613cbc5760018114613ccd57613d00565b60ff19831686528186019350613d00565b613cd685613c75565b60005b83811015613cf857815481890152600182019150602081019050613cd9565b838801955050505b50505092915050565b6000613d158285613c44565b9150613d218284613c8a565b91508190509392505050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000613d896025836129a6565b9150613d9482613d2d565b604082019050919050565b60006020820190508181036000830152613db881613d7c565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613e1b6024836129a6565b9150613e2682613dbf565b604082019050919050565b60006020820190508181036000830152613e4a81613e0e565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613e876019836129a6565b9150613e9282613e51565b602082019050919050565b60006020820190508181036000830152613eb681613e7a565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000613f196032836129a6565b9150613f2482613ebd565b604082019050919050565b60006020820190508181036000830152613f4881613f0c565b9050919050565b6000613f5a82612a45565b9150613f6583612a45565b925082821015613f7857613f7761344a565b5b828203905092915050565b600081519050919050565b600082825260208201905092915050565b6000613faa82613f83565b613fb48185613f8e565b9350613fc48185602086016129b7565b613fcd81612816565b840191505092915050565b6000608082019050613fed6000830187612ada565b613ffa6020830186612ada565b6140076040830185612c03565b81810360608301526140198184613f9f565b905095945050505050565b6000815190506140338161277d565b92915050565b60006020828403121561404f5761404e612747565b5b600061405d84828501614024565b9150509291505056fea26469706673582212200247141e877e49699df1af7203af3c597417501b5dbe7133882a1d0dd9e5fd4564736f6c634300080d00330000000000000000000000000000000000000000000000000000000000000060000000000000000000000000e445fb0297f7d1f507df708185946210eb6a9de60000000000000000000000001bfe7452477accc0188c34b3a4e8e3b15bf671b00000000000000000000000000000000000000000000000000000000000000007697066733a2f2f00000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101f05760003560e01c806370a082311161010f5780639e426399116100a2578063d0414c9d11610071578063d0414c9d146105b4578063e2c7f338146105d2578063e985e9c5146105ee578063f2fde38b1461061e576101f0565b80639e42639914610530578063a22cb4651461054c578063b88d4fde14610568578063c87b56dd14610584576101f0565b80638d2bb093116100de5780638d2bb093146104a85780638da5cb5b146104c457806395d89b41146104e2578063992924a614610500576101f0565b806370a0823114610422578063715018a6146104525780637d1bbf7b1461045c57806382295a2d1461048c576101f0565b80633a33002211610187578063588844321161015657806358884432146103885780636352211e146103a65780636c52c3fb146103d65780636ebcf607146103f2576101f0565b80633a330022146103145780633e63eb2a1461033057806341f434341461034e57806342842e0e1461036c576101f0565b8063095ea7b3116101c3578063095ea7b31461028f57806323b872dd146102ab5780632a55205a146102c7578063337648b2146102f8576101f0565b806301ffc9a7146101f557806302fe53051461022557806306fdde0314610241578063081812fc1461025f575b600080fd5b61020f600480360381019061020a91906127a9565b61063a565b60405161021c91906127f1565b60405180910390f35b61023f600480360381019061023a9190612952565b61064c565b005b6102496106b2565b6040516102569190612a23565b60405180910390f35b61027960048036038101906102749190612a7b565b610744565b6040516102869190612ae9565b60405180910390f35b6102a960048036038101906102a49190612b30565b61078a565b005b6102c560048036038101906102c09190612b70565b6107a3565b005b6102e160048036038101906102dc9190612bc3565b6107f2565b6040516102ef929190612c12565b60405180910390f35b610312600480360381019061030d9190612de4565b6108c3565b005b61032e60048036038101906103299190612e5c565b6109e1565b005b610338610a2d565b6040516103459190612a23565b60405180910390f35b610356610abb565b6040516103639190612ee8565b60405180910390f35b61038660048036038101906103819190612b70565b610acd565b005b610390610b1c565b60405161039d9190612ae9565b60405180910390f35b6103c060048036038101906103bb9190612a7b565b610b42565b6040516103cd9190612ae9565b60405180910390f35b6103f060048036038101906103eb9190612e5c565b610bc8565b005b61040c60048036038101906104079190612e5c565b610c14565b6040516104199190612f03565b60405180910390f35b61043c60048036038101906104379190612e5c565b610c2c565b6040516104499190612f03565b60405180910390f35b61045a610ce3565b005b61047660048036038101906104719190612a7b565b610cf7565b6040516104839190612a23565b60405180910390f35b6104a660048036038101906104a19190612f1e565b610d97565b005b6104c260048036038101906104bd9190612f7a565b610e1d565b005b6104cc6110d4565b6040516104d99190612ae9565b60405180910390f35b6104ea6110fe565b6040516104f79190612a23565b60405180910390f35b61051a60048036038101906105159190612a7b565b611190565b6040516105279190612ae9565b60405180910390f35b61054a600480360381019061054591906130e6565b6111c3565b005b610566600480360381019061056191906131f3565b6112f2565b005b610582600480360381019061057d91906132d4565b61130b565b005b61059e60048036038101906105999190612a7b565b61135c565b6040516105ab9190612a23565b60405180910390f35b6105bc61136e565b6040516105c99190612ae9565b60405180910390f35b6105ec60048036038101906105e79190613357565b611394565b005b610608600480360381019061060391906133aa565b6113ac565b60405161061591906127f1565b60405180910390f35b61063860048036038101906106339190612e5c565b611440565b005b6000610645826114c3565b9050919050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146106a657600080fd5b6106af8161153d565b50565b6060600080546106c190613419565b80601f01602080910402602001604051908101604052809291908181526020018280546106ed90613419565b801561073a5780601f1061070f5761010080835404028352916020019161073a565b820191906000526020600020905b81548152906001019060200180831161071d57829003601f168201915b5050505050905090565b600061074f82611557565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81610794816115a2565b61079e838361169f565b505050565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146107e1576107e0336115a2565b5b6107ec8484846117b6565b50505050565b6000806000600960008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900462ffffff1662ffffff1662ffffff1681525050905080600001519250612710816020015162ffffff16856108af9190613479565b6108b99190613502565b9150509250929050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461091d57600080fd5b8051825114610961576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109589061357f565b60405180910390fd5b60005b82518110156109dc578181815181106109805761097f61359f565b5b60200260200101516006600085848151811061099f5761099e61359f565b5b6020026020010151815260200190815260200160002090805190602001906109c892919061269a565b5080806109d4906135ce565b915050610964565b505050565b6109e9611816565b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60078054610a3a90613419565b80601f0160208091040260200160405190810160405280929190818152602001828054610a6690613419565b8015610ab35780601f10610a8857610100808354040283529160200191610ab3565b820191906000526020600020905b815481529060010190602001808311610a9657829003601f168201915b505050505081565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b0b57610b0a336115a2565b5b610b16848484611894565b50505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080610b4e836118b4565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610bbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb690613662565b60405180910390fd5b80915050919050565b610bd0611816565b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60036020528060005260406000206000915090505481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c93906136f4565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610ceb611816565b610cf560006118f1565b565b60066020528060005260406000206000915090508054610d1690613419565b80601f0160208091040260200160405190810160405280929190818152602001828054610d4290613419565b8015610d8f5780601f10610d6457610100808354040283529160200191610d8f565b820191906000526020600020905b815481529060010190602001808311610d7257829003601f168201915b505050505081565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610df157600080fd5b80600660008481526020019081526020016000209080519060200190610e1892919061269a565b505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e7757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610ee6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edd90613760565b60405180910390fd5b610eef846119b7565b15610f2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f26906137cc565b60405180910390fd5b6001600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610f7f91906137ec565b92505081905550846002600086815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600660008681526020019081526020016000209080519060200190610fff92919061269a565b506000811115611015576110148483836119f8565b5b838673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461110d90613419565b80601f016020809104026020016040519081016040528092919081815260200182805461113990613419565b80156111865780601f1061115b57610100808354040283529160200191611186565b820191906000526020600020905b81548152906001019060200180831161116957829003601f168201915b5050505050905090565b60026020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461121d57600080fd5b8551845114801561122f575082518451145b61126e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112659061388e565b60405180910390fd5b60005b84518110156112e9576112d6868883815181106112915761129061359f565b5b60200260200101518784815181106112ac576112ab61359f565b5b60200260200101518785815181106112c7576112c661359f565b5b60200260200101518787610e1d565b80806112e1906135ce565b915050611271565b50505050505050565b816112fc816115a2565b6113068383611af4565b505050565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461134957611348336115a2565b5b61135585858585611b0a565b5050505050565b606061136782611b6c565b9050919050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61139c611816565b6113a78383836119f8565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611448611816565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036114b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ae90613920565b60405180910390fd5b6114c0816118f1565b50565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611536575061153582611c61565b5b9050919050565b806007908051906020019061155392919061269a565b5050565b611560816119b7565b61159f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159690613662565b60405180910390fd5b50565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561169c576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611619929190613940565b602060405180830381865afa158015611636573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061165a919061397e565b61169b57806040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016116929190612ae9565b60405180910390fd5b5b50565b60006116aa82610b42565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361171a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171190613a1d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16611739611d43565b73ffffffffffffffffffffffffffffffffffffffff161480611768575061176781611762611d43565b6113ac565b5b6117a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179e90613aaf565b60405180910390fd5b6117b18383611d4b565b505050565b6117c76117c1611d43565b82611e04565b611806576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117fd90613b41565b60405180910390fd5b611811838383611e99565b505050565b61181e611d43565b73ffffffffffffffffffffffffffffffffffffffff1661183c6110d4565b73ffffffffffffffffffffffffffffffffffffffff1614611892576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188990613bad565b60405180910390fd5b565b6118af8383836040518060200160405280600081525061130b565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008073ffffffffffffffffffffffffffffffffffffffff166119d9836118b4565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b612710811115611a3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3490613c19565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff1681526020018262ffffff168152506009600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548162ffffff021916908362ffffff160217905550905050505050565b611b06611aff611d43565b8383612192565b5050565b611b1b611b15611d43565b83611e04565b611b5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5190613b41565b60405180910390fd5b611b66848484846122fe565b50505050565b6060611b7782611557565b600060078054611b8690613419565b80601f0160208091040260200160405190810160405280929190818152602001828054611bb290613419565b8015611bff5780601f10611bd457610100808354040283529160200191611bff565b820191906000526020600020905b815481529060010190602001808311611be257829003601f168201915b505050505090506000815111611c245760405180602001604052806000815250611c59565b8060066000858152602001908152602001600020604051602001611c49929190613d09565b6040516020818303038152906040525b915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611d2c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611d3c5750611d3b8261235a565b5b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611dbe83610b42565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611e1083610b42565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611e525750611e5181856113ac565b5b80611e9057508373ffffffffffffffffffffffffffffffffffffffff16611e7884610744565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611eb982610b42565b73ffffffffffffffffffffffffffffffffffffffff1614611f0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0690613d9f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7590613e31565b60405180910390fd5b611f8b83838360016123c4565b8273ffffffffffffffffffffffffffffffffffffffff16611fab82610b42565b73ffffffffffffffffffffffffffffffffffffffff1614612001576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff890613d9f565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461218d83838360016124ea565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612200576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f790613e9d565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516122f191906127f1565b60405180910390a3505050565b612309848484611e99565b612315848484846124f0565b612354576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234b90613f2f565b60405180910390fd5b50505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60018111156124e457600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146124585780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124509190613f4f565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146124e35780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124db91906137ec565b925050819055505b5b50505050565b50505050565b60006125118473ffffffffffffffffffffffffffffffffffffffff16612677565b1561266a578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261253a611d43565b8786866040518563ffffffff1660e01b815260040161255c9493929190613fd8565b6020604051808303816000875af192505050801561259857506040513d601f19601f820116820180604052508101906125959190614039565b60015b61261a573d80600081146125c8576040519150601f19603f3d011682016040523d82523d6000602084013e6125cd565b606091505b506000815103612612576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260990613f2f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061266f565b600190505b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b8280546126a690613419565b90600052602060002090601f0160209004810192826126c8576000855561270f565b82601f106126e157805160ff191683800117855561270f565b8280016001018555821561270f579182015b8281111561270e5782518255916020019190600101906126f3565b5b50905061271c9190612720565b5090565b5b80821115612739576000816000905550600101612721565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61278681612751565b811461279157600080fd5b50565b6000813590506127a38161277d565b92915050565b6000602082840312156127bf576127be612747565b5b60006127cd84828501612794565b91505092915050565b60008115159050919050565b6127eb816127d6565b82525050565b600060208201905061280660008301846127e2565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61285f82612816565b810181811067ffffffffffffffff8211171561287e5761287d612827565b5b80604052505050565b600061289161273d565b905061289d8282612856565b919050565b600067ffffffffffffffff8211156128bd576128bc612827565b5b6128c682612816565b9050602081019050919050565b82818337600083830152505050565b60006128f56128f0846128a2565b612887565b90508281526020810184848401111561291157612910612811565b5b61291c8482856128d3565b509392505050565b600082601f8301126129395761293861280c565b5b81356129498482602086016128e2565b91505092915050565b60006020828403121561296857612967612747565b5b600082013567ffffffffffffffff8111156129865761298561274c565b5b61299284828501612924565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156129d55780820151818401526020810190506129ba565b838111156129e4576000848401525b50505050565b60006129f58261299b565b6129ff81856129a6565b9350612a0f8185602086016129b7565b612a1881612816565b840191505092915050565b60006020820190508181036000830152612a3d81846129ea565b905092915050565b6000819050919050565b612a5881612a45565b8114612a6357600080fd5b50565b600081359050612a7581612a4f565b92915050565b600060208284031215612a9157612a90612747565b5b6000612a9f84828501612a66565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612ad382612aa8565b9050919050565b612ae381612ac8565b82525050565b6000602082019050612afe6000830184612ada565b92915050565b612b0d81612ac8565b8114612b1857600080fd5b50565b600081359050612b2a81612b04565b92915050565b60008060408385031215612b4757612b46612747565b5b6000612b5585828601612b1b565b9250506020612b6685828601612a66565b9150509250929050565b600080600060608486031215612b8957612b88612747565b5b6000612b9786828701612b1b565b9350506020612ba886828701612b1b565b9250506040612bb986828701612a66565b9150509250925092565b60008060408385031215612bda57612bd9612747565b5b6000612be885828601612a66565b9250506020612bf985828601612a66565b9150509250929050565b612c0c81612a45565b82525050565b6000604082019050612c276000830185612ada565b612c346020830184612c03565b9392505050565b600067ffffffffffffffff821115612c5657612c55612827565b5b602082029050602081019050919050565b600080fd5b6000612c7f612c7a84612c3b565b612887565b90508083825260208201905060208402830185811115612ca257612ca1612c67565b5b835b81811015612ccb5780612cb78882612a66565b845260208401935050602081019050612ca4565b5050509392505050565b600082601f830112612cea57612ce961280c565b5b8135612cfa848260208601612c6c565b91505092915050565b600067ffffffffffffffff821115612d1e57612d1d612827565b5b602082029050602081019050919050565b6000612d42612d3d84612d03565b612887565b90508083825260208201905060208402830185811115612d6557612d64612c67565b5b835b81811015612dac57803567ffffffffffffffff811115612d8a57612d8961280c565b5b808601612d978982612924565b85526020850194505050602081019050612d67565b5050509392505050565b600082601f830112612dcb57612dca61280c565b5b8135612ddb848260208601612d2f565b91505092915050565b60008060408385031215612dfb57612dfa612747565b5b600083013567ffffffffffffffff811115612e1957612e1861274c565b5b612e2585828601612cd5565b925050602083013567ffffffffffffffff811115612e4657612e4561274c565b5b612e5285828601612db6565b9150509250929050565b600060208284031215612e7257612e71612747565b5b6000612e8084828501612b1b565b91505092915050565b6000819050919050565b6000612eae612ea9612ea484612aa8565b612e89565b612aa8565b9050919050565b6000612ec082612e93565b9050919050565b6000612ed282612eb5565b9050919050565b612ee281612ec7565b82525050565b6000602082019050612efd6000830184612ed9565b92915050565b6000602082019050612f186000830184612c03565b92915050565b60008060408385031215612f3557612f34612747565b5b6000612f4385828601612a66565b925050602083013567ffffffffffffffff811115612f6457612f6361274c565b5b612f7085828601612924565b9150509250929050565b60008060008060008060c08789031215612f9757612f96612747565b5b6000612fa589828a01612b1b565b9650506020612fb689828a01612b1b565b9550506040612fc789828a01612a66565b945050606087013567ffffffffffffffff811115612fe857612fe761274c565b5b612ff489828a01612924565b935050608061300589828a01612b1b565b92505060a061301689828a01612a66565b9150509295509295509295565b600067ffffffffffffffff82111561303e5761303d612827565b5b602082029050602081019050919050565b600061306261305d84613023565b612887565b9050808382526020820190506020840283018581111561308557613084612c67565b5b835b818110156130ae578061309a8882612b1b565b845260208401935050602081019050613087565b5050509392505050565b600082601f8301126130cd576130cc61280c565b5b81356130dd84826020860161304f565b91505092915050565b60008060008060008060c0878903121561310357613102612747565b5b600087013567ffffffffffffffff8111156131215761312061274c565b5b61312d89828a016130b8565b965050602061313e89828a01612b1b565b955050604087013567ffffffffffffffff81111561315f5761315e61274c565b5b61316b89828a01612cd5565b945050606087013567ffffffffffffffff81111561318c5761318b61274c565b5b61319889828a01612db6565b93505060806131a989828a01612b1b565b92505060a06131ba89828a01612a66565b9150509295509295509295565b6131d0816127d6565b81146131db57600080fd5b50565b6000813590506131ed816131c7565b92915050565b6000806040838503121561320a57613209612747565b5b600061321885828601612b1b565b9250506020613229858286016131de565b9150509250929050565b600067ffffffffffffffff82111561324e5761324d612827565b5b61325782612816565b9050602081019050919050565b600061327761327284613233565b612887565b90508281526020810184848401111561329357613292612811565b5b61329e8482856128d3565b509392505050565b600082601f8301126132bb576132ba61280c565b5b81356132cb848260208601613264565b91505092915050565b600080600080608085870312156132ee576132ed612747565b5b60006132fc87828801612b1b565b945050602061330d87828801612b1b565b935050604061331e87828801612a66565b925050606085013567ffffffffffffffff81111561333f5761333e61274c565b5b61334b878288016132a6565b91505092959194509250565b6000806000606084860312156133705761336f612747565b5b600061337e86828701612a66565b935050602061338f86828701612b1b565b92505060406133a086828701612a66565b9150509250925092565b600080604083850312156133c1576133c0612747565b5b60006133cf85828601612b1b565b92505060206133e085828601612b1b565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061343157607f821691505b602082108103613444576134436133ea565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061348482612a45565b915061348f83612a45565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156134c8576134c761344a565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061350d82612a45565b915061351883612a45565b925082613528576135276134d3565b5b828204905092915050565b7f455243313135353a20417272617973206c656e677468206d69736d6174636800600082015250565b6000613569601f836129a6565b915061357482613533565b602082019050919050565b600060208201905081810360008301526135988161355c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006135d982612a45565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361360b5761360a61344a565b5b600182019050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b600061364c6018836129a6565b915061365782613616565b602082019050919050565b6000602082019050818103600083015261367b8161363f565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006136de6029836129a6565b91506136e982613682565b604082019050919050565b6000602082019050818103600083015261370d816136d1565b9050919050565b7f6d696e7420746f20746865207a65726f20616464726573730000000000000000600082015250565b600061374a6018836129a6565b915061375582613714565b602082019050919050565b600060208201905081810360008301526137798161373d565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006137b6601c836129a6565b91506137c182613780565b602082019050919050565b600060208201905081810360008301526137e5816137a9565b9050919050565b60006137f782612a45565b915061380283612a45565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156138375761383661344a565b5b828201905092915050565b7f417272617973206c656e677468206d69736d6174636800000000000000000000600082015250565b60006138786016836129a6565b915061388382613842565b602082019050919050565b600060208201905081810360008301526138a78161386b565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061390a6026836129a6565b9150613915826138ae565b604082019050919050565b60006020820190508181036000830152613939816138fd565b9050919050565b60006040820190506139556000830185612ada565b6139626020830184612ada565b9392505050565b600081519050613978816131c7565b92915050565b60006020828403121561399457613993612747565b5b60006139a284828501613969565b91505092915050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613a076021836129a6565b9150613a12826139ab565b604082019050919050565b60006020820190508181036000830152613a36816139fa565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000613a99603d836129a6565b9150613aa482613a3d565b604082019050919050565b60006020820190508181036000830152613ac881613a8c565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000613b2b602d836129a6565b9150613b3682613acf565b604082019050919050565b60006020820190508181036000830152613b5a81613b1e565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613b976020836129a6565b9150613ba282613b61565b602082019050919050565b60006020820190508181036000830152613bc681613b8a565b9050919050565b7f45524332393831526f79616c746965733a20546f6f2068696768000000000000600082015250565b6000613c03601a836129a6565b9150613c0e82613bcd565b602082019050919050565b60006020820190508181036000830152613c3281613bf6565b9050919050565b600081905092915050565b6000613c4f8261299b565b613c598185613c39565b9350613c698185602086016129b7565b80840191505092915050565b60008190508160005260206000209050919050565b60008154613c9781613419565b613ca18186613c39565b94506001821660008114613cbc5760018114613ccd57613d00565b60ff19831686528186019350613d00565b613cd685613c75565b60005b83811015613cf857815481890152600182019150602081019050613cd9565b838801955050505b50505092915050565b6000613d158285613c44565b9150613d218284613c8a565b91508190509392505050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000613d896025836129a6565b9150613d9482613d2d565b604082019050919050565b60006020820190508181036000830152613db881613d7c565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613e1b6024836129a6565b9150613e2682613dbf565b604082019050919050565b60006020820190508181036000830152613e4a81613e0e565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613e876019836129a6565b9150613e9282613e51565b602082019050919050565b60006020820190508181036000830152613eb681613e7a565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000613f196032836129a6565b9150613f2482613ebd565b604082019050919050565b60006020820190508181036000830152613f4881613f0c565b9050919050565b6000613f5a82612a45565b9150613f6583612a45565b925082821015613f7857613f7761344a565b5b828203905092915050565b600081519050919050565b600082825260208201905092915050565b6000613faa82613f83565b613fb48185613f8e565b9350613fc48185602086016129b7565b613fcd81612816565b840191505092915050565b6000608082019050613fed6000830187612ada565b613ffa6020830186612ada565b6140076040830185612c03565b81810360608301526140198184613f9f565b905095945050505050565b6000815190506140338161277d565b92915050565b60006020828403121561404f5761404e612747565b5b600061405d84828501614024565b9150509291505056fea26469706673582212200247141e877e49699df1af7203af3c597417501b5dbe7133882a1d0dd9e5fd4564736f6c634300080d0033

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

0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000e445fb0297f7d1f507df708185946210eb6a9de60000000000000000000000001bfe7452477accc0188c34b3a4e8e3b15bf671b00000000000000000000000000000000000000000000000000000000000000007697066733a2f2f00000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : uri_ (string): ipfs://
Arg [1] : minter_ (address): 0xe445Fb0297F7D1f507dF708185946210eB6a9DE6
Arg [2] : gatewayManager_ (address): 0x1BFe7452477Accc0188c34B3a4e8E3B15bF671B0

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 000000000000000000000000e445fb0297f7d1f507df708185946210eb6a9de6
Arg [2] : 0000000000000000000000001bfe7452477accc0188c34b3a4e8e3b15bf671b0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [4] : 697066733a2f2f00000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

266:6083:13:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4584:216;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5582:96;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2844:98:6;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4280:211;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;921:183:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1160:191;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;836:329:5;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;5999:348:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5395:118;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1380:22:6;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;737:142:15;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1407:199:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1900:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2519:263:6;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5209:102:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;926:44:6;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2180:282;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1824:101:16;;;:::i;:::-;;1255:39:6;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5771:135:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2304:651;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1194:85:16;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3006:102:6;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;833:42;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3464:676:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;663:202;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1662:232;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4340:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1936:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4926:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4805:206:6;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2074:198:16;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4584:216:13;4730:4;4757:36;4781:11;4757:23;:36::i;:::-;4750:43;;4584:216;;;:::o;5582:96::-;4301:14;;;;;;;;;;;4287:28;;:10;:28;;;4279:37;;;;;;5656:15:::1;5664:6;5656:7;:15::i;:::-;5582:96:::0;:::o;2844:98:6:-;2898:13;2930:5;2923:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2844:98;:::o;4280:211::-;4396:7;4419:23;4434:7;4419:14;:23::i;:::-;4460:15;:24;4476:7;4460:24;;;;;;;;;;;;;;;;;;;;;4453:31;;4280:211;;;:::o;921:183:13:-;1041:8;2227:30:15;2248:8;2227:20;:30::i;:::-;1065:32:13::1;1079:8;1089:7;1065:13;:32::i;:::-;921:183:::0;;;:::o;1160:191::-;1291:4;2062:10:15;2054:18;;:4;:18;;;2050:81;;2088:32;2109:10;2088:20;:32::i;:::-;2050:81;1307:37:13::1;1326:4;1332:2;1336:7;1307:18;:37::i;:::-;1160:191:::0;;;;:::o;836:329:5:-;953:16;971:21;1008:28;1039:10;:19;1050:7;1039:19;;;;;;;;;;;1008:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1079:9;:19;;;1068:30;;1153:5;1133:9;:16;;;1125:24;;:5;:24;;;;:::i;:::-;1124:34;;;;:::i;:::-;1108:50;;998:167;836:329;;;;;:::o;5999:348:13:-;4301:14;;;;;;;;;;;4287:28;;:10;:28;;;4279:37;;;;;;6162:5:::1;:12;6143:8;:15;:31;6122:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;6246:9;6241:100;6265:8;:15;6261:1;:19;6241:100;;;6322:5;6328:1;6322:8;;;;;;;;:::i;:::-;;;;;;;;6301:5;:18;6307:8;6316:1;6307:11;;;;;;;;:::i;:::-;;;;;;;;6301:18;;;;;;;;;;;:29;;;;;;;;;;;;:::i;:::-;;6282:3;;;;;:::i;:::-;;;;6241:100;;;;5999:348:::0;;:::o;5395:118::-;1087:13:16;:11;:13::i;:::-;5491:15:13::1;5474:14;;:32;;;;;;;;;;;;;;;;;;5395:118:::0;:::o;1380:22:6:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;737:142:15:-;836:42;737:142;:::o;1407:199:13:-;1542:4;2062:10:15;2054:18;;:4;:18;;;2050:81;;2088:32;2109:10;2088:20;:32::i;:::-;2050:81;1558:41:13::1;1581:4;1587:2;1591:7;1558:22;:41::i;:::-;1407:199:::0;;;;:::o;1900:29::-;;;;;;;;;;;;;:::o;2519:263:6:-;2631:7;2654:13;2670:17;2679:7;2670:8;:17::i;:::-;2654:33;;2722:1;2705:19;;:5;:19;;;2697:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;2770:5;2763:12;;;2519:263;;;:::o;5209:102:13:-;1087:13:16;:11;:13::i;:::-;5297:7:13::1;5280:14;;:24;;;;;;;;;;;;;;;;;;5209:102:::0;:::o;926:44:6:-;;;;;;;;;;;;;;;;;:::o;2180:282::-;2292:7;2353:1;2336:19;;:5;:19;;;2315:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;2439:9;:16;2449:5;2439:16;;;;;;;;;;;;;;;;2432:23;;2180:282;;;:::o;1824:101:16:-;1087:13;:11;:13::i;:::-;1888:30:::1;1915:1;1888:18;:30::i;:::-;1824:101::o:0;1255:39:6:-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5771:135:13:-;4301:14;;;;;;;;;;;4287:28;;:10;:28;;;4279:37;;;;;;5896:3:::1;5879:5;:14;5885:7;5879:14;;;;;;;;;;;:20;;;;;;;;;;;;:::i;:::-;;5771:135:::0;;:::o;2304:651::-;4200:14;;;;;;;;;;;4186:28;;:10;:28;;;4178:37;;;;;;2546:1:::1;2532:16;;:2;:16;;::::0;2524:53:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2596:16;2604:7;2596;:16::i;:::-;2595:17;2587:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;2673:1;2656:9;:13;2666:2;2656:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;2703:2;2684:7;:16;2692:7;2684:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;2732:3;2715:5;:14;2721:7;2715:14;;;;;;;;;;;:20;;;;;;;;;;;;:::i;:::-;;2765:1;2750:12;:16;2746:104;;;2782:57;2799:7;2808:16;2826:12;2782:16;:57::i;:::-;2746:104;2895:7;2886;2865:38;;2882:1;2865:38;;;;;;;;;;;;2940:7;2936:2;2918:30;;2927:7;2918:30;;;;;;;;;;;;2304:651:::0;;;;;;:::o;1194:85:16:-;1240:7;1266:6;;;;;;;;;;;1259:13;;1194:85;:::o;3006:102:6:-;3062:13;3094:7;3087:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3006:102;:::o;833:42::-;;;;;;;;;;;;;;;;;;;;;;:::o;3464:676:13:-;4200:14;;;;;;;;;;;4186:28;;:10;:28;;;4178:37;;;;;;3756:2:::1;:9;3737:8;:15;:28;:67;;;;;3788:9;:16;3769:8;:15;:35;3737:67;3716:136;;;;;;;;;;;;:::i;:::-;;;;;;;;;3868:9;3863:271;3887:8;:15;3883:1;:19;3863:271;;;3923:200;3956:7;3981:2;3984:1;3981:5;;;;;;;;:::i;:::-;;;;;;;;4004:8;4013:1;4004:11;;;;;;;;:::i;:::-;;;;;;;;4033:9;4043:1;4033:12;;;;;;;;:::i;:::-;;;;;;;;4063:16;4097:12;3923:15;:200::i;:::-;3904:3;;;;;:::i;:::-;;;;3863:271;;;;3464:676:::0;;;;;;:::o;663:202::-;791:8;2227:30:15;2248:8;2227:20;:30::i;:::-;815:43:13::1;839:8;849;815:23;:43::i;:::-;663:202:::0;;;:::o;1662:232::-;1824:4;2062:10:15;2054:18;;:4;:18;;;2050:81;;2088:32;2109:10;2088:20;:32::i;:::-;2050:81;1840:47:13::1;1863:4;1869:2;1873:7;1882:4;1840:22;:47::i;:::-;1662:232:::0;;;;;:::o;4340:171::-;4445:13;4481:23;4496:7;4481:14;:23::i;:::-;4474:30;;4340:171;;;:::o;1936:29::-;;;;;;;;;;;;;:::o;4926:208::-;1087:13:16;:11;:13::i;:::-;5070:57:13::1;5087:7;5096:16;5114:12;5070:16;:57::i;:::-;4926:208:::0;;;:::o;4805:206:6:-;4942:4;4969:18;:25;4988:5;4969:25;;;;;;;;;;;;;;;:35;4995:8;4969:35;;;;;;;;;;;;;;;;;;;;;;;;;4962:42;;4805:206;;;;:::o;2074:198:16:-;1087:13;:11;:13::i;:::-;2182:1:::1;2162:22;;:8;:22;;::::0;2154:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2237:28;2256:8;2237:18;:28::i;:::-;2074:198:::0;:::o;365:273:4:-;490:4;544:35;529:50;;;:11;:50;;;;:102;;;;595:36;619:11;595:23;:36::i;:::-;529:102;510:121;;365:273;;;:::o;3664:92:6:-;3742:7;3731:8;:18;;;;;;;;;;;;:::i;:::-;;3664:92;:::o;13268:133::-;13349:16;13357:7;13349;:16::i;:::-;13341:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;13268:133;:::o;2281:412:15:-;2518:1;836:42;2470:45;;;:49;2466:221;;;836:42;2540;;;2591:4;2598:8;2540:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2535:142;;2653:8;2634:28;;;;;;;;;;;:::i;:::-;;;;;;;;2535:142;2466:221;2281:412;:::o;3813:406:6:-;3893:13;3909:23;3924:7;3909:14;:23::i;:::-;3893:39;;3956:5;3950:11;;:2;:11;;;3942:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;4047:5;4031:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;4056:37;4073:5;4080:12;:10;:12::i;:::-;4056:16;:37::i;:::-;4031:62;4010:170;;;;;;;;;;;;:::i;:::-;;;;;;;;;4191:21;4200:2;4204:7;4191:8;:21::i;:::-;3883:336;3813:406;;:::o;5073:360::-;5275:41;5294:12;:10;:12::i;:::-;5308:7;5275:18;:41::i;:::-;5254:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;5398:28;5408:4;5414:2;5418:7;5398:9;:28::i;:::-;5073:360;;;:::o;1352:130:16:-;1426:12;:10;:12::i;:::-;1415:23;;:7;:5;:7::i;:::-;:23;;;1407:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1352:130::o;5499:179:6:-;5632:39;5649:4;5655:2;5659:7;5632:39;;;;;;;;;;;;:16;:39::i;:::-;5499:179;;;:::o;7401:115::-;7467:7;7493;:16;7501:7;7493:16;;;;;;;;;;;;;;;;;;;;;7486:23;;7401:115;;;:::o;2426:187:16:-;2499:16;2518:6;;;;;;;;;;;2499:25;;2543:8;2534:6;;:17;;;;;;;;;;;;;;;;;;2597:8;2566:40;;2587:8;2566:40;;;;;;;;;;;;2489:124;2426:187;:::o;7819:126:6:-;7884:4;7936:1;7907:31;;:17;7916:7;7907:8;:17::i;:::-;:31;;;;7900:38;;7819:126;;;:::o;537:255:5:-;680:5;671;:14;;663:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;748:37;;;;;;;;760:9;748:37;;;;;;778:5;748:37;;;;;726:10;:19;737:7;726:19;;;;;;;;;;;:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;537:255;;;:::o;4558:181:6:-;4680:52;4699:12;:10;:12::i;:::-;4713:8;4723;4680:18;:52::i;:::-;4558:181;;:::o;5744:348::-;5925:41;5944:12;:10;:12::i;:::-;5958:7;5925:18;:41::i;:::-;5904:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;6047:38;6061:4;6067:2;6071:7;6080:4;6047:13;:38::i;:::-;5744:348;;;;:::o;3174:358::-;3287:13;3316:23;3331:7;3316:14;:23::i;:::-;3350:21;3374:8;3350:32;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3435:1;3417:7;3411:21;:25;:114;;;;;;;;;;;;;;;;;3479:7;3488:5;:14;3494:7;3488:14;;;;;;;;;;;3462:41;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3411:114;3392:133;;;3174:358;;;:::o;1777:344::-;1919:4;1973:25;1958:40;;;:11;:40;;;;:104;;;;2029:33;2014:48;;;:11;:48;;;;1958:104;:156;;;;2078:36;2102:11;2078:23;:36::i;:::-;1958:156;1939:175;;1777:344;;;:::o;640:96:1:-;693:7;719:10;712:17;;640:96;:::o;12570:171:6:-;12671:2;12644:15;:24;12660:7;12644:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;12726:7;12722:2;12688:46;;12697:23;12712:7;12697:14;:23::i;:::-;12688:46;;;;;;;;;;;;12570:171;;:::o;8103:321::-;8228:4;8248:13;8264:23;8279:7;8264:14;:23::i;:::-;8248:39;;8316:5;8305:16;;:7;:16;;;:64;;;;8337:32;8354:5;8361:7;8337:16;:32::i;:::-;8305:64;:111;;;;8409:7;8385:31;;:20;8397:7;8385:11;:20::i;:::-;:31;;;8305:111;8297:120;;;8103:321;;;;:::o;11157:1301::-;11324:4;11297:31;;:23;11312:7;11297:14;:23::i;:::-;:31;;;11276:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;11423:1;11409:16;;:2;:16;;;11401:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;11477:42;11498:4;11504:2;11508:7;11517:1;11477:20;:42::i;:::-;11659:4;11632:31;;:23;11647:7;11632:14;:23::i;:::-;:31;;;11611:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;11795:15;:24;11811:7;11795:24;;;;;;;;;;;;11788:31;;;;;;;;;;;12282:1;12263:9;:15;12273:4;12263:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;12314:1;12297:9;:13;12307:2;12297:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;12354:2;12335:7;:16;12343:7;12335:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;12391:7;12387:2;12372:27;;12381:4;12372:27;;;;;;;;;;;;12410:41;12430:4;12436:2;12440:7;12449:1;12410:19;:41::i;:::-;11157:1301;;;:::o;12877:307::-;13027:8;13018:17;;:5;:17;;;13010:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;13113:8;13075:18;:25;13094:5;13075:25;;;;;;;;;;;;;;;:35;13101:8;13075:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;13158:8;13136:41;;13151:5;13136:41;;;13168:8;13136:41;;;;;;:::i;:::-;;;;;;;;12877:307;;;:::o;6953:339::-;7103:28;7113:4;7119:2;7123:7;7103:9;:28::i;:::-;7162:47;7185:4;7191:2;7195:7;7204:4;7162:22;:47::i;:::-;7141:144;;;;;;;;;;;;:::i;:::-;;;;;;;;;6953:339;;;;:::o;829:155:3:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;15672:396:6:-;15856:1;15844:9;:13;15840:222;;;15893:1;15877:18;;:4;:18;;;15873:85;;15934:9;15915;:15;15925:4;15915:15;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;15873:85;15989:1;15975:16;;:2;:16;;;15971:81;;16028:9;16011;:13;16021:2;16011:13;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;15971:81;15840:222;15672:396;;;;:::o;16774:153::-;;;;;:::o;13953:1003::-;14102:4;14122:15;:2;:13;;;:15::i;:::-;14118:832;;;14189:2;14173:36;;;14231:12;:10;:12::i;:::-;14265:4;14291:7;14320:4;14173:169;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;14153:745;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14538:1;14521:6;:13;:18;14517:367;;14563:106;;;;;;;;;;:::i;:::-;;;;;;;;14517:367;14836:6;14830:13;14821:6;14817:2;14813:15;14806:38;14153:745;14414:41;;;14404:51;;;:6;:51;;;;14397:58;;;;;14118:832;14935:4;14928:11;;13953:1003;;;;;;;:::o;1175:320:0:-;1235:4;1487:1;1465:7;:19;;;:23;1458:30;;1175:320;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:18:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:117::-;1627:1;1624;1617:12;1641:117;1750:1;1747;1740:12;1764:102;1805:6;1856:2;1852:7;1847:2;1840:5;1836:14;1832:28;1822:38;;1764:102;;;:::o;1872:180::-;1920:77;1917:1;1910:88;2017:4;2014:1;2007:15;2041:4;2038:1;2031:15;2058:281;2141:27;2163:4;2141:27;:::i;:::-;2133:6;2129:40;2271:6;2259:10;2256:22;2235:18;2223:10;2220:34;2217:62;2214:88;;;2282:18;;:::i;:::-;2214:88;2322:10;2318:2;2311:22;2101:238;2058:281;;:::o;2345:129::-;2379:6;2406:20;;:::i;:::-;2396:30;;2435:33;2463:4;2455:6;2435:33;:::i;:::-;2345:129;;;:::o;2480:308::-;2542:4;2632:18;2624:6;2621:30;2618:56;;;2654:18;;:::i;:::-;2618:56;2692:29;2714:6;2692:29;:::i;:::-;2684:37;;2776:4;2770;2766:15;2758:23;;2480:308;;;:::o;2794:154::-;2878:6;2873:3;2868;2855:30;2940:1;2931:6;2926:3;2922:16;2915:27;2794:154;;;:::o;2954:412::-;3032:5;3057:66;3073:49;3115:6;3073:49;:::i;:::-;3057:66;:::i;:::-;3048:75;;3146:6;3139:5;3132:21;3184:4;3177:5;3173:16;3222:3;3213:6;3208:3;3204:16;3201:25;3198:112;;;3229:79;;:::i;:::-;3198:112;3319:41;3353:6;3348:3;3343;3319:41;:::i;:::-;3038:328;2954:412;;;;;:::o;3386:340::-;3442:5;3491:3;3484:4;3476:6;3472:17;3468:27;3458:122;;3499:79;;:::i;:::-;3458:122;3616:6;3603:20;3641:79;3716:3;3708:6;3701:4;3693:6;3689:17;3641:79;:::i;:::-;3632:88;;3448:278;3386:340;;;;:::o;3732:509::-;3801:6;3850:2;3838:9;3829:7;3825:23;3821:32;3818:119;;;3856:79;;:::i;:::-;3818:119;4004:1;3993:9;3989:17;3976:31;4034:18;4026:6;4023:30;4020:117;;;4056:79;;:::i;:::-;4020:117;4161:63;4216:7;4207:6;4196:9;4192:22;4161:63;:::i;:::-;4151:73;;3947:287;3732:509;;;;:::o;4247:99::-;4299:6;4333:5;4327:12;4317:22;;4247:99;;;:::o;4352:169::-;4436:11;4470:6;4465:3;4458:19;4510:4;4505:3;4501:14;4486:29;;4352:169;;;;:::o;4527:307::-;4595:1;4605:113;4619:6;4616:1;4613:13;4605:113;;;4704:1;4699:3;4695:11;4689:18;4685:1;4680:3;4676:11;4669:39;4641:2;4638:1;4634:10;4629:15;;4605:113;;;4736:6;4733:1;4730:13;4727:101;;;4816:1;4807:6;4802:3;4798:16;4791:27;4727:101;4576:258;4527:307;;;:::o;4840:364::-;4928:3;4956:39;4989:5;4956:39;:::i;:::-;5011:71;5075:6;5070:3;5011:71;:::i;:::-;5004:78;;5091:52;5136:6;5131:3;5124:4;5117:5;5113:16;5091:52;:::i;:::-;5168:29;5190:6;5168:29;:::i;:::-;5163:3;5159:39;5152:46;;4932:272;4840:364;;;;:::o;5210:313::-;5323:4;5361:2;5350:9;5346:18;5338:26;;5410:9;5404:4;5400:20;5396:1;5385:9;5381:17;5374:47;5438:78;5511:4;5502:6;5438:78;:::i;:::-;5430:86;;5210:313;;;;:::o;5529:77::-;5566:7;5595:5;5584:16;;5529:77;;;:::o;5612:122::-;5685:24;5703:5;5685:24;:::i;:::-;5678:5;5675:35;5665:63;;5724:1;5721;5714:12;5665:63;5612:122;:::o;5740:139::-;5786:5;5824:6;5811:20;5802:29;;5840:33;5867:5;5840:33;:::i;:::-;5740:139;;;;:::o;5885:329::-;5944:6;5993:2;5981:9;5972:7;5968:23;5964:32;5961:119;;;5999:79;;:::i;:::-;5961:119;6119:1;6144:53;6189:7;6180:6;6169:9;6165:22;6144:53;:::i;:::-;6134:63;;6090:117;5885:329;;;;:::o;6220:126::-;6257:7;6297:42;6290:5;6286:54;6275:65;;6220:126;;;:::o;6352:96::-;6389:7;6418:24;6436:5;6418:24;:::i;:::-;6407:35;;6352:96;;;:::o;6454:118::-;6541:24;6559:5;6541:24;:::i;:::-;6536:3;6529:37;6454:118;;:::o;6578:222::-;6671:4;6709:2;6698:9;6694:18;6686:26;;6722:71;6790:1;6779:9;6775:17;6766:6;6722:71;:::i;:::-;6578:222;;;;:::o;6806:122::-;6879:24;6897:5;6879:24;:::i;:::-;6872:5;6869:35;6859:63;;6918:1;6915;6908:12;6859:63;6806:122;:::o;6934:139::-;6980:5;7018:6;7005:20;6996:29;;7034:33;7061:5;7034:33;:::i;:::-;6934:139;;;;:::o;7079:474::-;7147:6;7155;7204:2;7192:9;7183:7;7179:23;7175:32;7172:119;;;7210:79;;:::i;:::-;7172:119;7330:1;7355:53;7400:7;7391:6;7380:9;7376:22;7355:53;:::i;:::-;7345:63;;7301:117;7457:2;7483:53;7528:7;7519:6;7508:9;7504:22;7483:53;:::i;:::-;7473:63;;7428:118;7079:474;;;;;:::o;7559:619::-;7636:6;7644;7652;7701:2;7689:9;7680:7;7676:23;7672:32;7669:119;;;7707:79;;:::i;:::-;7669:119;7827:1;7852:53;7897:7;7888:6;7877:9;7873:22;7852:53;:::i;:::-;7842:63;;7798:117;7954:2;7980:53;8025:7;8016:6;8005:9;8001:22;7980:53;:::i;:::-;7970:63;;7925:118;8082:2;8108:53;8153:7;8144:6;8133:9;8129:22;8108:53;:::i;:::-;8098:63;;8053:118;7559:619;;;;;:::o;8184:474::-;8252:6;8260;8309:2;8297:9;8288:7;8284:23;8280:32;8277:119;;;8315:79;;:::i;:::-;8277:119;8435:1;8460:53;8505:7;8496:6;8485:9;8481:22;8460:53;:::i;:::-;8450:63;;8406:117;8562:2;8588:53;8633:7;8624:6;8613:9;8609:22;8588:53;:::i;:::-;8578:63;;8533:118;8184:474;;;;;:::o;8664:118::-;8751:24;8769:5;8751:24;:::i;:::-;8746:3;8739:37;8664:118;;:::o;8788:332::-;8909:4;8947:2;8936:9;8932:18;8924:26;;8960:71;9028:1;9017:9;9013:17;9004:6;8960:71;:::i;:::-;9041:72;9109:2;9098:9;9094:18;9085:6;9041:72;:::i;:::-;8788:332;;;;;:::o;9126:311::-;9203:4;9293:18;9285:6;9282:30;9279:56;;;9315:18;;:::i;:::-;9279:56;9365:4;9357:6;9353:17;9345:25;;9425:4;9419;9415:15;9407:23;;9126:311;;;:::o;9443:117::-;9552:1;9549;9542:12;9583:710;9679:5;9704:81;9720:64;9777:6;9720:64;:::i;:::-;9704:81;:::i;:::-;9695:90;;9805:5;9834:6;9827:5;9820:21;9868:4;9861:5;9857:16;9850:23;;9921:4;9913:6;9909:17;9901:6;9897:30;9950:3;9942:6;9939:15;9936:122;;;9969:79;;:::i;:::-;9936:122;10084:6;10067:220;10101:6;10096:3;10093:15;10067:220;;;10176:3;10205:37;10238:3;10226:10;10205:37;:::i;:::-;10200:3;10193:50;10272:4;10267:3;10263:14;10256:21;;10143:144;10127:4;10122:3;10118:14;10111:21;;10067:220;;;10071:21;9685:608;;9583:710;;;;;:::o;10316:370::-;10387:5;10436:3;10429:4;10421:6;10417:17;10413:27;10403:122;;10444:79;;:::i;:::-;10403:122;10561:6;10548:20;10586:94;10676:3;10668:6;10661:4;10653:6;10649:17;10586:94;:::i;:::-;10577:103;;10393:293;10316:370;;;;:::o;10692:321::-;10779:4;10869:18;10861:6;10858:30;10855:56;;;10891:18;;:::i;:::-;10855:56;10941:4;10933:6;10929:17;10921:25;;11001:4;10995;10991:15;10983:23;;10692:321;;;:::o;11035:945::-;11141:5;11166:91;11182:74;11249:6;11182:74;:::i;:::-;11166:91;:::i;:::-;11157:100;;11277:5;11306:6;11299:5;11292:21;11340:4;11333:5;11329:16;11322:23;;11393:4;11385:6;11381:17;11373:6;11369:30;11422:3;11414:6;11411:15;11408:122;;;11441:79;;:::i;:::-;11408:122;11556:6;11539:435;11573:6;11568:3;11565:15;11539:435;;;11662:3;11649:17;11698:18;11685:11;11682:35;11679:122;;;11720:79;;:::i;:::-;11679:122;11844:11;11836:6;11832:24;11882:47;11925:3;11913:10;11882:47;:::i;:::-;11877:3;11870:60;11959:4;11954:3;11950:14;11943:21;;11615:359;;11599:4;11594:3;11590:14;11583:21;;11539:435;;;11543:21;11147:833;;11035:945;;;;;:::o;12002:390::-;12083:5;12132:3;12125:4;12117:6;12113:17;12109:27;12099:122;;12140:79;;:::i;:::-;12099:122;12257:6;12244:20;12282:104;12382:3;12374:6;12367:4;12359:6;12355:17;12282:104;:::i;:::-;12273:113;;12089:303;12002:390;;;;:::o;12398:914::-;12526:6;12534;12583:2;12571:9;12562:7;12558:23;12554:32;12551:119;;;12589:79;;:::i;:::-;12551:119;12737:1;12726:9;12722:17;12709:31;12767:18;12759:6;12756:30;12753:117;;;12789:79;;:::i;:::-;12753:117;12894:78;12964:7;12955:6;12944:9;12940:22;12894:78;:::i;:::-;12884:88;;12680:302;13049:2;13038:9;13034:18;13021:32;13080:18;13072:6;13069:30;13066:117;;;13102:79;;:::i;:::-;13066:117;13207:88;13287:7;13278:6;13267:9;13263:22;13207:88;:::i;:::-;13197:98;;12992:313;12398:914;;;;;:::o;13318:329::-;13377:6;13426:2;13414:9;13405:7;13401:23;13397:32;13394:119;;;13432:79;;:::i;:::-;13394:119;13552:1;13577:53;13622:7;13613:6;13602:9;13598:22;13577:53;:::i;:::-;13567:63;;13523:117;13318:329;;;;:::o;13653:60::-;13681:3;13702:5;13695:12;;13653:60;;;:::o;13719:142::-;13769:9;13802:53;13820:34;13829:24;13847:5;13829:24;:::i;:::-;13820:34;:::i;:::-;13802:53;:::i;:::-;13789:66;;13719:142;;;:::o;13867:126::-;13917:9;13950:37;13981:5;13950:37;:::i;:::-;13937:50;;13867:126;;;:::o;13999:158::-;14081:9;14114:37;14145:5;14114:37;:::i;:::-;14101:50;;13999:158;;;:::o;14163:195::-;14282:69;14345:5;14282:69;:::i;:::-;14277:3;14270:82;14163:195;;:::o;14364:286::-;14489:4;14527:2;14516:9;14512:18;14504:26;;14540:103;14640:1;14629:9;14625:17;14616:6;14540:103;:::i;:::-;14364:286;;;;:::o;14656:222::-;14749:4;14787:2;14776:9;14772:18;14764:26;;14800:71;14868:1;14857:9;14853:17;14844:6;14800:71;:::i;:::-;14656:222;;;;:::o;14884:654::-;14962:6;14970;15019:2;15007:9;14998:7;14994:23;14990:32;14987:119;;;15025:79;;:::i;:::-;14987:119;15145:1;15170:53;15215:7;15206:6;15195:9;15191:22;15170:53;:::i;:::-;15160:63;;15116:117;15300:2;15289:9;15285:18;15272:32;15331:18;15323:6;15320:30;15317:117;;;15353:79;;:::i;:::-;15317:117;15458:63;15513:7;15504:6;15493:9;15489:22;15458:63;:::i;:::-;15448:73;;15243:288;14884:654;;;;;:::o;15544:1237::-;15658:6;15666;15674;15682;15690;15698;15747:3;15735:9;15726:7;15722:23;15718:33;15715:120;;;15754:79;;:::i;:::-;15715:120;15874:1;15899:53;15944:7;15935:6;15924:9;15920:22;15899:53;:::i;:::-;15889:63;;15845:117;16001:2;16027:53;16072:7;16063:6;16052:9;16048:22;16027:53;:::i;:::-;16017:63;;15972:118;16129:2;16155:53;16200:7;16191:6;16180:9;16176:22;16155:53;:::i;:::-;16145:63;;16100:118;16285:2;16274:9;16270:18;16257:32;16316:18;16308:6;16305:30;16302:117;;;16338:79;;:::i;:::-;16302:117;16443:63;16498:7;16489:6;16478:9;16474:22;16443:63;:::i;:::-;16433:73;;16228:288;16555:3;16582:53;16627:7;16618:6;16607:9;16603:22;16582:53;:::i;:::-;16572:63;;16526:119;16684:3;16711:53;16756:7;16747:6;16736:9;16732:22;16711:53;:::i;:::-;16701:63;;16655:119;15544:1237;;;;;;;;:::o;16787:311::-;16864:4;16954:18;16946:6;16943:30;16940:56;;;16976:18;;:::i;:::-;16940:56;17026:4;17018:6;17014:17;17006:25;;17086:4;17080;17076:15;17068:23;;16787:311;;;:::o;17121:710::-;17217:5;17242:81;17258:64;17315:6;17258:64;:::i;:::-;17242:81;:::i;:::-;17233:90;;17343:5;17372:6;17365:5;17358:21;17406:4;17399:5;17395:16;17388:23;;17459:4;17451:6;17447:17;17439:6;17435:30;17488:3;17480:6;17477:15;17474:122;;;17507:79;;:::i;:::-;17474:122;17622:6;17605:220;17639:6;17634:3;17631:15;17605:220;;;17714:3;17743:37;17776:3;17764:10;17743:37;:::i;:::-;17738:3;17731:50;17810:4;17805:3;17801:14;17794:21;;17681:144;17665:4;17660:3;17656:14;17649:21;;17605:220;;;17609:21;17223:608;;17121:710;;;;;:::o;17854:370::-;17925:5;17974:3;17967:4;17959:6;17955:17;17951:27;17941:122;;17982:79;;:::i;:::-;17941:122;18099:6;18086:20;18124:94;18214:3;18206:6;18199:4;18191:6;18187:17;18124:94;:::i;:::-;18115:103;;17931:293;17854:370;;;;:::o;18230:1707::-;18419:6;18427;18435;18443;18451;18459;18508:3;18496:9;18487:7;18483:23;18479:33;18476:120;;;18515:79;;:::i;:::-;18476:120;18663:1;18652:9;18648:17;18635:31;18693:18;18685:6;18682:30;18679:117;;;18715:79;;:::i;:::-;18679:117;18820:78;18890:7;18881:6;18870:9;18866:22;18820:78;:::i;:::-;18810:88;;18606:302;18947:2;18973:53;19018:7;19009:6;18998:9;18994:22;18973:53;:::i;:::-;18963:63;;18918:118;19103:2;19092:9;19088:18;19075:32;19134:18;19126:6;19123:30;19120:117;;;19156:79;;:::i;:::-;19120:117;19261:78;19331:7;19322:6;19311:9;19307:22;19261:78;:::i;:::-;19251:88;;19046:303;19416:2;19405:9;19401:18;19388:32;19447:18;19439:6;19436:30;19433:117;;;19469:79;;:::i;:::-;19433:117;19574:88;19654:7;19645:6;19634:9;19630:22;19574:88;:::i;:::-;19564:98;;19359:313;19711:3;19738:53;19783:7;19774:6;19763:9;19759:22;19738:53;:::i;:::-;19728:63;;19682:119;19840:3;19867:53;19912:7;19903:6;19892:9;19888:22;19867:53;:::i;:::-;19857:63;;19811:119;18230:1707;;;;;;;;:::o;19943:116::-;20013:21;20028:5;20013:21;:::i;:::-;20006:5;20003:32;19993:60;;20049:1;20046;20039:12;19993:60;19943:116;:::o;20065:133::-;20108:5;20146:6;20133:20;20124:29;;20162:30;20186:5;20162:30;:::i;:::-;20065:133;;;;:::o;20204:468::-;20269:6;20277;20326:2;20314:9;20305:7;20301:23;20297:32;20294:119;;;20332:79;;:::i;:::-;20294:119;20452:1;20477:53;20522:7;20513:6;20502:9;20498:22;20477:53;:::i;:::-;20467:63;;20423:117;20579:2;20605:50;20647:7;20638:6;20627:9;20623:22;20605:50;:::i;:::-;20595:60;;20550:115;20204:468;;;;;:::o;20678:307::-;20739:4;20829:18;20821:6;20818:30;20815:56;;;20851:18;;:::i;:::-;20815:56;20889:29;20911:6;20889:29;:::i;:::-;20881:37;;20973:4;20967;20963:15;20955:23;;20678:307;;;:::o;20991:410::-;21068:5;21093:65;21109:48;21150:6;21109:48;:::i;:::-;21093:65;:::i;:::-;21084:74;;21181:6;21174:5;21167:21;21219:4;21212:5;21208:16;21257:3;21248:6;21243:3;21239:16;21236:25;21233:112;;;21264:79;;:::i;:::-;21233:112;21354:41;21388:6;21383:3;21378;21354:41;:::i;:::-;21074:327;20991:410;;;;;:::o;21420:338::-;21475:5;21524:3;21517:4;21509:6;21505:17;21501:27;21491:122;;21532:79;;:::i;:::-;21491:122;21649:6;21636:20;21674:78;21748:3;21740:6;21733:4;21725:6;21721:17;21674:78;:::i;:::-;21665:87;;21481:277;21420:338;;;;:::o;21764:943::-;21859:6;21867;21875;21883;21932:3;21920:9;21911:7;21907:23;21903:33;21900:120;;;21939:79;;:::i;:::-;21900:120;22059:1;22084:53;22129:7;22120:6;22109:9;22105:22;22084:53;:::i;:::-;22074:63;;22030:117;22186:2;22212:53;22257:7;22248:6;22237:9;22233:22;22212:53;:::i;:::-;22202:63;;22157:118;22314:2;22340:53;22385:7;22376:6;22365:9;22361:22;22340:53;:::i;:::-;22330:63;;22285:118;22470:2;22459:9;22455:18;22442:32;22501:18;22493:6;22490:30;22487:117;;;22523:79;;:::i;:::-;22487:117;22628:62;22682:7;22673:6;22662:9;22658:22;22628:62;:::i;:::-;22618:72;;22413:287;21764:943;;;;;;;:::o;22713:619::-;22790:6;22798;22806;22855:2;22843:9;22834:7;22830:23;22826:32;22823:119;;;22861:79;;:::i;:::-;22823:119;22981:1;23006:53;23051:7;23042:6;23031:9;23027:22;23006:53;:::i;:::-;22996:63;;22952:117;23108:2;23134:53;23179:7;23170:6;23159:9;23155:22;23134:53;:::i;:::-;23124:63;;23079:118;23236:2;23262:53;23307:7;23298:6;23287:9;23283:22;23262:53;:::i;:::-;23252:63;;23207:118;22713:619;;;;;:::o;23338:474::-;23406:6;23414;23463:2;23451:9;23442:7;23438:23;23434:32;23431:119;;;23469:79;;:::i;:::-;23431:119;23589:1;23614:53;23659:7;23650:6;23639:9;23635:22;23614:53;:::i;:::-;23604:63;;23560:117;23716:2;23742:53;23787:7;23778:6;23767:9;23763:22;23742:53;:::i;:::-;23732:63;;23687:118;23338:474;;;;;:::o;23818:180::-;23866:77;23863:1;23856:88;23963:4;23960:1;23953:15;23987:4;23984:1;23977:15;24004:320;24048:6;24085:1;24079:4;24075:12;24065:22;;24132:1;24126:4;24122:12;24153:18;24143:81;;24209:4;24201:6;24197:17;24187:27;;24143:81;24271:2;24263:6;24260:14;24240:18;24237:38;24234:84;;24290:18;;:::i;:::-;24234:84;24055:269;24004:320;;;:::o;24330:180::-;24378:77;24375:1;24368:88;24475:4;24472:1;24465:15;24499:4;24496:1;24489:15;24516:348;24556:7;24579:20;24597:1;24579:20;:::i;:::-;24574:25;;24613:20;24631:1;24613:20;:::i;:::-;24608:25;;24801:1;24733:66;24729:74;24726:1;24723:81;24718:1;24711:9;24704:17;24700:105;24697:131;;;24808:18;;:::i;:::-;24697:131;24856:1;24853;24849:9;24838:20;;24516:348;;;;:::o;24870:180::-;24918:77;24915:1;24908:88;25015:4;25012:1;25005:15;25039:4;25036:1;25029:15;25056:185;25096:1;25113:20;25131:1;25113:20;:::i;:::-;25108:25;;25147:20;25165:1;25147:20;:::i;:::-;25142:25;;25186:1;25176:35;;25191:18;;:::i;:::-;25176:35;25233:1;25230;25226:9;25221:14;;25056:185;;;;:::o;25247:181::-;25387:33;25383:1;25375:6;25371:14;25364:57;25247:181;:::o;25434:366::-;25576:3;25597:67;25661:2;25656:3;25597:67;:::i;:::-;25590:74;;25673:93;25762:3;25673:93;:::i;:::-;25791:2;25786:3;25782:12;25775:19;;25434:366;;;:::o;25806:419::-;25972:4;26010:2;25999:9;25995:18;25987:26;;26059:9;26053:4;26049:20;26045:1;26034:9;26030:17;26023:47;26087:131;26213:4;26087:131;:::i;:::-;26079:139;;25806:419;;;:::o;26231:180::-;26279:77;26276:1;26269:88;26376:4;26373:1;26366:15;26400:4;26397:1;26390:15;26417:233;26456:3;26479:24;26497:5;26479:24;:::i;:::-;26470:33;;26525:66;26518:5;26515:77;26512:103;;26595:18;;:::i;:::-;26512:103;26642:1;26635:5;26631:13;26624:20;;26417:233;;;:::o;26656:174::-;26796:26;26792:1;26784:6;26780:14;26773:50;26656:174;:::o;26836:366::-;26978:3;26999:67;27063:2;27058:3;26999:67;:::i;:::-;26992:74;;27075:93;27164:3;27075:93;:::i;:::-;27193:2;27188:3;27184:12;27177:19;;26836:366;;;:::o;27208:419::-;27374:4;27412:2;27401:9;27397:18;27389:26;;27461:9;27455:4;27451:20;27447:1;27436:9;27432:17;27425:47;27489:131;27615:4;27489:131;:::i;:::-;27481:139;;27208:419;;;:::o;27633:228::-;27773:34;27769:1;27761:6;27757:14;27750:58;27842:11;27837:2;27829:6;27825:15;27818:36;27633:228;:::o;27867:366::-;28009:3;28030:67;28094:2;28089:3;28030:67;:::i;:::-;28023:74;;28106:93;28195:3;28106:93;:::i;:::-;28224:2;28219:3;28215:12;28208:19;;27867:366;;;:::o;28239:419::-;28405:4;28443:2;28432:9;28428:18;28420:26;;28492:9;28486:4;28482:20;28478:1;28467:9;28463:17;28456:47;28520:131;28646:4;28520:131;:::i;:::-;28512:139;;28239:419;;;:::o;28664:174::-;28804:26;28800:1;28792:6;28788:14;28781:50;28664:174;:::o;28844:366::-;28986:3;29007:67;29071:2;29066:3;29007:67;:::i;:::-;29000:74;;29083:93;29172:3;29083:93;:::i;:::-;29201:2;29196:3;29192:12;29185:19;;28844:366;;;:::o;29216:419::-;29382:4;29420:2;29409:9;29405:18;29397:26;;29469:9;29463:4;29459:20;29455:1;29444:9;29440:17;29433:47;29497:131;29623:4;29497:131;:::i;:::-;29489:139;;29216:419;;;:::o;29641:178::-;29781:30;29777:1;29769:6;29765:14;29758:54;29641:178;:::o;29825:366::-;29967:3;29988:67;30052:2;30047:3;29988:67;:::i;:::-;29981:74;;30064:93;30153:3;30064:93;:::i;:::-;30182:2;30177:3;30173:12;30166:19;;29825:366;;;:::o;30197:419::-;30363:4;30401:2;30390:9;30386:18;30378:26;;30450:9;30444:4;30440:20;30436:1;30425:9;30421:17;30414:47;30478:131;30604:4;30478:131;:::i;:::-;30470:139;;30197:419;;;:::o;30622:305::-;30662:3;30681:20;30699:1;30681:20;:::i;:::-;30676:25;;30715:20;30733:1;30715:20;:::i;:::-;30710:25;;30869:1;30801:66;30797:74;30794:1;30791:81;30788:107;;;30875:18;;:::i;:::-;30788:107;30919:1;30916;30912:9;30905:16;;30622:305;;;;:::o;30933:172::-;31073:24;31069:1;31061:6;31057:14;31050:48;30933:172;:::o;31111:366::-;31253:3;31274:67;31338:2;31333:3;31274:67;:::i;:::-;31267:74;;31350:93;31439:3;31350:93;:::i;:::-;31468:2;31463:3;31459:12;31452:19;;31111:366;;;:::o;31483:419::-;31649:4;31687:2;31676:9;31672:18;31664:26;;31736:9;31730:4;31726:20;31722:1;31711:9;31707:17;31700:47;31764:131;31890:4;31764:131;:::i;:::-;31756:139;;31483:419;;;:::o;31908:225::-;32048:34;32044:1;32036:6;32032:14;32025:58;32117:8;32112:2;32104:6;32100:15;32093:33;31908:225;:::o;32139:366::-;32281:3;32302:67;32366:2;32361:3;32302:67;:::i;:::-;32295:74;;32378:93;32467:3;32378:93;:::i;:::-;32496:2;32491:3;32487:12;32480:19;;32139:366;;;:::o;32511:419::-;32677:4;32715:2;32704:9;32700:18;32692:26;;32764:9;32758:4;32754:20;32750:1;32739:9;32735:17;32728:47;32792:131;32918:4;32792:131;:::i;:::-;32784:139;;32511:419;;;:::o;32936:332::-;33057:4;33095:2;33084:9;33080:18;33072:26;;33108:71;33176:1;33165:9;33161:17;33152:6;33108:71;:::i;:::-;33189:72;33257:2;33246:9;33242:18;33233:6;33189:72;:::i;:::-;32936:332;;;;;:::o;33274:137::-;33328:5;33359:6;33353:13;33344:22;;33375:30;33399:5;33375:30;:::i;:::-;33274:137;;;;:::o;33417:345::-;33484:6;33533:2;33521:9;33512:7;33508:23;33504:32;33501:119;;;33539:79;;:::i;:::-;33501:119;33659:1;33684:61;33737:7;33728:6;33717:9;33713:22;33684:61;:::i;:::-;33674:71;;33630:125;33417:345;;;;:::o;33768:220::-;33908:34;33904:1;33896:6;33892:14;33885:58;33977:3;33972:2;33964:6;33960:15;33953:28;33768:220;:::o;33994:366::-;34136:3;34157:67;34221:2;34216:3;34157:67;:::i;:::-;34150:74;;34233:93;34322:3;34233:93;:::i;:::-;34351:2;34346:3;34342:12;34335:19;;33994:366;;;:::o;34366:419::-;34532:4;34570:2;34559:9;34555:18;34547:26;;34619:9;34613:4;34609:20;34605:1;34594:9;34590:17;34583:47;34647:131;34773:4;34647:131;:::i;:::-;34639:139;;34366:419;;;:::o;34791:248::-;34931:34;34927:1;34919:6;34915:14;34908:58;35000:31;34995:2;34987:6;34983:15;34976:56;34791:248;:::o;35045:366::-;35187:3;35208:67;35272:2;35267:3;35208:67;:::i;:::-;35201:74;;35284:93;35373:3;35284:93;:::i;:::-;35402:2;35397:3;35393:12;35386:19;;35045:366;;;:::o;35417:419::-;35583:4;35621:2;35610:9;35606:18;35598:26;;35670:9;35664:4;35660:20;35656:1;35645:9;35641:17;35634:47;35698:131;35824:4;35698:131;:::i;:::-;35690:139;;35417:419;;;:::o;35842:232::-;35982:34;35978:1;35970:6;35966:14;35959:58;36051:15;36046:2;36038:6;36034:15;36027:40;35842:232;:::o;36080:366::-;36222:3;36243:67;36307:2;36302:3;36243:67;:::i;:::-;36236:74;;36319:93;36408:3;36319:93;:::i;:::-;36437:2;36432:3;36428:12;36421:19;;36080:366;;;:::o;36452:419::-;36618:4;36656:2;36645:9;36641:18;36633:26;;36705:9;36699:4;36695:20;36691:1;36680:9;36676:17;36669:47;36733:131;36859:4;36733:131;:::i;:::-;36725:139;;36452:419;;;:::o;36877:182::-;37017:34;37013:1;37005:6;37001:14;36994:58;36877:182;:::o;37065:366::-;37207:3;37228:67;37292:2;37287:3;37228:67;:::i;:::-;37221:74;;37304:93;37393:3;37304:93;:::i;:::-;37422:2;37417:3;37413:12;37406:19;;37065:366;;;:::o;37437:419::-;37603:4;37641:2;37630:9;37626:18;37618:26;;37690:9;37684:4;37680:20;37676:1;37665:9;37661:17;37654:47;37718:131;37844:4;37718:131;:::i;:::-;37710:139;;37437:419;;;:::o;37862:176::-;38002:28;37998:1;37990:6;37986:14;37979:52;37862:176;:::o;38044:366::-;38186:3;38207:67;38271:2;38266:3;38207:67;:::i;:::-;38200:74;;38283:93;38372:3;38283:93;:::i;:::-;38401:2;38396:3;38392:12;38385:19;;38044:366;;;:::o;38416:419::-;38582:4;38620:2;38609:9;38605:18;38597:26;;38669:9;38663:4;38659:20;38655:1;38644:9;38640:17;38633:47;38697:131;38823:4;38697:131;:::i;:::-;38689:139;;38416:419;;;:::o;38841:148::-;38943:11;38980:3;38965:18;;38841:148;;;;:::o;38995:377::-;39101:3;39129:39;39162:5;39129:39;:::i;:::-;39184:89;39266:6;39261:3;39184:89;:::i;:::-;39177:96;;39282:52;39327:6;39322:3;39315:4;39308:5;39304:16;39282:52;:::i;:::-;39359:6;39354:3;39350:16;39343:23;;39105:267;38995:377;;;;:::o;39378:141::-;39427:4;39450:3;39442:11;;39473:3;39470:1;39463:14;39507:4;39504:1;39494:18;39486:26;;39378:141;;;:::o;39549:845::-;39652:3;39689:5;39683:12;39718:36;39744:9;39718:36;:::i;:::-;39770:89;39852:6;39847:3;39770:89;:::i;:::-;39763:96;;39890:1;39879:9;39875:17;39906:1;39901:137;;;;40052:1;40047:341;;;;39868:520;;39901:137;39985:4;39981:9;39970;39966:25;39961:3;39954:38;40021:6;40016:3;40012:16;40005:23;;39901:137;;40047:341;40114:38;40146:5;40114:38;:::i;:::-;40174:1;40188:154;40202:6;40199:1;40196:13;40188:154;;;40276:7;40270:14;40266:1;40261:3;40257:11;40250:35;40326:1;40317:7;40313:15;40302:26;;40224:4;40221:1;40217:12;40212:17;;40188:154;;;40371:6;40366:3;40362:16;40355:23;;40054:334;;39868:520;;39656:738;;39549:845;;;;:::o;40400:429::-;40577:3;40599:95;40690:3;40681:6;40599:95;:::i;:::-;40592:102;;40711:92;40799:3;40790:6;40711:92;:::i;:::-;40704:99;;40820:3;40813:10;;40400:429;;;;;:::o;40835:224::-;40975:34;40971:1;40963:6;40959:14;40952:58;41044:7;41039:2;41031:6;41027:15;41020:32;40835:224;:::o;41065:366::-;41207:3;41228:67;41292:2;41287:3;41228:67;:::i;:::-;41221:74;;41304:93;41393:3;41304:93;:::i;:::-;41422:2;41417:3;41413:12;41406:19;;41065:366;;;:::o;41437:419::-;41603:4;41641:2;41630:9;41626:18;41618:26;;41690:9;41684:4;41680:20;41676:1;41665:9;41661:17;41654:47;41718:131;41844:4;41718:131;:::i;:::-;41710:139;;41437:419;;;:::o;41862:223::-;42002:34;41998:1;41990:6;41986:14;41979:58;42071:6;42066:2;42058:6;42054:15;42047:31;41862:223;:::o;42091:366::-;42233:3;42254:67;42318:2;42313:3;42254:67;:::i;:::-;42247:74;;42330:93;42419:3;42330:93;:::i;:::-;42448:2;42443:3;42439:12;42432:19;;42091:366;;;:::o;42463:419::-;42629:4;42667:2;42656:9;42652:18;42644:26;;42716:9;42710:4;42706:20;42702:1;42691:9;42687:17;42680:47;42744:131;42870:4;42744:131;:::i;:::-;42736:139;;42463:419;;;:::o;42888:175::-;43028:27;43024:1;43016:6;43012:14;43005:51;42888:175;:::o;43069:366::-;43211:3;43232:67;43296:2;43291:3;43232:67;:::i;:::-;43225:74;;43308:93;43397:3;43308:93;:::i;:::-;43426:2;43421:3;43417:12;43410:19;;43069:366;;;:::o;43441:419::-;43607:4;43645:2;43634:9;43630:18;43622:26;;43694:9;43688:4;43684:20;43680:1;43669:9;43665:17;43658:47;43722:131;43848:4;43722:131;:::i;:::-;43714:139;;43441:419;;;:::o;43866:237::-;44006:34;44002:1;43994:6;43990:14;43983:58;44075:20;44070:2;44062:6;44058:15;44051:45;43866:237;:::o;44109:366::-;44251:3;44272:67;44336:2;44331:3;44272:67;:::i;:::-;44265:74;;44348:93;44437:3;44348:93;:::i;:::-;44466:2;44461:3;44457:12;44450:19;;44109:366;;;:::o;44481:419::-;44647:4;44685:2;44674:9;44670:18;44662:26;;44734:9;44728:4;44724:20;44720:1;44709:9;44705:17;44698:47;44762:131;44888:4;44762:131;:::i;:::-;44754:139;;44481:419;;;:::o;44906:191::-;44946:4;44966:20;44984:1;44966:20;:::i;:::-;44961:25;;45000:20;45018:1;45000:20;:::i;:::-;44995:25;;45039:1;45036;45033:8;45030:34;;;45044:18;;:::i;:::-;45030:34;45089:1;45086;45082:9;45074:17;;44906:191;;;;:::o;45103:98::-;45154:6;45188:5;45182:12;45172:22;;45103:98;;;:::o;45207:168::-;45290:11;45324:6;45319:3;45312:19;45364:4;45359:3;45355:14;45340:29;;45207:168;;;;:::o;45381:360::-;45467:3;45495:38;45527:5;45495:38;:::i;:::-;45549:70;45612:6;45607:3;45549:70;:::i;:::-;45542:77;;45628:52;45673:6;45668:3;45661:4;45654:5;45650:16;45628:52;:::i;:::-;45705:29;45727:6;45705:29;:::i;:::-;45700:3;45696:39;45689:46;;45471:270;45381:360;;;;:::o;45747:640::-;45942:4;45980:3;45969:9;45965:19;45957:27;;45994:71;46062:1;46051:9;46047:17;46038:6;45994:71;:::i;:::-;46075:72;46143:2;46132:9;46128:18;46119:6;46075:72;:::i;:::-;46157;46225:2;46214:9;46210:18;46201:6;46157:72;:::i;:::-;46276:9;46270:4;46266:20;46261:2;46250:9;46246:18;46239:48;46304:76;46375:4;46366:6;46304:76;:::i;:::-;46296:84;;45747:640;;;;;;;:::o;46393:141::-;46449:5;46480:6;46474:13;46465:22;;46496:32;46522:5;46496:32;:::i;:::-;46393:141;;;;:::o;46540:349::-;46609:6;46658:2;46646:9;46637:7;46633:23;46629:32;46626:119;;;46664:79;;:::i;:::-;46626:119;46784:1;46809:63;46864:7;46855:6;46844:9;46840:22;46809:63;:::i;:::-;46799:73;;46755:127;46540:349;;;;:::o

Swarm Source

ipfs://0247141e877e49699df1af7203af3c597417501b5dbe7133882a1d0dd9e5fd45
Loading...
Loading
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.