Token DaemonPunks

NFT  
 

Overview ERC-721

Total Supply:
345 DMNPUNK

Holders:
204 addresses

Transfers:
-

Loading
[ Download CSV Export  ] 
Loading
Loading

OVERVIEW

DaemonPunks are a collection of 345 punks corrupted by the remnant subroutines of the lost BitDaemons. All handmade, all 1/1. Minted on the Fantom blockchain.


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

Contract Source Code Verified (Exact Match)

Contract Name:
Example

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-02-01
*/

// SPDX-License-Identifier: GPL-3.0

// File: @openzeppelin/contracts/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: @openzeppelin/contracts/token/ERC721/IERC721.sol
pragma solidity ^0.8.0;
/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

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

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

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

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

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

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

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

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

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

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

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


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

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

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


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

// File: @openzeppelin/contracts/utils/Strings.sol



pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/utils/Address.sol



pragma solidity ^0.8.0;

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

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol



pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/contracts/token/ERC721/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 `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/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: @openzeppelin/contracts/token/ERC721/ERC721.sol
pragma solidity ^0.8.0;
/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol



pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File: @openzeppelin/contracts/access/Ownable.sol
pragma solidity ^0.8.0;
/**
 * @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() {
        _setOwner(_msgSender());
    }

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


pragma solidity ^0.8.0;



 contract Example is ERC721Enumerable, Ownable {
        
        using Strings for uint256;
        
        // Optional mapping for token URIs
        mapping (uint256 => string) private _tokenURIs;

        // Base URI
        string private _baseURIextended;


        constructor(string memory _name, string memory _symbol)
            ERC721(_name, _symbol)
        {}
        
        function setBaseURI(string memory baseURI_) external onlyOwner() {
            _baseURIextended = baseURI_;
        }
        
        function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
            require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token");
            _tokenURIs[tokenId] = _tokenURI;
        }
        
        function postSetTokenURI(uint256 tokenId, string memory _tokenURI) external onlyOwner {
            require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token");
            _tokenURIs[tokenId] = _tokenURI;
        }
        
        function _baseURI() internal view virtual override returns (string memory) {
            return _baseURIextended;
        }
        
        function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
            require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

            string memory _tokenURI = _tokenURIs[tokenId];
            string memory base = _baseURI();
            
            // If there is no base URI, return the token URI.
            if (bytes(base).length == 0) {
                return _tokenURI;
            }
            // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
            if (bytes(_tokenURI).length > 0) {
                return string(abi.encodePacked(base, _tokenURI));
            }
            // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI.
            return string(abi.encodePacked(base, tokenId.toString()));
        }
        

        function mint(
            address _to,
            uint256 _tokenId,
            string memory tokenURI_
        ) external onlyOwner() {
            _mint(_to, _tokenId);
            _setTokenURI(_tokenId, tokenURI_);
        }
    }

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"tokenURI_","type":"string"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"postSetTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060405162003ddd38038062003ddd833981810160405281019062000037919062000291565b818181600090805190602001906200005192919062000163565b5080600190805190602001906200006a92919062000163565b5050506200008d620000816200009560201b60201c565b6200009d60201b60201c565b50506200049a565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200017190620003ab565b90600052602060002090601f016020900481019282620001955760008555620001e1565b82601f10620001b057805160ff1916838001178555620001e1565b82800160010185558215620001e1579182015b82811115620001e0578251825591602001919060010190620001c3565b5b509050620001f09190620001f4565b5090565b5b808211156200020f576000816000905550600101620001f5565b5090565b60006200022a62000224846200033f565b62000316565b9050828152602081018484840111156200024957620002486200047a565b5b6200025684828562000375565b509392505050565b600082601f83011262000276576200027562000475565b5b81516200028884826020860162000213565b91505092915050565b60008060408385031215620002ab57620002aa62000484565b5b600083015167ffffffffffffffff811115620002cc57620002cb6200047f565b5b620002da858286016200025e565b925050602083015167ffffffffffffffff811115620002fe57620002fd6200047f565b5b6200030c858286016200025e565b9150509250929050565b60006200032262000335565b9050620003308282620003e1565b919050565b6000604051905090565b600067ffffffffffffffff8211156200035d576200035c62000446565b5b620003688262000489565b9050602081019050919050565b60005b838110156200039557808201518184015260208101905062000378565b83811115620003a5576000848401525b50505050565b60006002820490506001821680620003c457607f821691505b60208210811415620003db57620003da62000417565b5b50919050565b620003ec8262000489565b810181811067ffffffffffffffff821117156200040e576200040d62000446565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b61393380620004aa6000396000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c80636352211e116100b8578063a22cb4651161007c578063a22cb46514610375578063b88d4fde14610391578063c87b56dd146103ad578063d3fc9864146103dd578063e985e9c5146103f9578063f2fde38b1461042957610142565b80636352211e146102cf57806370a08231146102ff578063715018a61461032f5780638da5cb5b1461033957806395d89b411461035757610142565b806323b872dd1161010a57806323b872dd146101ff5780632f745c591461021b57806342842e0e1461024b5780634f6ccce71461026757806355f804b31461029757806357997081146102b357610142565b806301ffc9a71461014757806306fdde0314610177578063081812fc14610195578063095ea7b3146101c557806318160ddd146101e1575b600080fd5b610161600480360381019061015c919061272d565b610445565b60405161016e9190612c4d565b60405180910390f35b61017f6104bf565b60405161018c9190612c68565b60405180910390f35b6101af60048036038101906101aa91906127d0565b610551565b6040516101bc9190612be6565b60405180910390f35b6101df60048036038101906101da919061267e565b6105d6565b005b6101e96106ee565b6040516101f69190612eea565b60405180910390f35b61021960048036038101906102149190612568565b6106fb565b005b6102356004803603810190610230919061267e565b61075b565b6040516102429190612eea565b60405180910390f35b61026560048036038101906102609190612568565b610800565b005b610281600480360381019061027c91906127d0565b610820565b60405161028e9190612eea565b60405180910390f35b6102b160048036038101906102ac9190612787565b610891565b005b6102cd60048036038101906102c891906127fd565b610927565b005b6102e960048036038101906102e491906127d0565b610a17565b6040516102f69190612be6565b60405180910390f35b610319600480360381019061031491906124fb565b610ac9565b6040516103269190612eea565b60405180910390f35b610337610b81565b005b610341610c09565b60405161034e9190612be6565b60405180910390f35b61035f610c33565b60405161036c9190612c68565b60405180910390f35b61038f600480360381019061038a919061263e565b610cc5565b005b6103ab60048036038101906103a691906125bb565b610e46565b005b6103c760048036038101906103c291906127d0565b610ea8565b6040516103d49190612c68565b60405180910390f35b6103f760048036038101906103f291906126be565b61101b565b005b610413600480360381019061040e9190612528565b6110b0565b6040516104209190612c4d565b60405180910390f35b610443600480360381019061043e91906124fb565b611144565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806104b857506104b78261123c565b5b9050919050565b6060600080546104ce90613140565b80601f01602080910402602001604051908101604052809291908181526020018280546104fa90613140565b80156105475780601f1061051c57610100808354040283529160200191610547565b820191906000526020600020905b81548152906001019060200180831161052a57829003601f168201915b5050505050905090565b600061055c8261131e565b61059b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161059290612dea565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006105e182610a17565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610652576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064990612e8a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661067161138a565b73ffffffffffffffffffffffffffffffffffffffff1614806106a0575061069f8161069a61138a565b6110b0565b5b6106df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106d690612d6a565b60405180910390fd5b6106e98383611392565b505050565b6000600880549050905090565b61070c61070661138a565b8261144b565b61074b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074290612eaa565b60405180910390fd5b610756838383611529565b505050565b600061076683610ac9565b82106107a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079e90612c8a565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61081b83838360405180602001604052806000815250610e46565b505050565b600061082a6106ee565b821061086b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086290612eca565b60405180910390fd5b6008828154811061087f5761087e6132d9565b5b90600052602060002001549050919050565b61089961138a565b73ffffffffffffffffffffffffffffffffffffffff166108b7610c09565b73ffffffffffffffffffffffffffffffffffffffff161461090d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090490612e2a565b60405180910390fd5b80600c908051906020019061092392919061230f565b5050565b61092f61138a565b73ffffffffffffffffffffffffffffffffffffffff1661094d610c09565b73ffffffffffffffffffffffffffffffffffffffff16146109a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099a90612e2a565b60405180910390fd5b6109ac8261131e565b6109eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e290612e0a565b60405180910390fd5b80600b60008481526020019081526020016000209080519060200190610a1292919061230f565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ac0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab790612daa565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610b3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3190612d8a565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610b8961138a565b73ffffffffffffffffffffffffffffffffffffffff16610ba7610c09565b73ffffffffffffffffffffffffffffffffffffffff1614610bfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf490612e2a565b60405180910390fd5b610c076000611785565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610c4290613140565b80601f0160208091040260200160405190810160405280929190818152602001828054610c6e90613140565b8015610cbb5780601f10610c9057610100808354040283529160200191610cbb565b820191906000526020600020905b815481529060010190602001808311610c9e57829003601f168201915b5050505050905090565b610ccd61138a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3290612d2a565b60405180910390fd5b8060056000610d4861138a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610df561138a565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610e3a9190612c4d565b60405180910390a35050565b610e57610e5161138a565b8361144b565b610e96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8d90612eaa565b60405180910390fd5b610ea28484848461184b565b50505050565b6060610eb38261131e565b610ef2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee990612e6a565b60405180910390fd5b6000600b60008481526020019081526020016000208054610f1290613140565b80601f0160208091040260200160405190810160405280929190818152602001828054610f3e90613140565b8015610f8b5780601f10610f6057610100808354040283529160200191610f8b565b820191906000526020600020905b815481529060010190602001808311610f6e57829003601f168201915b505050505090506000610f9c6118a7565b9050600081511415610fb2578192505050611016565b600082511115610fe7578082604051602001610fcf929190612bc2565b60405160208183030381529060405292505050611016565b80610ff185611939565b604051602001611002929190612bc2565b604051602081830303815290604052925050505b919050565b61102361138a565b73ffffffffffffffffffffffffffffffffffffffff16611041610c09565b73ffffffffffffffffffffffffffffffffffffffff1614611097576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108e90612e2a565b60405180910390fd5b6110a18383611a9a565b6110ab8282611c68565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61114c61138a565b73ffffffffffffffffffffffffffffffffffffffff1661116a610c09565b73ffffffffffffffffffffffffffffffffffffffff16146111c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b790612e2a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611230576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122790612cca565b60405180910390fd5b61123981611785565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061130757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611317575061131682611cdc565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661140583610a17565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006114568261131e565b611495576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148c90612d4a565b60405180910390fd5b60006114a083610a17565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061150f57508373ffffffffffffffffffffffffffffffffffffffff166114f784610551565b73ffffffffffffffffffffffffffffffffffffffff16145b80611520575061151f81856110b0565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661154982610a17565b73ffffffffffffffffffffffffffffffffffffffff161461159f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159690612e4a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561160f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160690612d0a565b60405180910390fd5b61161a838383611d46565b611625600082611392565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116759190613056565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116cc9190612fcf565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611856848484611529565b61186284848484611e5a565b6118a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189890612caa565b60405180910390fd5b50505050565b6060600c80546118b690613140565b80601f01602080910402602001604051908101604052809291908181526020018280546118e290613140565b801561192f5780601f106119045761010080835404028352916020019161192f565b820191906000526020600020905b81548152906001019060200180831161191257829003601f168201915b5050505050905090565b60606000821415611981576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611a95565b600082905060005b600082146119b357808061199c906131a3565b915050600a826119ac9190613025565b9150611989565b60008167ffffffffffffffff8111156119cf576119ce613308565b5b6040519080825280601f01601f191660200182016040528015611a015781602001600182028036833780820191505090505b5090505b60008514611a8e57600182611a1a9190613056565b9150600a85611a2991906131ec565b6030611a359190612fcf565b60f81b818381518110611a4b57611a4a6132d9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611a879190613025565b9450611a05565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0190612dca565b60405180910390fd5b611b138161131e565b15611b53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4a90612cea565b60405180910390fd5b611b5f60008383611d46565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611baf9190612fcf565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b611c718261131e565b611cb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca790612e0a565b60405180910390fd5b80600b60008481526020019081526020016000209080519060200190611cd792919061230f565b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611d51838383611ff1565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611d9457611d8f81611ff6565b611dd3565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611dd257611dd1838261203f565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e1657611e11816121ac565b611e55565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611e5457611e53828261227d565b5b5b505050565b6000611e7b8473ffffffffffffffffffffffffffffffffffffffff166122fc565b15611fe4578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611ea461138a565b8786866040518563ffffffff1660e01b8152600401611ec69493929190612c01565b602060405180830381600087803b158015611ee057600080fd5b505af1925050508015611f1157506040513d601f19601f82011682018060405250810190611f0e919061275a565b60015b611f94573d8060008114611f41576040519150601f19603f3d011682016040523d82523d6000602084013e611f46565b606091505b50600081511415611f8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8390612caa565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611fe9565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161204c84610ac9565b6120569190613056565b905060006007600084815260200190815260200160002054905081811461213b576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506121c09190613056565b90506000600960008481526020019081526020016000205490506000600883815481106121f0576121ef6132d9565b5b906000526020600020015490508060088381548110612212576122116132d9565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612261576122606132aa565b5b6001900381819060005260206000200160009055905550505050565b600061228883610ac9565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b82805461231b90613140565b90600052602060002090601f01602090048101928261233d5760008555612384565b82601f1061235657805160ff1916838001178555612384565b82800160010185558215612384579182015b82811115612383578251825591602001919060010190612368565b5b5090506123919190612395565b5090565b5b808211156123ae576000816000905550600101612396565b5090565b60006123c56123c084612f2a565b612f05565b9050828152602081018484840111156123e1576123e061333c565b5b6123ec8482856130fe565b509392505050565b600061240761240284612f5b565b612f05565b9050828152602081018484840111156124235761242261333c565b5b61242e8482856130fe565b509392505050565b600081359050612445816138a1565b92915050565b60008135905061245a816138b8565b92915050565b60008135905061246f816138cf565b92915050565b600081519050612484816138cf565b92915050565b600082601f83011261249f5761249e613337565b5b81356124af8482602086016123b2565b91505092915050565b600082601f8301126124cd576124cc613337565b5b81356124dd8482602086016123f4565b91505092915050565b6000813590506124f5816138e6565b92915050565b60006020828403121561251157612510613346565b5b600061251f84828501612436565b91505092915050565b6000806040838503121561253f5761253e613346565b5b600061254d85828601612436565b925050602061255e85828601612436565b9150509250929050565b60008060006060848603121561258157612580613346565b5b600061258f86828701612436565b93505060206125a086828701612436565b92505060406125b1868287016124e6565b9150509250925092565b600080600080608085870312156125d5576125d4613346565b5b60006125e387828801612436565b94505060206125f487828801612436565b9350506040612605878288016124e6565b925050606085013567ffffffffffffffff81111561262657612625613341565b5b6126328782880161248a565b91505092959194509250565b6000806040838503121561265557612654613346565b5b600061266385828601612436565b92505060206126748582860161244b565b9150509250929050565b6000806040838503121561269557612694613346565b5b60006126a385828601612436565b92505060206126b4858286016124e6565b9150509250929050565b6000806000606084860312156126d7576126d6613346565b5b60006126e586828701612436565b93505060206126f6868287016124e6565b925050604084013567ffffffffffffffff81111561271757612716613341565b5b612723868287016124b8565b9150509250925092565b60006020828403121561274357612742613346565b5b600061275184828501612460565b91505092915050565b6000602082840312156127705761276f613346565b5b600061277e84828501612475565b91505092915050565b60006020828403121561279d5761279c613346565b5b600082013567ffffffffffffffff8111156127bb576127ba613341565b5b6127c7848285016124b8565b91505092915050565b6000602082840312156127e6576127e5613346565b5b60006127f4848285016124e6565b91505092915050565b6000806040838503121561281457612813613346565b5b6000612822858286016124e6565b925050602083013567ffffffffffffffff81111561284357612842613341565b5b61284f858286016124b8565b9150509250929050565b6128628161308a565b82525050565b6128718161309c565b82525050565b600061288282612f8c565b61288c8185612fa2565b935061289c81856020860161310d565b6128a58161334b565b840191505092915050565b60006128bb82612f97565b6128c58185612fb3565b93506128d581856020860161310d565b6128de8161334b565b840191505092915050565b60006128f482612f97565b6128fe8185612fc4565b935061290e81856020860161310d565b80840191505092915050565b6000612927602b83612fb3565b91506129328261335c565b604082019050919050565b600061294a603283612fb3565b9150612955826133ab565b604082019050919050565b600061296d602683612fb3565b9150612978826133fa565b604082019050919050565b6000612990601c83612fb3565b915061299b82613449565b602082019050919050565b60006129b3602483612fb3565b91506129be82613472565b604082019050919050565b60006129d6601983612fb3565b91506129e1826134c1565b602082019050919050565b60006129f9602c83612fb3565b9150612a04826134ea565b604082019050919050565b6000612a1c603883612fb3565b9150612a2782613539565b604082019050919050565b6000612a3f602a83612fb3565b9150612a4a82613588565b604082019050919050565b6000612a62602983612fb3565b9150612a6d826135d7565b604082019050919050565b6000612a85602083612fb3565b9150612a9082613626565b602082019050919050565b6000612aa8602c83612fb3565b9150612ab38261364f565b604082019050919050565b6000612acb602c83612fb3565b9150612ad68261369e565b604082019050919050565b6000612aee602083612fb3565b9150612af9826136ed565b602082019050919050565b6000612b11602983612fb3565b9150612b1c82613716565b604082019050919050565b6000612b34602f83612fb3565b9150612b3f82613765565b604082019050919050565b6000612b57602183612fb3565b9150612b62826137b4565b604082019050919050565b6000612b7a603183612fb3565b9150612b8582613803565b604082019050919050565b6000612b9d602c83612fb3565b9150612ba882613852565b604082019050919050565b612bbc816130f4565b82525050565b6000612bce82856128e9565b9150612bda82846128e9565b91508190509392505050565b6000602082019050612bfb6000830184612859565b92915050565b6000608082019050612c166000830187612859565b612c236020830186612859565b612c306040830185612bb3565b8181036060830152612c428184612877565b905095945050505050565b6000602082019050612c626000830184612868565b92915050565b60006020820190508181036000830152612c8281846128b0565b905092915050565b60006020820190508181036000830152612ca38161291a565b9050919050565b60006020820190508181036000830152612cc38161293d565b9050919050565b60006020820190508181036000830152612ce381612960565b9050919050565b60006020820190508181036000830152612d0381612983565b9050919050565b60006020820190508181036000830152612d23816129a6565b9050919050565b60006020820190508181036000830152612d43816129c9565b9050919050565b60006020820190508181036000830152612d63816129ec565b9050919050565b60006020820190508181036000830152612d8381612a0f565b9050919050565b60006020820190508181036000830152612da381612a32565b9050919050565b60006020820190508181036000830152612dc381612a55565b9050919050565b60006020820190508181036000830152612de381612a78565b9050919050565b60006020820190508181036000830152612e0381612a9b565b9050919050565b60006020820190508181036000830152612e2381612abe565b9050919050565b60006020820190508181036000830152612e4381612ae1565b9050919050565b60006020820190508181036000830152612e6381612b04565b9050919050565b60006020820190508181036000830152612e8381612b27565b9050919050565b60006020820190508181036000830152612ea381612b4a565b9050919050565b60006020820190508181036000830152612ec381612b6d565b9050919050565b60006020820190508181036000830152612ee381612b90565b9050919050565b6000602082019050612eff6000830184612bb3565b92915050565b6000612f0f612f20565b9050612f1b8282613172565b919050565b6000604051905090565b600067ffffffffffffffff821115612f4557612f44613308565b5b612f4e8261334b565b9050602081019050919050565b600067ffffffffffffffff821115612f7657612f75613308565b5b612f7f8261334b565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612fda826130f4565b9150612fe5836130f4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561301a5761301961321d565b5b828201905092915050565b6000613030826130f4565b915061303b836130f4565b92508261304b5761304a61324c565b5b828204905092915050565b6000613061826130f4565b915061306c836130f4565b92508282101561307f5761307e61321d565b5b828203905092915050565b6000613095826130d4565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561312b578082015181840152602081019050613110565b8381111561313a576000848401525b50505050565b6000600282049050600182168061315857607f821691505b6020821081141561316c5761316b61327b565b5b50919050565b61317b8261334b565b810181811067ffffffffffffffff8211171561319a57613199613308565b5b80604052505050565b60006131ae826130f4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156131e1576131e061321d565b5b600182019050919050565b60006131f7826130f4565b9150613202836130f4565b9250826132125761321161324c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920736574206f66206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6138aa8161308a565b81146138b557600080fd5b50565b6138c18161309c565b81146138cc57600080fd5b50565b6138d8816130a8565b81146138e357600080fd5b50565b6138ef816130f4565b81146138fa57600080fd5b5056fea2646970667358221220cf976da926cfdadf1934aec91142852471d6b2ab893d2771182aea33c3ba312e64736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000b4461656d6f6e50756e6b730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007444d4e50554e4b00000000000000000000000000000000000000000000000000

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

00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000b4461656d6f6e50756e6b730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007444d4e50554e4b00000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): DaemonPunks
Arg [1] : _symbol (string): DMNPUNK

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [3] : 4461656d6f6e50756e6b73000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [5] : 444d4e50554e4b00000000000000000000000000000000000000000000000000


Deployed ByteCode Sourcemap

43118:2315:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34666:224;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22558:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24117:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23640:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35306:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25007:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34974:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25417:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35496:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43524:119;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43910:232;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22252:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21982:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42455:94;;;:::i;:::-;;41804:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22727:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24410:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25673:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44307:861;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45190:236;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24776:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42704:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34666:224;34768:4;34807:35;34792:50;;;:11;:50;;;;:90;;;;34846:36;34870:11;34846:23;:36::i;:::-;34792:90;34785:97;;34666:224;;;:::o;22558:100::-;22612:13;22645:5;22638:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22558:100;:::o;24117:221::-;24193:7;24221:16;24229:7;24221;:16::i;:::-;24213:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24306:15;:24;24322:7;24306:24;;;;;;;;;;;;;;;;;;;;;24299:31;;24117:221;;;:::o;23640:411::-;23721:13;23737:23;23752:7;23737:14;:23::i;:::-;23721:39;;23785:5;23779:11;;:2;:11;;;;23771:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23879:5;23863:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;23888:37;23905:5;23912:12;:10;:12::i;:::-;23888:16;:37::i;:::-;23863:62;23841:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;24022:21;24031:2;24035:7;24022:8;:21::i;:::-;23710:341;23640:411;;:::o;35306:113::-;35367:7;35394:10;:17;;;;35387:24;;35306:113;:::o;25007:339::-;25202:41;25221:12;:10;:12::i;:::-;25235:7;25202:18;:41::i;:::-;25194:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25310:28;25320:4;25326:2;25330:7;25310:9;:28::i;:::-;25007:339;;;:::o;34974:256::-;35071:7;35107:23;35124:5;35107:16;:23::i;:::-;35099:5;:31;35091:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;35196:12;:19;35209:5;35196:19;;;;;;;;;;;;;;;:26;35216:5;35196:26;;;;;;;;;;;;35189:33;;34974:256;;;;:::o;25417:185::-;25555:39;25572:4;25578:2;25582:7;25555:39;;;;;;;;;;;;:16;:39::i;:::-;25417:185;;;:::o;35496:233::-;35571:7;35607:30;:28;:30::i;:::-;35599:5;:38;35591:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;35704:10;35715:5;35704:17;;;;;;;;:::i;:::-;;;;;;;;;;35697:24;;35496:233;;;:::o;43524:119::-;42035:12;:10;:12::i;:::-;42024:23;;:7;:5;:7::i;:::-;:23;;;42016:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43623:8:::1;43604:16;:27;;;;;;;;;;;;:::i;:::-;;43524:119:::0;:::o;43910:232::-;42035:12;:10;:12::i;:::-;42024:23;;:7;:5;:7::i;:::-;:23;;;42016:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44019:16:::1;44027:7;44019;:16::i;:::-;44011:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;44121:9;44099:10;:19;44110:7;44099:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;43910:232:::0;;:::o;22252:239::-;22324:7;22344:13;22360:7;:16;22368:7;22360:16;;;;;;;;;;;;;;;;;;;;;22344:32;;22412:1;22395:19;;:5;:19;;;;22387:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22478:5;22471:12;;;22252:239;;;:::o;21982:208::-;22054:7;22099:1;22082:19;;:5;:19;;;;22074:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;22166:9;:16;22176:5;22166:16;;;;;;;;;;;;;;;;22159:23;;21982:208;;;:::o;42455:94::-;42035:12;:10;:12::i;:::-;42024:23;;:7;:5;:7::i;:::-;:23;;;42016:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42520:21:::1;42538:1;42520:9;:21::i;:::-;42455:94::o:0;41804:87::-;41850:7;41877:6;;;;;;;;;;;41870:13;;41804:87;:::o;22727:104::-;22783:13;22816:7;22809:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22727:104;:::o;24410:295::-;24525:12;:10;:12::i;:::-;24513:24;;:8;:24;;;;24505:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;24625:8;24580:18;:32;24599:12;:10;:12::i;:::-;24580:32;;;;;;;;;;;;;;;:42;24613:8;24580:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;24678:8;24649:48;;24664:12;:10;:12::i;:::-;24649:48;;;24688:8;24649:48;;;;;;:::i;:::-;;;;;;;;24410:295;;:::o;25673:328::-;25848:41;25867:12;:10;:12::i;:::-;25881:7;25848:18;:41::i;:::-;25840:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25954:39;25968:4;25974:2;25978:7;25987:5;25954:13;:39::i;:::-;25673:328;;;;:::o;44307:861::-;44380:13;44418:16;44426:7;44418;:16::i;:::-;44410:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;44503:23;44529:10;:19;44540:7;44529:19;;;;;;;;;;;44503:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44563:18;44584:10;:8;:10::i;:::-;44563:31;;44712:1;44696:4;44690:18;:23;44686:80;;;44741:9;44734:16;;;;;;44686:80;44904:1;44884:9;44878:23;:27;44874:116;;;44957:4;44963:9;44940:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44926:48;;;;;;44874:116;45130:4;45136:18;:7;:16;:18::i;:::-;45113:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45099:57;;;;44307:861;;;;:::o;45190:236::-;42035:12;:10;:12::i;:::-;42024:23;;:7;:5;:7::i;:::-;:23;;;42016:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45346:20:::1;45352:3;45357:8;45346:5;:20::i;:::-;45381:33;45394:8;45404:9;45381:12;:33::i;:::-;45190:236:::0;;;:::o;24776:164::-;24873:4;24897:18;:25;24916:5;24897:25;;;;;;;;;;;;;;;:35;24923:8;24897:35;;;;;;;;;;;;;;;;;;;;;;;;;24890:42;;24776:164;;;;:::o;42704:192::-;42035:12;:10;:12::i;:::-;42024:23;;:7;:5;:7::i;:::-;:23;;;42016:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42813:1:::1;42793:22;;:8;:22;;;;42785:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;42869:19;42879:8;42869:9;:19::i;:::-;42704:192:::0;:::o;21613:305::-;21715:4;21767:25;21752:40;;;:11;:40;;;;:105;;;;21824:33;21809:48;;;:11;:48;;;;21752:105;:158;;;;21874:36;21898:11;21874:23;:36::i;:::-;21752:158;21732:178;;21613:305;;;:::o;27511:127::-;27576:4;27628:1;27600:30;;:7;:16;27608:7;27600:16;;;;;;;;;;;;;;;;;;;;;:30;;;;27593:37;;27511:127;;;:::o;20087:98::-;20140:7;20167:10;20160:17;;20087:98;:::o;31493:174::-;31595:2;31568:15;:24;31584:7;31568:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;31651:7;31647:2;31613:46;;31622:23;31637:7;31622:14;:23::i;:::-;31613:46;;;;;;;;;;;;31493:174;;:::o;27805:348::-;27898:4;27923:16;27931:7;27923;:16::i;:::-;27915:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27999:13;28015:23;28030:7;28015:14;:23::i;:::-;27999:39;;28068:5;28057:16;;:7;:16;;;:51;;;;28101:7;28077:31;;:20;28089:7;28077:11;:20::i;:::-;:31;;;28057:51;:87;;;;28112:32;28129:5;28136:7;28112:16;:32::i;:::-;28057:87;28049:96;;;27805:348;;;;:::o;30797:578::-;30956:4;30929:31;;:23;30944:7;30929:14;:23::i;:::-;:31;;;30921:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;31039:1;31025:16;;:2;:16;;;;31017:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;31095:39;31116:4;31122:2;31126:7;31095:20;:39::i;:::-;31199:29;31216:1;31220:7;31199:8;:29::i;:::-;31260:1;31241:9;:15;31251:4;31241:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;31289:1;31272:9;:13;31282:2;31272:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31320:2;31301:7;:16;31309:7;31301:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31359:7;31355:2;31340:27;;31349:4;31340:27;;;;;;;;;;;;30797:578;;;:::o;42904:173::-;42960:16;42979:6;;;;;;;;;;;42960:25;;43005:8;42996:6;;:17;;;;;;;;;;;;;;;;;;43060:8;43029:40;;43050:8;43029:40;;;;;;;;;;;;42949:128;42904:173;:::o;26883:315::-;27040:28;27050:4;27056:2;27060:7;27040:9;:28::i;:::-;27087:48;27110:4;27116:2;27120:7;27129:5;27087:22;:48::i;:::-;27079:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26883:315;;;;:::o;44162:125::-;44222:13;44259:16;44252:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44162:125;:::o;7919:723::-;7975:13;8205:1;8196:5;:10;8192:53;;;8223:10;;;;;;;;;;;;;;;;;;;;;8192:53;8255:12;8270:5;8255:20;;8286:14;8311:78;8326:1;8318:4;:9;8311:78;;8344:8;;;;;:::i;:::-;;;;8375:2;8367:10;;;;;:::i;:::-;;;8311:78;;;8399:19;8431:6;8421:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8399:39;;8449:154;8465:1;8456:5;:10;8449:154;;8493:1;8483:11;;;;;:::i;:::-;;;8560:2;8552:5;:10;;;;:::i;:::-;8539:2;:24;;;;:::i;:::-;8526:39;;8509:6;8516;8509:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;8589:2;8580:11;;;;;:::i;:::-;;;8449:154;;;8627:6;8613:21;;;;;7919:723;;;;:::o;29489:382::-;29583:1;29569:16;;:2;:16;;;;29561:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;29642:16;29650:7;29642;:16::i;:::-;29641:17;29633:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;29704:45;29733:1;29737:2;29741:7;29704:20;:45::i;:::-;29779:1;29762:9;:13;29772:2;29762:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29810:2;29791:7;:16;29799:7;29791:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29855:7;29851:2;29830:33;;29847:1;29830:33;;;;;;;;;;;;29489:382;;:::o;43663:227::-;43767:16;43775:7;43767;:16::i;:::-;43759:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;43869:9;43847:10;:19;43858:7;43847:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;43663:227;;:::o;7444:157::-;7529:4;7568:25;7553:40;;;:11;:40;;;;7546:47;;7444:157;;;:::o;36342:589::-;36486:45;36513:4;36519:2;36523:7;36486:26;:45::i;:::-;36564:1;36548:18;;:4;:18;;;36544:187;;;36583:40;36615:7;36583:31;:40::i;:::-;36544:187;;;36653:2;36645:10;;:4;:10;;;36641:90;;36672:47;36705:4;36711:7;36672:32;:47::i;:::-;36641:90;36544:187;36759:1;36745:16;;:2;:16;;;36741:183;;;36778:45;36815:7;36778:36;:45::i;:::-;36741:183;;;36851:4;36845:10;;:2;:10;;;36841:83;;36872:40;36900:2;36904:7;36872:27;:40::i;:::-;36841:83;36741:183;36342:589;;;:::o;32232:799::-;32387:4;32408:15;:2;:13;;;:15::i;:::-;32404:620;;;32460:2;32444:36;;;32481:12;:10;:12::i;:::-;32495:4;32501:7;32510:5;32444:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;32440:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32703:1;32686:6;:13;:18;32682:272;;;32729:60;;;;;;;;;;:::i;:::-;;;;;;;;32682:272;32904:6;32898:13;32889:6;32885:2;32881:15;32874:38;32440:529;32577:41;;;32567:51;;;:6;:51;;;;32560:58;;;;;32404:620;33008:4;33001:11;;32232:799;;;;;;;:::o;33603:126::-;;;;:::o;37654:164::-;37758:10;:17;;;;37731:15;:24;37747:7;37731:24;;;;;;;;;;;:44;;;;37786:10;37802:7;37786:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37654:164;:::o;38445:988::-;38711:22;38761:1;38736:22;38753:4;38736:16;:22::i;:::-;:26;;;;:::i;:::-;38711:51;;38773:18;38794:17;:26;38812:7;38794:26;;;;;;;;;;;;38773:47;;38941:14;38927:10;:28;38923:328;;38972:19;38994:12;:18;39007:4;38994:18;;;;;;;;;;;;;;;:34;39013:14;38994:34;;;;;;;;;;;;38972:56;;39078:11;39045:12;:18;39058:4;39045:18;;;;;;;;;;;;;;;:30;39064:10;39045:30;;;;;;;;;;;:44;;;;39195:10;39162:17;:30;39180:11;39162:30;;;;;;;;;;;:43;;;;38957:294;38923:328;39347:17;:26;39365:7;39347:26;;;;;;;;;;;39340:33;;;39391:12;:18;39404:4;39391:18;;;;;;;;;;;;;;;:34;39410:14;39391:34;;;;;;;;;;;39384:41;;;38526:907;;38445:988;;:::o;39728:1079::-;39981:22;40026:1;40006:10;:17;;;;:21;;;;:::i;:::-;39981:46;;40038:18;40059:15;:24;40075:7;40059:24;;;;;;;;;;;;40038:45;;40410:19;40432:10;40443:14;40432:26;;;;;;;;:::i;:::-;;;;;;;;;;40410:48;;40496:11;40471:10;40482;40471:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;40607:10;40576:15;:28;40592:11;40576:28;;;;;;;;;;;:41;;;;40748:15;:24;40764:7;40748:24;;;;;;;;;;;40741:31;;;40783:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;39799:1008;;;39728:1079;:::o;37232:221::-;37317:14;37334:20;37351:2;37334:16;:20::i;:::-;37317:37;;37392:7;37365:12;:16;37378:2;37365:16;;;;;;;;;;;;;;;:24;37382:6;37365:24;;;;;;;;;;;:34;;;;37439:6;37410:17;:26;37428:7;37410:26;;;;;;;;;;;:35;;;;37306:147;37232:221;;:::o;10444:387::-;10504:4;10712:12;10779:7;10767:20;10759:28;;10822:1;10815:4;:8;10808:15;;;10444:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:799::-;5707:6;5715;5723;5772:2;5760:9;5751:7;5747:23;5743:32;5740:119;;;5778:79;;:::i;:::-;5740:119;5898:1;5923:53;5968:7;5959:6;5948:9;5944:22;5923:53;:::i;:::-;5913:63;;5869:117;6025:2;6051:53;6096:7;6087:6;6076:9;6072:22;6051:53;:::i;:::-;6041:63;;5996:118;6181:2;6170:9;6166:18;6153:32;6212:18;6204:6;6201:30;6198:117;;;6234:79;;:::i;:::-;6198:117;6339:63;6394:7;6385:6;6374:9;6370:22;6339:63;:::i;:::-;6329:73;;6124:288;5620:799;;;;;:::o;6425:327::-;6483:6;6532:2;6520:9;6511:7;6507:23;6503:32;6500:119;;;6538:79;;:::i;:::-;6500:119;6658:1;6683:52;6727:7;6718:6;6707:9;6703:22;6683:52;:::i;:::-;6673:62;;6629:116;6425:327;;;;:::o;6758:349::-;6827:6;6876:2;6864:9;6855:7;6851:23;6847:32;6844:119;;;6882:79;;:::i;:::-;6844:119;7002:1;7027:63;7082:7;7073:6;7062:9;7058:22;7027:63;:::i;:::-;7017:73;;6973:127;6758:349;;;;:::o;7113:509::-;7182:6;7231:2;7219:9;7210:7;7206:23;7202:32;7199:119;;;7237:79;;:::i;:::-;7199:119;7385:1;7374:9;7370:17;7357:31;7415:18;7407:6;7404:30;7401:117;;;7437:79;;:::i;:::-;7401:117;7542:63;7597:7;7588:6;7577:9;7573:22;7542:63;:::i;:::-;7532:73;;7328:287;7113:509;;;;:::o;7628:329::-;7687:6;7736:2;7724:9;7715:7;7711:23;7707:32;7704:119;;;7742:79;;:::i;:::-;7704:119;7862:1;7887:53;7932:7;7923:6;7912:9;7908:22;7887:53;:::i;:::-;7877:63;;7833:117;7628:329;;;;:::o;7963:654::-;8041:6;8049;8098:2;8086:9;8077:7;8073:23;8069:32;8066:119;;;8104:79;;:::i;:::-;8066:119;8224:1;8249:53;8294:7;8285:6;8274:9;8270:22;8249:53;:::i;:::-;8239:63;;8195:117;8379:2;8368:9;8364:18;8351:32;8410:18;8402:6;8399:30;8396:117;;;8432:79;;:::i;:::-;8396:117;8537:63;8592:7;8583:6;8572:9;8568:22;8537:63;:::i;:::-;8527:73;;8322:288;7963:654;;;;;:::o;8623:118::-;8710:24;8728:5;8710:24;:::i;:::-;8705:3;8698:37;8623:118;;:::o;8747:109::-;8828:21;8843:5;8828:21;:::i;:::-;8823:3;8816:34;8747:109;;:::o;8862:360::-;8948:3;8976:38;9008:5;8976:38;:::i;:::-;9030:70;9093:6;9088:3;9030:70;:::i;:::-;9023:77;;9109:52;9154:6;9149:3;9142:4;9135:5;9131:16;9109:52;:::i;:::-;9186:29;9208:6;9186:29;:::i;:::-;9181:3;9177:39;9170:46;;8952:270;8862:360;;;;:::o;9228:364::-;9316:3;9344:39;9377:5;9344:39;:::i;:::-;9399:71;9463:6;9458:3;9399:71;:::i;:::-;9392:78;;9479:52;9524:6;9519:3;9512:4;9505:5;9501:16;9479:52;:::i;:::-;9556:29;9578:6;9556:29;:::i;:::-;9551:3;9547:39;9540:46;;9320:272;9228:364;;;;:::o;9598:377::-;9704:3;9732:39;9765:5;9732:39;:::i;:::-;9787:89;9869:6;9864:3;9787:89;:::i;:::-;9780:96;;9885:52;9930:6;9925:3;9918:4;9911:5;9907:16;9885:52;:::i;:::-;9962:6;9957:3;9953:16;9946:23;;9708:267;9598:377;;;;:::o;9981:366::-;10123:3;10144:67;10208:2;10203:3;10144:67;:::i;:::-;10137:74;;10220:93;10309:3;10220:93;:::i;:::-;10338:2;10333:3;10329:12;10322:19;;9981:366;;;:::o;10353:::-;10495:3;10516:67;10580:2;10575:3;10516:67;:::i;:::-;10509:74;;10592:93;10681:3;10592:93;:::i;:::-;10710:2;10705:3;10701:12;10694:19;;10353:366;;;:::o;10725:::-;10867:3;10888:67;10952:2;10947:3;10888:67;:::i;:::-;10881:74;;10964:93;11053:3;10964:93;:::i;:::-;11082:2;11077:3;11073:12;11066:19;;10725:366;;;:::o;11097:::-;11239:3;11260:67;11324:2;11319:3;11260:67;:::i;:::-;11253:74;;11336:93;11425:3;11336:93;:::i;:::-;11454:2;11449:3;11445:12;11438:19;;11097:366;;;:::o;11469:::-;11611:3;11632:67;11696:2;11691:3;11632:67;:::i;:::-;11625:74;;11708:93;11797:3;11708:93;:::i;:::-;11826:2;11821:3;11817:12;11810:19;;11469:366;;;:::o;11841:::-;11983:3;12004:67;12068:2;12063:3;12004:67;:::i;:::-;11997:74;;12080:93;12169:3;12080:93;:::i;:::-;12198:2;12193:3;12189:12;12182:19;;11841:366;;;:::o;12213:::-;12355:3;12376:67;12440:2;12435:3;12376:67;:::i;:::-;12369:74;;12452:93;12541:3;12452:93;:::i;:::-;12570:2;12565:3;12561:12;12554:19;;12213:366;;;:::o;12585:::-;12727:3;12748:67;12812:2;12807:3;12748:67;:::i;:::-;12741:74;;12824:93;12913:3;12824:93;:::i;:::-;12942:2;12937:3;12933:12;12926:19;;12585:366;;;:::o;12957:::-;13099:3;13120:67;13184:2;13179:3;13120:67;:::i;:::-;13113:74;;13196:93;13285:3;13196:93;:::i;:::-;13314:2;13309:3;13305:12;13298:19;;12957:366;;;:::o;13329:::-;13471:3;13492:67;13556:2;13551:3;13492:67;:::i;:::-;13485:74;;13568:93;13657:3;13568:93;:::i;:::-;13686:2;13681:3;13677:12;13670:19;;13329:366;;;:::o;13701:::-;13843:3;13864:67;13928:2;13923:3;13864:67;:::i;:::-;13857:74;;13940:93;14029:3;13940:93;:::i;:::-;14058:2;14053:3;14049:12;14042:19;;13701:366;;;:::o;14073:::-;14215:3;14236:67;14300:2;14295:3;14236:67;:::i;:::-;14229:74;;14312:93;14401:3;14312:93;:::i;:::-;14430:2;14425:3;14421:12;14414:19;;14073:366;;;:::o;14445:::-;14587:3;14608:67;14672:2;14667:3;14608:67;:::i;:::-;14601:74;;14684:93;14773:3;14684:93;:::i;:::-;14802:2;14797:3;14793:12;14786:19;;14445:366;;;:::o;14817:::-;14959:3;14980:67;15044:2;15039:3;14980:67;:::i;:::-;14973:74;;15056:93;15145:3;15056:93;:::i;:::-;15174:2;15169:3;15165:12;15158:19;;14817:366;;;:::o;15189:::-;15331:3;15352:67;15416:2;15411:3;15352:67;:::i;:::-;15345:74;;15428:93;15517:3;15428:93;:::i;:::-;15546:2;15541:3;15537:12;15530:19;;15189:366;;;:::o;15561:::-;15703:3;15724:67;15788:2;15783:3;15724:67;:::i;:::-;15717:74;;15800:93;15889:3;15800:93;:::i;:::-;15918:2;15913:3;15909:12;15902:19;;15561:366;;;:::o;15933:::-;16075:3;16096:67;16160:2;16155:3;16096:67;:::i;:::-;16089:74;;16172:93;16261:3;16172:93;:::i;:::-;16290:2;16285:3;16281:12;16274:19;;15933:366;;;:::o;16305:::-;16447:3;16468:67;16532:2;16527:3;16468:67;:::i;:::-;16461:74;;16544:93;16633:3;16544:93;:::i;:::-;16662:2;16657:3;16653:12;16646:19;;16305:366;;;:::o;16677:::-;16819:3;16840:67;16904:2;16899:3;16840:67;:::i;:::-;16833:74;;16916:93;17005:3;16916:93;:::i;:::-;17034:2;17029:3;17025:12;17018:19;;16677:366;;;:::o;17049:118::-;17136:24;17154:5;17136:24;:::i;:::-;17131:3;17124:37;17049:118;;:::o;17173:435::-;17353:3;17375:95;17466:3;17457:6;17375:95;:::i;:::-;17368:102;;17487:95;17578:3;17569:6;17487:95;:::i;:::-;17480:102;;17599:3;17592:10;;17173:435;;;;;:::o;17614:222::-;17707:4;17745:2;17734:9;17730:18;17722:26;;17758:71;17826:1;17815:9;17811:17;17802:6;17758:71;:::i;:::-;17614:222;;;;:::o;17842:640::-;18037:4;18075:3;18064:9;18060:19;18052:27;;18089:71;18157:1;18146:9;18142:17;18133:6;18089:71;:::i;:::-;18170:72;18238:2;18227:9;18223:18;18214:6;18170:72;:::i;:::-;18252;18320:2;18309:9;18305:18;18296:6;18252:72;:::i;:::-;18371:9;18365:4;18361:20;18356:2;18345:9;18341:18;18334:48;18399:76;18470:4;18461:6;18399:76;:::i;:::-;18391:84;;17842:640;;;;;;;:::o;18488:210::-;18575:4;18613:2;18602:9;18598:18;18590:26;;18626:65;18688:1;18677:9;18673:17;18664:6;18626:65;:::i;:::-;18488:210;;;;:::o;18704:313::-;18817:4;18855:2;18844:9;18840:18;18832:26;;18904:9;18898:4;18894:20;18890:1;18879:9;18875:17;18868:47;18932:78;19005:4;18996:6;18932:78;:::i;:::-;18924:86;;18704:313;;;;:::o;19023:419::-;19189:4;19227:2;19216:9;19212:18;19204:26;;19276:9;19270:4;19266:20;19262:1;19251:9;19247:17;19240:47;19304:131;19430:4;19304:131;:::i;:::-;19296:139;;19023:419;;;:::o;19448:::-;19614:4;19652:2;19641:9;19637:18;19629:26;;19701:9;19695:4;19691:20;19687:1;19676:9;19672:17;19665:47;19729:131;19855:4;19729:131;:::i;:::-;19721:139;;19448:419;;;:::o;19873:::-;20039:4;20077:2;20066:9;20062:18;20054:26;;20126:9;20120:4;20116:20;20112:1;20101:9;20097:17;20090:47;20154:131;20280:4;20154:131;:::i;:::-;20146:139;;19873:419;;;:::o;20298:::-;20464:4;20502:2;20491:9;20487:18;20479:26;;20551:9;20545:4;20541:20;20537:1;20526:9;20522:17;20515:47;20579:131;20705:4;20579:131;:::i;:::-;20571:139;;20298:419;;;:::o;20723:::-;20889:4;20927:2;20916:9;20912:18;20904:26;;20976:9;20970:4;20966:20;20962:1;20951:9;20947:17;20940:47;21004:131;21130:4;21004:131;:::i;:::-;20996:139;;20723:419;;;:::o;21148:::-;21314:4;21352:2;21341:9;21337:18;21329:26;;21401:9;21395:4;21391:20;21387:1;21376:9;21372:17;21365:47;21429:131;21555:4;21429:131;:::i;:::-;21421:139;;21148:419;;;:::o;21573:::-;21739:4;21777:2;21766:9;21762:18;21754:26;;21826:9;21820:4;21816:20;21812:1;21801:9;21797:17;21790:47;21854:131;21980:4;21854:131;:::i;:::-;21846:139;;21573:419;;;:::o;21998:::-;22164:4;22202:2;22191:9;22187:18;22179:26;;22251:9;22245:4;22241:20;22237:1;22226:9;22222:17;22215:47;22279:131;22405:4;22279:131;:::i;:::-;22271:139;;21998:419;;;:::o;22423:::-;22589:4;22627:2;22616:9;22612:18;22604:26;;22676:9;22670:4;22666:20;22662:1;22651:9;22647:17;22640:47;22704:131;22830:4;22704:131;:::i;:::-;22696:139;;22423:419;;;:::o;22848:::-;23014:4;23052:2;23041:9;23037:18;23029:26;;23101:9;23095:4;23091:20;23087:1;23076:9;23072:17;23065:47;23129:131;23255:4;23129:131;:::i;:::-;23121:139;;22848:419;;;:::o;23273:::-;23439:4;23477:2;23466:9;23462:18;23454:26;;23526:9;23520:4;23516:20;23512:1;23501:9;23497:17;23490:47;23554:131;23680:4;23554:131;:::i;:::-;23546:139;;23273:419;;;:::o;23698:::-;23864:4;23902:2;23891:9;23887:18;23879:26;;23951:9;23945:4;23941:20;23937:1;23926:9;23922:17;23915:47;23979:131;24105:4;23979:131;:::i;:::-;23971:139;;23698:419;;;:::o;24123:::-;24289:4;24327:2;24316:9;24312:18;24304:26;;24376:9;24370:4;24366:20;24362:1;24351:9;24347:17;24340:47;24404:131;24530:4;24404:131;:::i;:::-;24396:139;;24123:419;;;:::o;24548:::-;24714:4;24752:2;24741:9;24737:18;24729:26;;24801:9;24795:4;24791:20;24787:1;24776:9;24772:17;24765:47;24829:131;24955:4;24829:131;:::i;:::-;24821:139;;24548:419;;;:::o;24973:::-;25139:4;25177:2;25166:9;25162:18;25154:26;;25226:9;25220:4;25216:20;25212:1;25201:9;25197:17;25190:47;25254:131;25380:4;25254:131;:::i;:::-;25246:139;;24973:419;;;:::o;25398:::-;25564:4;25602:2;25591:9;25587:18;25579:26;;25651:9;25645:4;25641:20;25637:1;25626:9;25622:17;25615:47;25679:131;25805:4;25679:131;:::i;:::-;25671:139;;25398:419;;;:::o;25823:::-;25989:4;26027:2;26016:9;26012:18;26004:26;;26076:9;26070:4;26066:20;26062:1;26051:9;26047:17;26040:47;26104:131;26230:4;26104:131;:::i;:::-;26096:139;;25823:419;;;:::o;26248:::-;26414:4;26452:2;26441:9;26437:18;26429:26;;26501:9;26495:4;26491:20;26487:1;26476:9;26472:17;26465:47;26529:131;26655:4;26529:131;:::i;:::-;26521:139;;26248:419;;;:::o;26673:::-;26839:4;26877:2;26866:9;26862:18;26854:26;;26926:9;26920:4;26916:20;26912:1;26901:9;26897:17;26890:47;26954:131;27080:4;26954:131;:::i;:::-;26946:139;;26673:419;;;:::o;27098:222::-;27191:4;27229:2;27218:9;27214:18;27206:26;;27242:71;27310:1;27299:9;27295:17;27286:6;27242:71;:::i;:::-;27098:222;;;;:::o;27326:129::-;27360:6;27387:20;;:::i;:::-;27377:30;;27416:33;27444:4;27436:6;27416:33;:::i;:::-;27326:129;;;:::o;27461:75::-;27494:6;27527:2;27521:9;27511:19;;27461:75;:::o;27542:307::-;27603:4;27693:18;27685:6;27682:30;27679:56;;;27715:18;;:::i;:::-;27679:56;27753:29;27775:6;27753:29;:::i;:::-;27745:37;;27837:4;27831;27827:15;27819:23;;27542:307;;;:::o;27855:308::-;27917:4;28007:18;27999:6;27996:30;27993:56;;;28029:18;;:::i;:::-;27993:56;28067:29;28089:6;28067:29;:::i;:::-;28059:37;;28151:4;28145;28141:15;28133:23;;27855:308;;;:::o;28169:98::-;28220:6;28254:5;28248:12;28238:22;;28169:98;;;:::o;28273:99::-;28325:6;28359:5;28353:12;28343:22;;28273:99;;;:::o;28378:168::-;28461:11;28495:6;28490:3;28483:19;28535:4;28530:3;28526:14;28511:29;;28378:168;;;;:::o;28552:169::-;28636:11;28670:6;28665:3;28658:19;28710:4;28705:3;28701:14;28686:29;;28552:169;;;;:::o;28727:148::-;28829:11;28866:3;28851:18;;28727:148;;;;:::o;28881:305::-;28921:3;28940:20;28958:1;28940:20;:::i;:::-;28935:25;;28974:20;28992:1;28974:20;:::i;:::-;28969:25;;29128:1;29060:66;29056:74;29053:1;29050:81;29047:107;;;29134:18;;:::i;:::-;29047:107;29178:1;29175;29171:9;29164:16;;28881:305;;;;:::o;29192:185::-;29232:1;29249:20;29267:1;29249:20;:::i;:::-;29244:25;;29283:20;29301:1;29283:20;:::i;:::-;29278:25;;29322:1;29312:35;;29327:18;;:::i;:::-;29312:35;29369:1;29366;29362:9;29357:14;;29192:185;;;;:::o;29383:191::-;29423:4;29443:20;29461:1;29443:20;:::i;:::-;29438:25;;29477:20;29495:1;29477:20;:::i;:::-;29472:25;;29516:1;29513;29510:8;29507:34;;;29521:18;;:::i;:::-;29507:34;29566:1;29563;29559:9;29551:17;;29383:191;;;;:::o;29580:96::-;29617:7;29646:24;29664:5;29646:24;:::i;:::-;29635:35;;29580:96;;;:::o;29682:90::-;29716:7;29759:5;29752:13;29745:21;29734:32;;29682:90;;;:::o;29778:149::-;29814:7;29854:66;29847:5;29843:78;29832:89;;29778:149;;;:::o;29933:126::-;29970:7;30010:42;30003:5;29999:54;29988:65;;29933:126;;;:::o;30065:77::-;30102:7;30131:5;30120:16;;30065:77;;;:::o;30148:154::-;30232:6;30227:3;30222;30209:30;30294:1;30285:6;30280:3;30276:16;30269:27;30148:154;;;:::o;30308:307::-;30376:1;30386:113;30400:6;30397:1;30394:13;30386:113;;;30485:1;30480:3;30476:11;30470:18;30466:1;30461:3;30457:11;30450:39;30422:2;30419:1;30415:10;30410:15;;30386:113;;;30517:6;30514:1;30511:13;30508:101;;;30597:1;30588:6;30583:3;30579:16;30572:27;30508:101;30357:258;30308:307;;;:::o;30621:320::-;30665:6;30702:1;30696:4;30692:12;30682:22;;30749:1;30743:4;30739:12;30770:18;30760:81;;30826:4;30818:6;30814:17;30804:27;;30760:81;30888:2;30880:6;30877:14;30857:18;30854:38;30851:84;;;30907:18;;:::i;:::-;30851:84;30672:269;30621:320;;;:::o;30947:281::-;31030:27;31052:4;31030:27;:::i;:::-;31022:6;31018:40;31160:6;31148:10;31145:22;31124:18;31112:10;31109:34;31106:62;31103:88;;;31171:18;;:::i;:::-;31103:88;31211:10;31207:2;31200:22;30990:238;30947:281;;:::o;31234:233::-;31273:3;31296:24;31314:5;31296:24;:::i;:::-;31287:33;;31342:66;31335:5;31332:77;31329:103;;;31412:18;;:::i;:::-;31329:103;31459:1;31452:5;31448:13;31441:20;;31234:233;;;:::o;31473:176::-;31505:1;31522:20;31540:1;31522:20;:::i;:::-;31517:25;;31556:20;31574:1;31556:20;:::i;:::-;31551:25;;31595:1;31585:35;;31600:18;;:::i;:::-;31585:35;31641:1;31638;31634:9;31629:14;;31473:176;;;;:::o;31655:180::-;31703:77;31700:1;31693:88;31800:4;31797:1;31790:15;31824:4;31821:1;31814:15;31841:180;31889:77;31886:1;31879:88;31986:4;31983:1;31976:15;32010:4;32007:1;32000:15;32027:180;32075:77;32072:1;32065:88;32172:4;32169:1;32162:15;32196:4;32193:1;32186:15;32213:180;32261:77;32258:1;32251:88;32358:4;32355:1;32348:15;32382:4;32379:1;32372:15;32399:180;32447:77;32444:1;32437:88;32544:4;32541:1;32534:15;32568:4;32565:1;32558:15;32585:180;32633:77;32630:1;32623:88;32730:4;32727:1;32720:15;32754:4;32751:1;32744:15;32771:117;32880:1;32877;32870:12;32894:117;33003:1;33000;32993:12;33017:117;33126:1;33123;33116:12;33140:117;33249:1;33246;33239:12;33263:102;33304:6;33355:2;33351:7;33346:2;33339:5;33335:14;33331:28;33321:38;;33263:102;;;:::o;33371:230::-;33511:34;33507:1;33499:6;33495:14;33488:58;33580:13;33575:2;33567:6;33563:15;33556:38;33371:230;:::o;33607:237::-;33747:34;33743:1;33735:6;33731:14;33724:58;33816:20;33811:2;33803:6;33799:15;33792:45;33607:237;:::o;33850:225::-;33990:34;33986:1;33978:6;33974:14;33967:58;34059:8;34054:2;34046:6;34042:15;34035:33;33850:225;:::o;34081:178::-;34221:30;34217:1;34209:6;34205:14;34198:54;34081:178;:::o;34265:223::-;34405:34;34401:1;34393:6;34389:14;34382:58;34474:6;34469:2;34461:6;34457:15;34450:31;34265:223;:::o;34494:175::-;34634:27;34630:1;34622:6;34618:14;34611:51;34494:175;:::o;34675:231::-;34815:34;34811:1;34803:6;34799:14;34792:58;34884:14;34879:2;34871:6;34867:15;34860:39;34675:231;:::o;34912:243::-;35052:34;35048:1;35040:6;35036:14;35029:58;35121:26;35116:2;35108:6;35104:15;35097:51;34912:243;:::o;35161:229::-;35301:34;35297:1;35289:6;35285:14;35278:58;35370:12;35365:2;35357:6;35353:15;35346:37;35161:229;:::o;35396:228::-;35536:34;35532:1;35524:6;35520:14;35513:58;35605:11;35600:2;35592:6;35588:15;35581:36;35396:228;:::o;35630:182::-;35770:34;35766:1;35758:6;35754:14;35747:58;35630:182;:::o;35818:231::-;35958:34;35954:1;35946:6;35942:14;35935:58;36027:14;36022:2;36014:6;36010:15;36003:39;35818:231;:::o;36055:::-;36195:34;36191:1;36183:6;36179:14;36172:58;36264:14;36259:2;36251:6;36247:15;36240:39;36055:231;:::o;36292:182::-;36432:34;36428:1;36420:6;36416:14;36409:58;36292:182;:::o;36480:228::-;36620:34;36616:1;36608:6;36604:14;36597:58;36689:11;36684:2;36676:6;36672:15;36665:36;36480:228;:::o;36714:234::-;36854:34;36850:1;36842:6;36838:14;36831:58;36923:17;36918:2;36910:6;36906:15;36899:42;36714:234;:::o;36954:220::-;37094:34;37090:1;37082:6;37078:14;37071:58;37163:3;37158:2;37150:6;37146:15;37139:28;36954:220;:::o;37180:236::-;37320:34;37316:1;37308:6;37304:14;37297:58;37389:19;37384:2;37376:6;37372:15;37365:44;37180:236;:::o;37422:231::-;37562:34;37558:1;37550:6;37546:14;37539:58;37631:14;37626:2;37618:6;37614:15;37607:39;37422:231;:::o;37659:122::-;37732:24;37750:5;37732:24;:::i;:::-;37725:5;37722:35;37712:63;;37771:1;37768;37761:12;37712:63;37659:122;:::o;37787:116::-;37857:21;37872:5;37857:21;:::i;:::-;37850:5;37847:32;37837:60;;37893:1;37890;37883:12;37837:60;37787:116;:::o;37909:120::-;37981:23;37998:5;37981:23;:::i;:::-;37974:5;37971:34;37961:62;;38019:1;38016;38009:12;37961:62;37909:120;:::o;38035:122::-;38108:24;38126:5;38108:24;:::i;:::-;38101:5;38098:35;38088:63;;38147:1;38144;38137:12;38088:63;38035:122;:::o

Swarm Source

ipfs://cf976da926cfdadf1934aec91142852471d6b2ab893d2771182aea33c3ba312e
Loading