ETH Price: $3,211.70 (-3.85%)
Gas: 28.3 Gwei

Token

PLACES (PCS)
 

Overview

Max Total Supply

163 PCS

Holders

117

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
brunoshi.eth
Balance
1 PCS
0x85194fFba51D0A3d9b7aBcAe802868F1e03f021C
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
PLACES

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-10-22
*/

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


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (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/token/ERC721/IERC721.sol


// OpenZeppelin Contracts (last updated v4.7.0) (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`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

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

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.5.0) (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);

    /**
     * @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/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (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/[email protected]/utils/cryptography/MerkleProof.sol


// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

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


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

// File: ERC721A.sol


// Creator: Chiru Labs

pragma solidity ^0.8.4;









error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is Context, ERC165, IERC721 {
    using Address for address;
    using Strings for uint256;
    mapping(address => uint256[]) public _addressLastMintedTokenIds;

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) internal _addressData;

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

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 1;
    }

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @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 override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        _addressData[owner].aux = aux;
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr && curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return _ownershipOf(tokenId).addr;
    }

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId, string memory baseExtension) public view virtual returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

    /**
     * @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 override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

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

        _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 {
        _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 {
        _transfer(from, to, tokenId);
        if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    /**
     * @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`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned;
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        delete _addressLastMintedTokenIds[msg.sender];

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (safe && to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex != end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    _addressLastMintedTokenIds[msg.sender].push(updatedIndex);
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex != end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) private {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev This is equivalent to _burn(tokenId, false)
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            AddressData storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
            return retval == IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * 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, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}
// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (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() {
        _transferOwnership(_msgSender());
    }

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

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

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

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

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

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

// File: PLACES.sol

//SPDX-License-Identifier: MIT

pragma solidity 0.8.17;




contract PLACES is ERC721A, Ownable {
  using Strings for uint256;

  address _contractOwner;
  string private contractBaseURI;
  string private baseURI;
  string private baseExtension = ".json";
  uint256 private _nftEtherValue = 0.01 ether;
  uint256 private maxSupply = 163;
  uint256 private maxMintAmount = 2;
  uint256 private _maxMintAmountAllowedPerWallet = 3;
  uint256 private _maxFreeMintAmountAllowedPerWallet = 1;
  mapping(address => uint256) private _freeMintAmountPerWallet;
  mapping(address => uint256) private _mintAmountPerWallet;
  bool private _freemint = false;
  bool private paused = false;
  bool private revealed = false;
  string private notRevealedUri;

  mapping(uint256 => uint) private _availableTokens;
  mapping(uint256 => bool) private _mintedNFTs;
  uint256 private qtdMintedToken;

  bytes32 public root = 0x87036368301cd41ef0e0f55d2713fc5ed27f9a1fb9f240c3cb708fed18a95629;

  bytes32[] private merkleProof;
  mapping(address => bool) private whitelistClaimed;

  constructor(
    string memory _initBaseURI,
    string memory _initNotRevealedUri,
    string memory _contractURI
  ) ERC721A("PLACES", "PCS") {
    setBaseURI(_initBaseURI);
    setNotRevealedURI(_initNotRevealedUri);
    contractBaseURI = _contractURI;

     _contractOwner = msg.sender;
  }

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

  function getLastTokensIds(address wallet) public view returns (uint256[] memory) {
    return _addressLastMintedTokenIds[wallet];
  }

  function isValid(bytes32[] memory proof, bytes32 leaf) public view returns (bool) {
      return MerkleProof.verify(proof, root, leaf);
  }

  function isWhitelisted(address _user, bytes32[] memory proof) public view returns (bool) {
    if( isValid( proof, keccak256( abi.encodePacked(_user) ) ) ) {
      if (whitelistClaimed[_user]) {
        return false;
      }
      return true;
    } else {
      return false;
    }
  }

  function mintPublic(uint256 _mintAmount) public payable {
    require(!paused, "O contrato esta pausado.");
    require(_mintAmount > 0, "Precisa mintar pelo menos 1 NFT.");
    require(totalSupply() + _mintAmount <= maxSupply, "Quantidade limite de mint excedida.");
    require(_mintAmount +_mintAmountPerWallet[msg.sender] <= _maxMintAmountAllowedPerWallet, "Esta carteira mintou a quantidade limite de tokens publicos permitidos por carteira.");
    require(msg.value >= (_nftEtherValue * _mintAmount), "Valor da mintagem diferente do valor definido no contrato!");

    _mintAmountPerWallet[msg.sender] += _mintAmount;
    _mint(msg.sender, _mintAmount, '', true);

    payable(_contractOwner).transfer(msg.value);
  }

  function mintWhitelist(uint256 _mintAmount, bytes32[] memory proof) public payable {
    require(isWhitelisted(msg.sender, proof), "A carteira deve pertencer a whitelist");
    require(!paused, "O contrato esta pausado.");
    require(_mintAmount > 0, "Precisa mintar pelo menos 1 NFT.");
    require(totalSupply() + _mintAmount <= maxSupply, "Quantidade limite de mint excedida.");
    require(!whitelistClaimed[msg.sender], "Address ja reivindicado");
    require(_mintAmount + _freeMintAmountPerWallet[msg.sender] <= _maxFreeMintAmountAllowedPerWallet, "Quantidade limite de mint free por carteira excedida.");

    _freeMintAmountPerWallet[msg.sender] += _mintAmount;

    if(_freeMintAmountPerWallet[msg.sender] >= _maxFreeMintAmountAllowedPerWallet){
      whitelistClaimed[msg.sender] = true;
    }
    _mint(msg.sender, _mintAmount, '', true);
  }

  function contractURI() public view returns (string memory) {
    return contractBaseURI;
  }

  function tokenURI(uint256 tokenId)
    public
    view
    virtual
    returns (string memory)
  {
    require(
      _exists(tokenId),
      "ERC721Metadata: URI query for nonexistent token"
    );

    if(revealed == false) {
        return notRevealedUri;
    }

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

  function getNftEtherValue() public view returns(uint256){
    return _nftEtherValue;
  }

  function getMaxMintAmount() public view returns (uint256) {
    return maxMintAmount;
  }

  function getMaxMintAmountAllowedPerWallet() public view returns (uint256) {
    return _maxMintAmountAllowedPerWallet;
  }

  function getMaxFreeMintAmountAllowedPerWallet() public view returns (uint256) {
    return _maxFreeMintAmountAllowedPerWallet;
  }

  function getFreeMintAmountPerWallet(address wallet) public view returns (uint256) {
    return _freeMintAmountPerWallet[wallet];
  }

  function getMintAmountPerWallet(address wallet) public view returns (uint256) {
    return _mintAmountPerWallet[wallet];
  }

  function getMaxSupply() public view returns(uint256){
    return maxSupply;
  }

  function isFreemint() public view returns(bool){
    return _freemint;
  }

  function isPaused() public view returns(bool){
    return paused;
  }

  //only owner
  function reveal() public onlyOwner {
      revealed = true;
  }

  function setNftEtherValue(uint256 nftEtherValue_) public onlyOwner {
    _nftEtherValue = nftEtherValue_;
  }

  function setmaxMintAmount(uint256 _newmaxMintAmount) public onlyOwner {
    maxMintAmount = _newmaxMintAmount;
  }

  function setMaxMintAmountAllowedPerWallet(uint256 maxMintAmountAllowedPerWallet_) public onlyOwner {
    _maxMintAmountAllowedPerWallet = maxMintAmountAllowedPerWallet_;
  }

  function setMaxFreeMintAmountAllowedPerWallet(uint256 maxFreeMintAmountAllowedPerWallet_) public onlyOwner {
    _maxFreeMintAmountAllowedPerWallet = maxFreeMintAmountAllowedPerWallet_;
  }

  function setFreeMintAmountPerWallet(address address_) internal {
    _freeMintAmountPerWallet[address_]++;
  }

  function setMintAmountPerWallet(address address_) internal {
    _mintAmountPerWallet[address_]++;
  }

  function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner {
    notRevealedUri = _notRevealedURI;
  }

  function setContractBaseURI(string memory _contractBaseURI) public onlyOwner {
    contractBaseURI = _contractBaseURI;
  }

  function setBaseURI(string memory _newBaseURI) public onlyOwner {
    baseURI = _newBaseURI;
  }

  function setBaseExtension(string memory _newBaseExtension) public onlyOwner {
    baseExtension = _newBaseExtension;
  }

  function pause(bool _state) public onlyOwner {
    paused = _state;
  }

  function setFreemint(bool _state) public onlyOwner {
    _freemint = _state;
  }

  function setWhitelistClaimed(address wallet) public onlyOwner {
    whitelistClaimed[wallet] = true;
  }

  function setMaxSupply(uint256 maxSupply_) public onlyOwner {
     maxSupply = maxSupply_;
  }

  function withdraw() public payable onlyOwner {
    // This will pay HashLips 5% of the initial sale.
    // You can remove this if you want, or keep it in to support HashLips and his channel.
    // =============================================================================
    (bool hs, ) = payable(0xD323EdFe73A6a57dE58B2A15eDa830F9f43beA69).call{value: address(this).balance * 5 / 100}("");
    require(hs);
    // =============================================================================

    // This will payout the owner 95% of the contract balance.
    // Do not remove this otherwise you will not be able to withdraw the funds.
    // =============================================================================
    (bool os, ) = payable(owner()).call{value: address(this).balance}("");
    require(os);
    // =============================================================================
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"string","name":"_initNotRevealedUri","type":"string"},{"internalType":"string","name":"_contractURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"_addressLastMintedTokenIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"wallet","type":"address"}],"name":"getFreeMintAmountPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"getLastTokensIds","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxFreeMintAmountAllowedPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxMintAmountAllowedPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"getMintAmountPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNftEtherValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"isFreemint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"bytes32","name":"leaf","type":"bytes32"}],"name":"isValid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mintPublic","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mintWhitelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"root","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_contractBaseURI","type":"string"}],"name":"setContractBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setFreemint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxFreeMintAmountAllowedPerWallet_","type":"uint256"}],"name":"setMaxFreeMintAmountAllowedPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxMintAmountAllowedPerWallet_","type":"uint256"}],"name":"setMaxMintAmountAllowedPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxSupply_","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftEtherValue_","type":"uint256"}],"name":"setNftEtherValue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"setWhitelistClaimed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newmaxMintAmount","type":"uint256"}],"name":"setmaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"baseExtension","type":"string"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600d90816200004a9190620006b1565b50662386f26fc10000600e5560a3600f556002601055600360115560016012556000601560006101000a81548160ff0219169083151502179055506000601560016101000a81548160ff0219169083151502179055506000601560026101000a81548160ff0219169083151502179055507f87036368301cd41ef0e0f55d2713fc5ed27f9a1fb9f240c3cb708fed18a9562960001b601a55348015620000ef57600080fd5b506040516200563c3803806200563c8339818101604052810190620001159190620008fc565b6040518060400160405280600681526020017f504c4143455300000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f50435300000000000000000000000000000000000000000000000000000000008152508160039081620001929190620006b1565b508060049081620001a49190620006b1565b50620001b56200025b60201b60201c565b6001819055505050620001dd620001d16200026460201b60201c565b6200026c60201b60201c565b620001ee836200033260201b60201c565b620001ff826200035760201b60201c565b80600b9081620002109190620006b1565b5033600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505062000a38565b60006001905090565b600033905090565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620003426200037c60201b60201c565b80600c9081620003539190620006b1565b5050565b620003676200037c60201b60201c565b8060169081620003789190620006b1565b5050565b6200038c6200026460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003b26200040d60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200040b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004029062000a16565b60405180910390fd5b565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620004b957607f821691505b602082108103620004cf57620004ce62000471565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620005397fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620004fa565b620005458683620004fa565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620005926200058c62000586846200055d565b62000567565b6200055d565b9050919050565b6000819050919050565b620005ae8362000571565b620005c6620005bd8262000599565b84845462000507565b825550505050565b600090565b620005dd620005ce565b620005ea818484620005a3565b505050565b5b81811015620006125762000606600082620005d3565b600181019050620005f0565b5050565b601f82111562000661576200062b81620004d5565b6200063684620004ea565b8101602085101562000646578190505b6200065e6200065585620004ea565b830182620005ef565b50505b505050565b600082821c905092915050565b6000620006866000198460080262000666565b1980831691505092915050565b6000620006a1838362000673565b9150826002028217905092915050565b620006bc8262000437565b67ffffffffffffffff811115620006d857620006d762000442565b5b620006e48254620004a0565b620006f182828562000616565b600060209050601f83116001811462000729576000841562000714578287015190505b62000720858262000693565b86555062000790565b601f1984166200073986620004d5565b60005b8281101562000763578489015182556001820191506020850194506020810190506200073c565b868310156200078357848901516200077f601f89168262000673565b8355505b6001600288020188555050505b505050505050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b620007d282620007b6565b810181811067ffffffffffffffff82111715620007f457620007f362000442565b5b80604052505050565b60006200080962000798565b9050620008178282620007c7565b919050565b600067ffffffffffffffff8211156200083a576200083962000442565b5b6200084582620007b6565b9050602081019050919050565b60005b838110156200087257808201518184015260208101905062000855565b60008484015250505050565b6000620008956200088f846200081c565b620007fd565b905082815260208101848484011115620008b457620008b3620007b1565b5b620008c184828562000852565b509392505050565b600082601f830112620008e157620008e0620007ac565b5b8151620008f38482602086016200087e565b91505092915050565b600080600060608486031215620009185762000917620007a2565b5b600084015167ffffffffffffffff811115620009395762000938620007a7565b5b6200094786828701620008c9565b935050602084015167ffffffffffffffff8111156200096b576200096a620007a7565b5b6200097986828701620008c9565b925050604084015167ffffffffffffffff8111156200099d576200099c620007a7565b5b620009ab86828701620008c9565b9150509250925092565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000620009fe602083620009b5565b915062000a0b82620009c6565b602082019050919050565b6000602082019050818103600083015262000a3181620009ef565b9050919050565b614bf48062000a486000396000f3fe6080604052600436106102ae5760003560e01c8063715018a611610175578063be00f04f116100dc578063e8a3d48511610095578063efd0cbf91161006f578063efd0cbf914610ab4578063f2c4ce1e14610ad0578063f2fde38b14610af9578063fba8bb4d14610b22576102ae565b8063e8a3d48514610a21578063e985e9c514610a4c578063ebf0c71714610a89576102ae565b8063be00f04f14610913578063c87b56dd1461093c578063cccddc4514610979578063d03be3ec146109a2578063d6e7b8e4146109cd578063da3ef23f146109f8576102ae565b8063a1d8bd7e1161012e578063a1d8bd7e14610805578063a22cb46514610842578063a475b5dd1461086b578063b187bd2614610882578063b88d4fde146108ad578063b8a20ed0146108d6576102ae565b8063715018a6146107095780637d7bf8fe146107205780637f00c7a61461074957806385c59582146107725780638da5cb5b146107af57806395d89b41146107da576102ae565b80634146ba8d116102195780635a23dd99116101d25780635a23dd99146105d75780636352211e146106145780636789c468146106515780636e17f7971461067a5780636f8b44b0146106a357806370a08231146106cc576102ae565b80634146ba8d146104b557806341dcf454146104f257806342842e0e1461052f5780634c0f38c214610558578063542ee3471461058357806355f804b3146105ae576102ae565b8063095ea7b31161026b578063095ea7b3146103c857806313a7971e146103f157806318160ddd1461041a57806323b872dd14610445578063314e21aa1461046e5780633ccfd60b146104ab576102ae565b806301ffc9a7146102b357806302329a29146102f057806304b2515214610319578063061431a81461034457806306fdde0314610360578063081812fc1461038b575b600080fd5b3480156102bf57600080fd5b506102da60048036038101906102d591906134a1565b610b4d565b6040516102e791906134e9565b60405180910390f35b3480156102fc57600080fd5b5061031760048036038101906103129190613530565b610c2f565b005b34801561032557600080fd5b5061032e610c54565b60405161033b9190613576565b60405180910390f35b61035e6004803603810190610359919061374c565b610c5e565b005b34801561036c57600080fd5b50610375610fc4565b6040516103829190613827565b60405180910390f35b34801561039757600080fd5b506103b260048036038101906103ad9190613849565b611056565b6040516103bf91906138b7565b60405180910390f35b3480156103d457600080fd5b506103ef60048036038101906103ea91906138fe565b6110d2565b005b3480156103fd57600080fd5b5061041860048036038101906104139190613849565b6111dc565b005b34801561042657600080fd5b5061042f6111ee565b60405161043c9190613576565b60405180910390f35b34801561045157600080fd5b5061046c6004803603810190610467919061393e565b611205565b005b34801561047a57600080fd5b5061049560048036038101906104909190613991565b611215565b6040516104a29190613576565b60405180910390f35b6104b361125e565b005b3480156104c157600080fd5b506104dc60048036038101906104d79190613991565b611389565b6040516104e99190613a7c565b60405180910390f35b3480156104fe57600080fd5b5061051960048036038101906105149190613b53565b61141f565b6040516105269190613827565b60405180910390f35b34801561053b57600080fd5b506105566004803603810190610551919061393e565b6114c0565b005b34801561056457600080fd5b5061056d6114e0565b60405161057a9190613576565b60405180910390f35b34801561058f57600080fd5b506105986114ea565b6040516105a591906134e9565b60405180910390f35b3480156105ba57600080fd5b506105d560048036038101906105d09190613baf565b611501565b005b3480156105e357600080fd5b506105fe60048036038101906105f99190613bf8565b61151c565b60405161060b91906134e9565b60405180910390f35b34801561062057600080fd5b5061063b60048036038101906106369190613849565b6115c2565b60405161064891906138b7565b60405180910390f35b34801561065d57600080fd5b5061067860048036038101906106739190613530565b6115d8565b005b34801561068657600080fd5b506106a1600480360381019061069c9190613849565b6115fd565b005b3480156106af57600080fd5b506106ca60048036038101906106c59190613849565b61160f565b005b3480156106d857600080fd5b506106f360048036038101906106ee9190613991565b611621565b6040516107009190613576565b60405180910390f35b34801561071557600080fd5b5061071e6116f0565b005b34801561072c57600080fd5b5061074760048036038101906107429190613991565b611704565b005b34801561075557600080fd5b50610770600480360381019061076b9190613849565b611767565b005b34801561077e57600080fd5b5061079960048036038101906107949190613991565b611779565b6040516107a69190613576565b60405180910390f35b3480156107bb57600080fd5b506107c46117c2565b6040516107d191906138b7565b60405180910390f35b3480156107e657600080fd5b506107ef6117ec565b6040516107fc9190613827565b60405180910390f35b34801561081157600080fd5b5061082c600480360381019061082791906138fe565b61187e565b6040516108399190613576565b60405180910390f35b34801561084e57600080fd5b5061086960048036038101906108649190613c54565b6118af565b005b34801561087757600080fd5b50610880611a26565b005b34801561088e57600080fd5b50610897611a4b565b6040516108a491906134e9565b60405180910390f35b3480156108b957600080fd5b506108d460048036038101906108cf9190613d35565b611a62565b005b3480156108e257600080fd5b506108fd60048036038101906108f89190613db8565b611ade565b60405161090a91906134e9565b60405180910390f35b34801561091f57600080fd5b5061093a60048036038101906109359190613baf565b611af5565b005b34801561094857600080fd5b50610963600480360381019061095e9190613849565b611b10565b6040516109709190613827565b60405180910390f35b34801561098557600080fd5b506109a0600480360381019061099b9190613849565b611c68565b005b3480156109ae57600080fd5b506109b7611c7a565b6040516109c49190613576565b60405180910390f35b3480156109d957600080fd5b506109e2611c84565b6040516109ef9190613576565b60405180910390f35b348015610a0457600080fd5b50610a1f6004803603810190610a1a9190613baf565b611c8e565b005b348015610a2d57600080fd5b50610a36611ca9565b604051610a439190613827565b60405180910390f35b348015610a5857600080fd5b50610a736004803603810190610a6e9190613e14565b611d3b565b604051610a8091906134e9565b60405180910390f35b348015610a9557600080fd5b50610a9e611dcf565b604051610aab9190613e63565b60405180910390f35b610ace6004803603810190610ac99190613849565b611dd5565b005b348015610adc57600080fd5b50610af76004803603810190610af29190613baf565b61207c565b005b348015610b0557600080fd5b50610b206004803603810190610b1b9190613991565b612097565b005b348015610b2e57600080fd5b50610b3761211a565b604051610b449190613576565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c1857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610c285750610c2782612124565b5b9050919050565b610c3761218e565b80601560016101000a81548160ff02191690831515021790555050565b6000601254905090565b610c68338261151c565b610ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9e90613ef0565b60405180910390fd5b601560019054906101000a900460ff1615610cf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cee90613f5c565b60405180910390fd5b60008211610d3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3190613fc8565b60405180910390fd5b600f5482610d466111ee565b610d509190614017565b1115610d91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d88906140bd565b60405180910390fd5b601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610e1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1590614129565b60405180910390fd5b601254601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483610e6c9190614017565b1115610ead576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea4906141bb565b60405180910390fd5b81601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610efc9190614017565b92505081905550601254601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410610fa4576001601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b610fc0338360405180602001604052806000815250600161220c565b5050565b606060038054610fd39061420a565b80601f0160208091040260200160405190810160405280929190818152602001828054610fff9061420a565b801561104c5780601f106110215761010080835404028352916020019161104c565b820191906000526020600020905b81548152906001019060200180831161102f57829003601f168201915b5050505050905090565b600061106182612686565b611097576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006110dd826115c2565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611144576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166111636126d4565b73ffffffffffffffffffffffffffffffffffffffff161415801561119557506111938161118e6126d4565b611d3b565b155b156111cc576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111d78383836126dc565b505050565b6111e461218e565b8060118190555050565b60006111f861278e565b6002546001540303905090565b611210838383612797565b505050565b6000601460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61126661218e565b600073d323edfe73a6a57de58b2a15eda830f9f43bea6973ffffffffffffffffffffffffffffffffffffffff1660646005476112a2919061423b565b6112ac91906142ac565b6040516112b89061430e565b60006040518083038185875af1925050503d80600081146112f5576040519150601f19603f3d011682016040523d82523d6000602084013e6112fa565b606091505b505090508061130857600080fd5b60006113126117c2565b73ffffffffffffffffffffffffffffffffffffffff16476040516113359061430e565b60006040518083038185875af1925050503d8060008114611372576040519150601f19603f3d011682016040523d82523d6000602084013e611377565b606091505b505090508061138557600080fd5b5050565b60606000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561141357602002820191906000526020600020905b8154815260200190600101908083116113ff575b50505050509050919050565b606061142a83612686565b611460576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061146a612c4b565b9050600081510361148a57604051806020016040528060008152506114b7565b8061149485612cdd565b846040516020016114a79392919061435f565b6040516020818303038152906040525b91505092915050565b6114db83838360405180602001604052806000815250611a62565b505050565b6000600f54905090565b6000601560009054906101000a900460ff16905090565b61150961218e565b80600c9081611518919061453c565b5050565b600061154e82846040516020016115339190614656565b60405160208183030381529060405280519060200120611ade565b156115b757601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156115ae57600090506115bc565b600190506115bc565b600090505b92915050565b60006115cd82612e3d565b600001519050919050565b6115e061218e565b80601560006101000a81548160ff02191690831515021790555050565b61160561218e565b80600e8190555050565b61161761218e565b80600f8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611688576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6116f861218e565b61170260006130cc565b565b61170c61218e565b6001601c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b61176f61218e565b8060108190555050565b6000601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546117fb9061420a565b80601f01602080910402602001604051908101604052809291908181526020018280546118279061420a565b80156118745780601f1061184957610100808354040283529160200191611874565b820191906000526020600020905b81548152906001019060200180831161185757829003601f168201915b5050505050905090565b6000602052816000526040600020818154811061189a57600080fd5b90600052602060002001600091509150505481565b6118b76126d4565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361191b576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600860006119286126d4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166119d56126d4565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a1a91906134e9565b60405180910390a35050565b611a2e61218e565b6001601560026101000a81548160ff021916908315150217905550565b6000601560019054906101000a900460ff16905090565b611a6d848484612797565b611a8c8373ffffffffffffffffffffffffffffffffffffffff16613192565b8015611aa15750611a9f848484846131b5565b155b15611ad8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6000611aed83601a5484613305565b905092915050565b611afd61218e565b80600b9081611b0c919061453c565b5050565b6060611b1b82612686565b611b5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b51906146e3565b60405180910390fd5b60001515601560029054906101000a900460ff16151503611c075760168054611b829061420a565b80601f0160208091040260200160405190810160405280929190818152602001828054611bae9061420a565b8015611bfb5780601f10611bd057610100808354040283529160200191611bfb565b820191906000526020600020905b815481529060010190602001808311611bde57829003601f168201915b50505050509050611c63565b6000611c11612c4b565b90506000815111611c315760405180602001604052806000815250611c5f565b80611c3b84612cdd565b600d604051602001611c4f93929190614786565b6040516020818303038152906040525b9150505b919050565b611c7061218e565b8060128190555050565b6000600e54905090565b6000601054905090565b611c9661218e565b80600d9081611ca5919061453c565b5050565b6060600b8054611cb89061420a565b80601f0160208091040260200160405190810160405280929190818152602001828054611ce49061420a565b8015611d315780601f10611d0657610100808354040283529160200191611d31565b820191906000526020600020905b815481529060010190602001808311611d1457829003601f168201915b5050505050905090565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601a5481565b601560019054906101000a900460ff1615611e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1c90613f5c565b60405180910390fd5b60008111611e68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5f90613fc8565b60405180910390fd5b600f5481611e746111ee565b611e7e9190614017565b1115611ebf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb6906140bd565b60405180910390fd5b601154601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482611f0d9190614017565b1115611f4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f459061484f565b60405180910390fd5b80600e54611f5c919061423b565b341015611f9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f95906148e1565b60405180910390fd5b80601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fed9190614017565b92505081905550612010338260405180602001604052806000815250600161220c565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015612078573d6000803e3d6000fd5b5050565b61208461218e565b8060169081612093919061453c565b5050565b61209f61218e565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361210e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210590614973565b60405180910390fd5b612117816130cc565b50565b6000601154905090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6121966126d4565b73ffffffffffffffffffffffffffffffffffffffff166121b46117c2565b73ffffffffffffffffffffffffffffffffffffffff161461220a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612201906149df565b60405180910390fd5b565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612279576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084036122b3576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6122c0600086838761331c565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061230a91906133b4565b83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156124d457506124d38773ffffffffffffffffffffffffffffffffffffffff16613192565b5b15612599575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461254960008884806001019550886131b5565b61257f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082036124da57826001541461259457600080fd5b612669565b5b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020829080600181540180825580915050600190039060005260206000200160009091909190915055818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480820361259a575b81600181905550505061267f6000868387613322565b5050505050565b60008161269161278e565b111580156126a0575060015482105b80156126cd575060056000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b60006127a282612e3d565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461280d576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661282e6126d4565b73ffffffffffffffffffffffffffffffffffffffff16148061285d575061285c856128576126d4565b611d3b565b5b806128a2575061286b6126d4565b73ffffffffffffffffffffffffffffffffffffffff1661288a84611056565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806128db576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612941576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61294e858585600161331c565b61295a600084876126dc565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612bd9576001548214612bd857878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c448585856001613322565b5050505050565b6060600c8054612c5a9061420a565b80601f0160208091040260200160405190810160405280929190818152602001828054612c869061420a565b8015612cd35780601f10612ca857610100808354040283529160200191612cd3565b820191906000526020600020905b815481529060010190602001808311612cb657829003601f168201915b5050505050905090565b606060008203612d24576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612e38565b600082905060005b60008214612d56578080612d3f906149ff565b915050600a82612d4f91906142ac565b9150612d2c565b60008167ffffffffffffffff811115612d7257612d716135d3565b5b6040519080825280601f01601f191660200182016040528015612da45781602001600182028036833780820191505090505b5090505b60008514612e3157600182612dbd9190614a47565b9150600a85612dcc9190614a7b565b6030612dd89190614017565b60f81b818381518110612dee57612ded614aac565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612e2a91906142ac565b9450612da8565b8093505050505b919050565b612e456133d5565b600082905080612e5361278e565b11158015612e62575060015481105b15613095576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161309357600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612f775780925050506130c7565b5b60011561309257818060019003925050600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461308d5780925050506130c7565b612f78565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026131db6126d4565b8786866040518563ffffffff1660e01b81526004016131fd9493929190614b30565b6020604051808303816000875af192505050801561323957506040513d601f19601f820116820180604052508101906132369190614b91565b60015b6132b2573d8060008114613269576040519150601f19603f3d011682016040523d82523d6000602084013e61326e565b606091505b5060008151036132aa576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6000826133128584613328565b1490509392505050565b50505050565b50505050565b60008082905060005b845181101561339257600085828151811061334f5761334e614aac565b5b602002602001015190508083116133715761336a838261339d565b925061337e565b61337b818461339d565b92505b50808061338a906149ff565b915050613331565b508091505092915050565b600082600052816020526040600020905092915050565b50805460008255906000526020600020908101906133d29190613418565b50565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115613431576000816000905550600101613419565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61347e81613449565b811461348957600080fd5b50565b60008135905061349b81613475565b92915050565b6000602082840312156134b7576134b661343f565b5b60006134c58482850161348c565b91505092915050565b60008115159050919050565b6134e3816134ce565b82525050565b60006020820190506134fe60008301846134da565b92915050565b61350d816134ce565b811461351857600080fd5b50565b60008135905061352a81613504565b92915050565b6000602082840312156135465761354561343f565b5b60006135548482850161351b565b91505092915050565b6000819050919050565b6135708161355d565b82525050565b600060208201905061358b6000830184613567565b92915050565b61359a8161355d565b81146135a557600080fd5b50565b6000813590506135b781613591565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61360b826135c2565b810181811067ffffffffffffffff8211171561362a576136296135d3565b5b80604052505050565b600061363d613435565b90506136498282613602565b919050565b600067ffffffffffffffff821115613669576136686135d3565b5b602082029050602081019050919050565b600080fd5b6000819050919050565b6136928161367f565b811461369d57600080fd5b50565b6000813590506136af81613689565b92915050565b60006136c86136c38461364e565b613633565b905080838252602082019050602084028301858111156136eb576136ea61367a565b5b835b81811015613714578061370088826136a0565b8452602084019350506020810190506136ed565b5050509392505050565b600082601f830112613733576137326135bd565b5b81356137438482602086016136b5565b91505092915050565b600080604083850312156137635761376261343f565b5b6000613771858286016135a8565b925050602083013567ffffffffffffffff81111561379257613791613444565b5b61379e8582860161371e565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b838110156137e25780820151818401526020810190506137c7565b60008484015250505050565b60006137f9826137a8565b61380381856137b3565b93506138138185602086016137c4565b61381c816135c2565b840191505092915050565b6000602082019050818103600083015261384181846137ee565b905092915050565b60006020828403121561385f5761385e61343f565b5b600061386d848285016135a8565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006138a182613876565b9050919050565b6138b181613896565b82525050565b60006020820190506138cc60008301846138a8565b92915050565b6138db81613896565b81146138e657600080fd5b50565b6000813590506138f8816138d2565b92915050565b600080604083850312156139155761391461343f565b5b6000613923858286016138e9565b9250506020613934858286016135a8565b9150509250929050565b6000806000606084860312156139575761395661343f565b5b6000613965868287016138e9565b9350506020613976868287016138e9565b9250506040613987868287016135a8565b9150509250925092565b6000602082840312156139a7576139a661343f565b5b60006139b5848285016138e9565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6139f38161355d565b82525050565b6000613a0583836139ea565b60208301905092915050565b6000602082019050919050565b6000613a29826139be565b613a3381856139c9565b9350613a3e836139da565b8060005b83811015613a6f578151613a5688826139f9565b9750613a6183613a11565b925050600181019050613a42565b5085935050505092915050565b60006020820190508181036000830152613a968184613a1e565b905092915050565b600080fd5b600067ffffffffffffffff821115613abe57613abd6135d3565b5b613ac7826135c2565b9050602081019050919050565b82818337600083830152505050565b6000613af6613af184613aa3565b613633565b905082815260208101848484011115613b1257613b11613a9e565b5b613b1d848285613ad4565b509392505050565b600082601f830112613b3a57613b396135bd565b5b8135613b4a848260208601613ae3565b91505092915050565b60008060408385031215613b6a57613b6961343f565b5b6000613b78858286016135a8565b925050602083013567ffffffffffffffff811115613b9957613b98613444565b5b613ba585828601613b25565b9150509250929050565b600060208284031215613bc557613bc461343f565b5b600082013567ffffffffffffffff811115613be357613be2613444565b5b613bef84828501613b25565b91505092915050565b60008060408385031215613c0f57613c0e61343f565b5b6000613c1d858286016138e9565b925050602083013567ffffffffffffffff811115613c3e57613c3d613444565b5b613c4a8582860161371e565b9150509250929050565b60008060408385031215613c6b57613c6a61343f565b5b6000613c79858286016138e9565b9250506020613c8a8582860161351b565b9150509250929050565b600067ffffffffffffffff821115613caf57613cae6135d3565b5b613cb8826135c2565b9050602081019050919050565b6000613cd8613cd384613c94565b613633565b905082815260208101848484011115613cf457613cf3613a9e565b5b613cff848285613ad4565b509392505050565b600082601f830112613d1c57613d1b6135bd565b5b8135613d2c848260208601613cc5565b91505092915050565b60008060008060808587031215613d4f57613d4e61343f565b5b6000613d5d878288016138e9565b9450506020613d6e878288016138e9565b9350506040613d7f878288016135a8565b925050606085013567ffffffffffffffff811115613da057613d9f613444565b5b613dac87828801613d07565b91505092959194509250565b60008060408385031215613dcf57613dce61343f565b5b600083013567ffffffffffffffff811115613ded57613dec613444565b5b613df98582860161371e565b9250506020613e0a858286016136a0565b9150509250929050565b60008060408385031215613e2b57613e2a61343f565b5b6000613e39858286016138e9565b9250506020613e4a858286016138e9565b9150509250929050565b613e5d8161367f565b82525050565b6000602082019050613e786000830184613e54565b92915050565b7f4120636172746569726120646576652070657274656e6365722061207768697460008201527f656c697374000000000000000000000000000000000000000000000000000000602082015250565b6000613eda6025836137b3565b9150613ee582613e7e565b604082019050919050565b60006020820190508181036000830152613f0981613ecd565b9050919050565b7f4f20636f6e747261746f2065737461207061757361646f2e0000000000000000600082015250565b6000613f466018836137b3565b9150613f5182613f10565b602082019050919050565b60006020820190508181036000830152613f7581613f39565b9050919050565b7f50726563697361206d696e7461722070656c6f206d656e6f732031204e46542e600082015250565b6000613fb26020836137b3565b9150613fbd82613f7c565b602082019050919050565b60006020820190508181036000830152613fe181613fa5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006140228261355d565b915061402d8361355d565b925082820190508082111561404557614044613fe8565b5b92915050565b7f5175616e746964616465206c696d697465206465206d696e742065786365646960008201527f64612e0000000000000000000000000000000000000000000000000000000000602082015250565b60006140a76023836137b3565b91506140b28261404b565b604082019050919050565b600060208201905081810360008301526140d68161409a565b9050919050565b7f41646472657373206a612072656976696e64696361646f000000000000000000600082015250565b60006141136017836137b3565b915061411e826140dd565b602082019050919050565b6000602082019050818103600083015261414281614106565b9050919050565b7f5175616e746964616465206c696d697465206465206d696e742066726565207060008201527f6f722063617274656972612065786365646964612e0000000000000000000000602082015250565b60006141a56035836137b3565b91506141b082614149565b604082019050919050565b600060208201905081810360008301526141d481614198565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061422257607f821691505b602082108103614235576142346141db565b5b50919050565b60006142468261355d565b91506142518361355d565b925082820261425f8161355d565b9150828204841483151761427657614275613fe8565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006142b78261355d565b91506142c28361355d565b9250826142d2576142d161427d565b5b828204905092915050565b600081905092915050565b50565b60006142f86000836142dd565b9150614303826142e8565b600082019050919050565b6000614319826142eb565b9150819050919050565b600081905092915050565b6000614339826137a8565b6143438185614323565b93506143538185602086016137c4565b80840191505092915050565b600061436b828661432e565b9150614377828561432e565b9150614383828461432e565b9150819050949350505050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026143f27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826143b5565b6143fc86836143b5565b95508019841693508086168417925050509392505050565b6000819050919050565b600061443961443461442f8461355d565b614414565b61355d565b9050919050565b6000819050919050565b6144538361441e565b61446761445f82614440565b8484546143c2565b825550505050565b600090565b61447c61446f565b61448781848461444a565b505050565b5b818110156144ab576144a0600082614474565b60018101905061448d565b5050565b601f8211156144f0576144c181614390565b6144ca846143a5565b810160208510156144d9578190505b6144ed6144e5856143a5565b83018261448c565b50505b505050565b600082821c905092915050565b6000614513600019846008026144f5565b1980831691505092915050565b600061452c8383614502565b9150826002028217905092915050565b614545826137a8565b67ffffffffffffffff81111561455e5761455d6135d3565b5b614568825461420a565b6145738282856144af565b600060209050601f8311600181146145a65760008415614594578287015190505b61459e8582614520565b865550614606565b601f1984166145b486614390565b60005b828110156145dc578489015182556001820191506020850194506020810190506145b7565b868310156145f957848901516145f5601f891682614502565b8355505b6001600288020188555050505b505050505050565b60008160601b9050919050565b60006146268261460e565b9050919050565b60006146388261461b565b9050919050565b61465061464b82613896565b61462d565b82525050565b6000614662828461463f565b60148201915081905092915050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006146cd602f836137b3565b91506146d882614671565b604082019050919050565b600060208201905081810360008301526146fc816146c0565b9050919050565b600081546147108161420a565b61471a8186614323565b94506001821660008114614735576001811461474a5761477d565b60ff198316865281151582028601935061477d565b61475385614390565b60005b8381101561477557815481890152600182019150602081019050614756565b838801955050505b50505092915050565b6000614792828661432e565b915061479e828561432e565b91506147aa8284614703565b9150819050949350505050565b7f45737461206361727465697261206d696e746f752061207175616e746964616460008201527f65206c696d69746520646520746f6b656e73207075626c69636f73207065726d60208201527f697469646f7320706f722063617274656972612e000000000000000000000000604082015250565b60006148396054836137b3565b9150614844826147b7565b606082019050919050565b600060208201905081810360008301526148688161482c565b9050919050565b7f56616c6f72206461206d696e746167656d206469666572656e746520646f207660008201527f616c6f7220646566696e69646f206e6f20636f6e747261746f21000000000000602082015250565b60006148cb603a836137b3565b91506148d68261486f565b604082019050919050565b600060208201905081810360008301526148fa816148be565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061495d6026836137b3565b915061496882614901565b604082019050919050565b6000602082019050818103600083015261498c81614950565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006149c96020836137b3565b91506149d482614993565b602082019050919050565b600060208201905081810360008301526149f8816149bc565b9050919050565b6000614a0a8261355d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614a3c57614a3b613fe8565b5b600182019050919050565b6000614a528261355d565b9150614a5d8361355d565b9250828203905081811115614a7557614a74613fe8565b5b92915050565b6000614a868261355d565b9150614a918361355d565b925082614aa157614aa061427d565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000614b0282614adb565b614b0c8185614ae6565b9350614b1c8185602086016137c4565b614b25816135c2565b840191505092915050565b6000608082019050614b4560008301876138a8565b614b5260208301866138a8565b614b5f6040830185613567565b8181036060830152614b718184614af7565b905095945050505050565b600081519050614b8b81613475565b92915050565b600060208284031215614ba757614ba661343f565b5b6000614bb584828501614b7c565b9150509291505056fea26469706673582212209cd9fad8cd7b6aa6a528ce4e5efa4b55f6fff3e135e0ce3f50eea9d98c045cc464736f6c63430008110033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000004468747470733a2f2f697066732e696f2f697066732f516d554d43744a6e53374e39566d4d5770344e584e535166654e3352696465693669466f645141756a57314167362f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004368747470733a2f2f697066732e696f2f697066732f516d5a52625157486f6b4d584272434234446f68626145654a4a69596d694638336973436b5633587548766870420000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004368747470733a2f2f697066732e696f2f697066732f516d5a52625157486f6b4d584272434234446f68626145654a4a69596d694638336973436b5633587548766870420000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102ae5760003560e01c8063715018a611610175578063be00f04f116100dc578063e8a3d48511610095578063efd0cbf91161006f578063efd0cbf914610ab4578063f2c4ce1e14610ad0578063f2fde38b14610af9578063fba8bb4d14610b22576102ae565b8063e8a3d48514610a21578063e985e9c514610a4c578063ebf0c71714610a89576102ae565b8063be00f04f14610913578063c87b56dd1461093c578063cccddc4514610979578063d03be3ec146109a2578063d6e7b8e4146109cd578063da3ef23f146109f8576102ae565b8063a1d8bd7e1161012e578063a1d8bd7e14610805578063a22cb46514610842578063a475b5dd1461086b578063b187bd2614610882578063b88d4fde146108ad578063b8a20ed0146108d6576102ae565b8063715018a6146107095780637d7bf8fe146107205780637f00c7a61461074957806385c59582146107725780638da5cb5b146107af57806395d89b41146107da576102ae565b80634146ba8d116102195780635a23dd99116101d25780635a23dd99146105d75780636352211e146106145780636789c468146106515780636e17f7971461067a5780636f8b44b0146106a357806370a08231146106cc576102ae565b80634146ba8d146104b557806341dcf454146104f257806342842e0e1461052f5780634c0f38c214610558578063542ee3471461058357806355f804b3146105ae576102ae565b8063095ea7b31161026b578063095ea7b3146103c857806313a7971e146103f157806318160ddd1461041a57806323b872dd14610445578063314e21aa1461046e5780633ccfd60b146104ab576102ae565b806301ffc9a7146102b357806302329a29146102f057806304b2515214610319578063061431a81461034457806306fdde0314610360578063081812fc1461038b575b600080fd5b3480156102bf57600080fd5b506102da60048036038101906102d591906134a1565b610b4d565b6040516102e791906134e9565b60405180910390f35b3480156102fc57600080fd5b5061031760048036038101906103129190613530565b610c2f565b005b34801561032557600080fd5b5061032e610c54565b60405161033b9190613576565b60405180910390f35b61035e6004803603810190610359919061374c565b610c5e565b005b34801561036c57600080fd5b50610375610fc4565b6040516103829190613827565b60405180910390f35b34801561039757600080fd5b506103b260048036038101906103ad9190613849565b611056565b6040516103bf91906138b7565b60405180910390f35b3480156103d457600080fd5b506103ef60048036038101906103ea91906138fe565b6110d2565b005b3480156103fd57600080fd5b5061041860048036038101906104139190613849565b6111dc565b005b34801561042657600080fd5b5061042f6111ee565b60405161043c9190613576565b60405180910390f35b34801561045157600080fd5b5061046c6004803603810190610467919061393e565b611205565b005b34801561047a57600080fd5b5061049560048036038101906104909190613991565b611215565b6040516104a29190613576565b60405180910390f35b6104b361125e565b005b3480156104c157600080fd5b506104dc60048036038101906104d79190613991565b611389565b6040516104e99190613a7c565b60405180910390f35b3480156104fe57600080fd5b5061051960048036038101906105149190613b53565b61141f565b6040516105269190613827565b60405180910390f35b34801561053b57600080fd5b506105566004803603810190610551919061393e565b6114c0565b005b34801561056457600080fd5b5061056d6114e0565b60405161057a9190613576565b60405180910390f35b34801561058f57600080fd5b506105986114ea565b6040516105a591906134e9565b60405180910390f35b3480156105ba57600080fd5b506105d560048036038101906105d09190613baf565b611501565b005b3480156105e357600080fd5b506105fe60048036038101906105f99190613bf8565b61151c565b60405161060b91906134e9565b60405180910390f35b34801561062057600080fd5b5061063b60048036038101906106369190613849565b6115c2565b60405161064891906138b7565b60405180910390f35b34801561065d57600080fd5b5061067860048036038101906106739190613530565b6115d8565b005b34801561068657600080fd5b506106a1600480360381019061069c9190613849565b6115fd565b005b3480156106af57600080fd5b506106ca60048036038101906106c59190613849565b61160f565b005b3480156106d857600080fd5b506106f360048036038101906106ee9190613991565b611621565b6040516107009190613576565b60405180910390f35b34801561071557600080fd5b5061071e6116f0565b005b34801561072c57600080fd5b5061074760048036038101906107429190613991565b611704565b005b34801561075557600080fd5b50610770600480360381019061076b9190613849565b611767565b005b34801561077e57600080fd5b5061079960048036038101906107949190613991565b611779565b6040516107a69190613576565b60405180910390f35b3480156107bb57600080fd5b506107c46117c2565b6040516107d191906138b7565b60405180910390f35b3480156107e657600080fd5b506107ef6117ec565b6040516107fc9190613827565b60405180910390f35b34801561081157600080fd5b5061082c600480360381019061082791906138fe565b61187e565b6040516108399190613576565b60405180910390f35b34801561084e57600080fd5b5061086960048036038101906108649190613c54565b6118af565b005b34801561087757600080fd5b50610880611a26565b005b34801561088e57600080fd5b50610897611a4b565b6040516108a491906134e9565b60405180910390f35b3480156108b957600080fd5b506108d460048036038101906108cf9190613d35565b611a62565b005b3480156108e257600080fd5b506108fd60048036038101906108f89190613db8565b611ade565b60405161090a91906134e9565b60405180910390f35b34801561091f57600080fd5b5061093a60048036038101906109359190613baf565b611af5565b005b34801561094857600080fd5b50610963600480360381019061095e9190613849565b611b10565b6040516109709190613827565b60405180910390f35b34801561098557600080fd5b506109a0600480360381019061099b9190613849565b611c68565b005b3480156109ae57600080fd5b506109b7611c7a565b6040516109c49190613576565b60405180910390f35b3480156109d957600080fd5b506109e2611c84565b6040516109ef9190613576565b60405180910390f35b348015610a0457600080fd5b50610a1f6004803603810190610a1a9190613baf565b611c8e565b005b348015610a2d57600080fd5b50610a36611ca9565b604051610a439190613827565b60405180910390f35b348015610a5857600080fd5b50610a736004803603810190610a6e9190613e14565b611d3b565b604051610a8091906134e9565b60405180910390f35b348015610a9557600080fd5b50610a9e611dcf565b604051610aab9190613e63565b60405180910390f35b610ace6004803603810190610ac99190613849565b611dd5565b005b348015610adc57600080fd5b50610af76004803603810190610af29190613baf565b61207c565b005b348015610b0557600080fd5b50610b206004803603810190610b1b9190613991565b612097565b005b348015610b2e57600080fd5b50610b3761211a565b604051610b449190613576565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c1857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610c285750610c2782612124565b5b9050919050565b610c3761218e565b80601560016101000a81548160ff02191690831515021790555050565b6000601254905090565b610c68338261151c565b610ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9e90613ef0565b60405180910390fd5b601560019054906101000a900460ff1615610cf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cee90613f5c565b60405180910390fd5b60008211610d3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3190613fc8565b60405180910390fd5b600f5482610d466111ee565b610d509190614017565b1115610d91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d88906140bd565b60405180910390fd5b601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610e1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1590614129565b60405180910390fd5b601254601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483610e6c9190614017565b1115610ead576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea4906141bb565b60405180910390fd5b81601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610efc9190614017565b92505081905550601254601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410610fa4576001601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b610fc0338360405180602001604052806000815250600161220c565b5050565b606060038054610fd39061420a565b80601f0160208091040260200160405190810160405280929190818152602001828054610fff9061420a565b801561104c5780601f106110215761010080835404028352916020019161104c565b820191906000526020600020905b81548152906001019060200180831161102f57829003601f168201915b5050505050905090565b600061106182612686565b611097576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006110dd826115c2565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611144576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166111636126d4565b73ffffffffffffffffffffffffffffffffffffffff161415801561119557506111938161118e6126d4565b611d3b565b155b156111cc576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111d78383836126dc565b505050565b6111e461218e565b8060118190555050565b60006111f861278e565b6002546001540303905090565b611210838383612797565b505050565b6000601460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61126661218e565b600073d323edfe73a6a57de58b2a15eda830f9f43bea6973ffffffffffffffffffffffffffffffffffffffff1660646005476112a2919061423b565b6112ac91906142ac565b6040516112b89061430e565b60006040518083038185875af1925050503d80600081146112f5576040519150601f19603f3d011682016040523d82523d6000602084013e6112fa565b606091505b505090508061130857600080fd5b60006113126117c2565b73ffffffffffffffffffffffffffffffffffffffff16476040516113359061430e565b60006040518083038185875af1925050503d8060008114611372576040519150601f19603f3d011682016040523d82523d6000602084013e611377565b606091505b505090508061138557600080fd5b5050565b60606000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561141357602002820191906000526020600020905b8154815260200190600101908083116113ff575b50505050509050919050565b606061142a83612686565b611460576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061146a612c4b565b9050600081510361148a57604051806020016040528060008152506114b7565b8061149485612cdd565b846040516020016114a79392919061435f565b6040516020818303038152906040525b91505092915050565b6114db83838360405180602001604052806000815250611a62565b505050565b6000600f54905090565b6000601560009054906101000a900460ff16905090565b61150961218e565b80600c9081611518919061453c565b5050565b600061154e82846040516020016115339190614656565b60405160208183030381529060405280519060200120611ade565b156115b757601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156115ae57600090506115bc565b600190506115bc565b600090505b92915050565b60006115cd82612e3d565b600001519050919050565b6115e061218e565b80601560006101000a81548160ff02191690831515021790555050565b61160561218e565b80600e8190555050565b61161761218e565b80600f8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611688576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6116f861218e565b61170260006130cc565b565b61170c61218e565b6001601c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b61176f61218e565b8060108190555050565b6000601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546117fb9061420a565b80601f01602080910402602001604051908101604052809291908181526020018280546118279061420a565b80156118745780601f1061184957610100808354040283529160200191611874565b820191906000526020600020905b81548152906001019060200180831161185757829003601f168201915b5050505050905090565b6000602052816000526040600020818154811061189a57600080fd5b90600052602060002001600091509150505481565b6118b76126d4565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361191b576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600860006119286126d4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166119d56126d4565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a1a91906134e9565b60405180910390a35050565b611a2e61218e565b6001601560026101000a81548160ff021916908315150217905550565b6000601560019054906101000a900460ff16905090565b611a6d848484612797565b611a8c8373ffffffffffffffffffffffffffffffffffffffff16613192565b8015611aa15750611a9f848484846131b5565b155b15611ad8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6000611aed83601a5484613305565b905092915050565b611afd61218e565b80600b9081611b0c919061453c565b5050565b6060611b1b82612686565b611b5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b51906146e3565b60405180910390fd5b60001515601560029054906101000a900460ff16151503611c075760168054611b829061420a565b80601f0160208091040260200160405190810160405280929190818152602001828054611bae9061420a565b8015611bfb5780601f10611bd057610100808354040283529160200191611bfb565b820191906000526020600020905b815481529060010190602001808311611bde57829003601f168201915b50505050509050611c63565b6000611c11612c4b565b90506000815111611c315760405180602001604052806000815250611c5f565b80611c3b84612cdd565b600d604051602001611c4f93929190614786565b6040516020818303038152906040525b9150505b919050565b611c7061218e565b8060128190555050565b6000600e54905090565b6000601054905090565b611c9661218e565b80600d9081611ca5919061453c565b5050565b6060600b8054611cb89061420a565b80601f0160208091040260200160405190810160405280929190818152602001828054611ce49061420a565b8015611d315780601f10611d0657610100808354040283529160200191611d31565b820191906000526020600020905b815481529060010190602001808311611d1457829003601f168201915b5050505050905090565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601a5481565b601560019054906101000a900460ff1615611e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1c90613f5c565b60405180910390fd5b60008111611e68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5f90613fc8565b60405180910390fd5b600f5481611e746111ee565b611e7e9190614017565b1115611ebf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb6906140bd565b60405180910390fd5b601154601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482611f0d9190614017565b1115611f4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f459061484f565b60405180910390fd5b80600e54611f5c919061423b565b341015611f9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f95906148e1565b60405180910390fd5b80601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fed9190614017565b92505081905550612010338260405180602001604052806000815250600161220c565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015612078573d6000803e3d6000fd5b5050565b61208461218e565b8060169081612093919061453c565b5050565b61209f61218e565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361210e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210590614973565b60405180910390fd5b612117816130cc565b50565b6000601154905090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6121966126d4565b73ffffffffffffffffffffffffffffffffffffffff166121b46117c2565b73ffffffffffffffffffffffffffffffffffffffff161461220a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612201906149df565b60405180910390fd5b565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612279576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084036122b3576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6122c0600086838761331c565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061230a91906133b4565b83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156124d457506124d38773ffffffffffffffffffffffffffffffffffffffff16613192565b5b15612599575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461254960008884806001019550886131b5565b61257f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082036124da57826001541461259457600080fd5b612669565b5b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020829080600181540180825580915050600190039060005260206000200160009091909190915055818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480820361259a575b81600181905550505061267f6000868387613322565b5050505050565b60008161269161278e565b111580156126a0575060015482105b80156126cd575060056000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b60006127a282612e3d565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461280d576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661282e6126d4565b73ffffffffffffffffffffffffffffffffffffffff16148061285d575061285c856128576126d4565b611d3b565b5b806128a2575061286b6126d4565b73ffffffffffffffffffffffffffffffffffffffff1661288a84611056565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806128db576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612941576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61294e858585600161331c565b61295a600084876126dc565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612bd9576001548214612bd857878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c448585856001613322565b5050505050565b6060600c8054612c5a9061420a565b80601f0160208091040260200160405190810160405280929190818152602001828054612c869061420a565b8015612cd35780601f10612ca857610100808354040283529160200191612cd3565b820191906000526020600020905b815481529060010190602001808311612cb657829003601f168201915b5050505050905090565b606060008203612d24576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612e38565b600082905060005b60008214612d56578080612d3f906149ff565b915050600a82612d4f91906142ac565b9150612d2c565b60008167ffffffffffffffff811115612d7257612d716135d3565b5b6040519080825280601f01601f191660200182016040528015612da45781602001600182028036833780820191505090505b5090505b60008514612e3157600182612dbd9190614a47565b9150600a85612dcc9190614a7b565b6030612dd89190614017565b60f81b818381518110612dee57612ded614aac565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612e2a91906142ac565b9450612da8565b8093505050505b919050565b612e456133d5565b600082905080612e5361278e565b11158015612e62575060015481105b15613095576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161309357600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612f775780925050506130c7565b5b60011561309257818060019003925050600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461308d5780925050506130c7565b612f78565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026131db6126d4565b8786866040518563ffffffff1660e01b81526004016131fd9493929190614b30565b6020604051808303816000875af192505050801561323957506040513d601f19601f820116820180604052508101906132369190614b91565b60015b6132b2573d8060008114613269576040519150601f19603f3d011682016040523d82523d6000602084013e61326e565b606091505b5060008151036132aa576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6000826133128584613328565b1490509392505050565b50505050565b50505050565b60008082905060005b845181101561339257600085828151811061334f5761334e614aac565b5b602002602001015190508083116133715761336a838261339d565b925061337e565b61337b818461339d565b92505b50808061338a906149ff565b915050613331565b508091505092915050565b600082600052816020526040600020905092915050565b50805460008255906000526020600020908101906133d29190613418565b50565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115613431576000816000905550600101613419565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61347e81613449565b811461348957600080fd5b50565b60008135905061349b81613475565b92915050565b6000602082840312156134b7576134b661343f565b5b60006134c58482850161348c565b91505092915050565b60008115159050919050565b6134e3816134ce565b82525050565b60006020820190506134fe60008301846134da565b92915050565b61350d816134ce565b811461351857600080fd5b50565b60008135905061352a81613504565b92915050565b6000602082840312156135465761354561343f565b5b60006135548482850161351b565b91505092915050565b6000819050919050565b6135708161355d565b82525050565b600060208201905061358b6000830184613567565b92915050565b61359a8161355d565b81146135a557600080fd5b50565b6000813590506135b781613591565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61360b826135c2565b810181811067ffffffffffffffff8211171561362a576136296135d3565b5b80604052505050565b600061363d613435565b90506136498282613602565b919050565b600067ffffffffffffffff821115613669576136686135d3565b5b602082029050602081019050919050565b600080fd5b6000819050919050565b6136928161367f565b811461369d57600080fd5b50565b6000813590506136af81613689565b92915050565b60006136c86136c38461364e565b613633565b905080838252602082019050602084028301858111156136eb576136ea61367a565b5b835b81811015613714578061370088826136a0565b8452602084019350506020810190506136ed565b5050509392505050565b600082601f830112613733576137326135bd565b5b81356137438482602086016136b5565b91505092915050565b600080604083850312156137635761376261343f565b5b6000613771858286016135a8565b925050602083013567ffffffffffffffff81111561379257613791613444565b5b61379e8582860161371e565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b838110156137e25780820151818401526020810190506137c7565b60008484015250505050565b60006137f9826137a8565b61380381856137b3565b93506138138185602086016137c4565b61381c816135c2565b840191505092915050565b6000602082019050818103600083015261384181846137ee565b905092915050565b60006020828403121561385f5761385e61343f565b5b600061386d848285016135a8565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006138a182613876565b9050919050565b6138b181613896565b82525050565b60006020820190506138cc60008301846138a8565b92915050565b6138db81613896565b81146138e657600080fd5b50565b6000813590506138f8816138d2565b92915050565b600080604083850312156139155761391461343f565b5b6000613923858286016138e9565b9250506020613934858286016135a8565b9150509250929050565b6000806000606084860312156139575761395661343f565b5b6000613965868287016138e9565b9350506020613976868287016138e9565b9250506040613987868287016135a8565b9150509250925092565b6000602082840312156139a7576139a661343f565b5b60006139b5848285016138e9565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6139f38161355d565b82525050565b6000613a0583836139ea565b60208301905092915050565b6000602082019050919050565b6000613a29826139be565b613a3381856139c9565b9350613a3e836139da565b8060005b83811015613a6f578151613a5688826139f9565b9750613a6183613a11565b925050600181019050613a42565b5085935050505092915050565b60006020820190508181036000830152613a968184613a1e565b905092915050565b600080fd5b600067ffffffffffffffff821115613abe57613abd6135d3565b5b613ac7826135c2565b9050602081019050919050565b82818337600083830152505050565b6000613af6613af184613aa3565b613633565b905082815260208101848484011115613b1257613b11613a9e565b5b613b1d848285613ad4565b509392505050565b600082601f830112613b3a57613b396135bd565b5b8135613b4a848260208601613ae3565b91505092915050565b60008060408385031215613b6a57613b6961343f565b5b6000613b78858286016135a8565b925050602083013567ffffffffffffffff811115613b9957613b98613444565b5b613ba585828601613b25565b9150509250929050565b600060208284031215613bc557613bc461343f565b5b600082013567ffffffffffffffff811115613be357613be2613444565b5b613bef84828501613b25565b91505092915050565b60008060408385031215613c0f57613c0e61343f565b5b6000613c1d858286016138e9565b925050602083013567ffffffffffffffff811115613c3e57613c3d613444565b5b613c4a8582860161371e565b9150509250929050565b60008060408385031215613c6b57613c6a61343f565b5b6000613c79858286016138e9565b9250506020613c8a8582860161351b565b9150509250929050565b600067ffffffffffffffff821115613caf57613cae6135d3565b5b613cb8826135c2565b9050602081019050919050565b6000613cd8613cd384613c94565b613633565b905082815260208101848484011115613cf457613cf3613a9e565b5b613cff848285613ad4565b509392505050565b600082601f830112613d1c57613d1b6135bd565b5b8135613d2c848260208601613cc5565b91505092915050565b60008060008060808587031215613d4f57613d4e61343f565b5b6000613d5d878288016138e9565b9450506020613d6e878288016138e9565b9350506040613d7f878288016135a8565b925050606085013567ffffffffffffffff811115613da057613d9f613444565b5b613dac87828801613d07565b91505092959194509250565b60008060408385031215613dcf57613dce61343f565b5b600083013567ffffffffffffffff811115613ded57613dec613444565b5b613df98582860161371e565b9250506020613e0a858286016136a0565b9150509250929050565b60008060408385031215613e2b57613e2a61343f565b5b6000613e39858286016138e9565b9250506020613e4a858286016138e9565b9150509250929050565b613e5d8161367f565b82525050565b6000602082019050613e786000830184613e54565b92915050565b7f4120636172746569726120646576652070657274656e6365722061207768697460008201527f656c697374000000000000000000000000000000000000000000000000000000602082015250565b6000613eda6025836137b3565b9150613ee582613e7e565b604082019050919050565b60006020820190508181036000830152613f0981613ecd565b9050919050565b7f4f20636f6e747261746f2065737461207061757361646f2e0000000000000000600082015250565b6000613f466018836137b3565b9150613f5182613f10565b602082019050919050565b60006020820190508181036000830152613f7581613f39565b9050919050565b7f50726563697361206d696e7461722070656c6f206d656e6f732031204e46542e600082015250565b6000613fb26020836137b3565b9150613fbd82613f7c565b602082019050919050565b60006020820190508181036000830152613fe181613fa5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006140228261355d565b915061402d8361355d565b925082820190508082111561404557614044613fe8565b5b92915050565b7f5175616e746964616465206c696d697465206465206d696e742065786365646960008201527f64612e0000000000000000000000000000000000000000000000000000000000602082015250565b60006140a76023836137b3565b91506140b28261404b565b604082019050919050565b600060208201905081810360008301526140d68161409a565b9050919050565b7f41646472657373206a612072656976696e64696361646f000000000000000000600082015250565b60006141136017836137b3565b915061411e826140dd565b602082019050919050565b6000602082019050818103600083015261414281614106565b9050919050565b7f5175616e746964616465206c696d697465206465206d696e742066726565207060008201527f6f722063617274656972612065786365646964612e0000000000000000000000602082015250565b60006141a56035836137b3565b91506141b082614149565b604082019050919050565b600060208201905081810360008301526141d481614198565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061422257607f821691505b602082108103614235576142346141db565b5b50919050565b60006142468261355d565b91506142518361355d565b925082820261425f8161355d565b9150828204841483151761427657614275613fe8565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006142b78261355d565b91506142c28361355d565b9250826142d2576142d161427d565b5b828204905092915050565b600081905092915050565b50565b60006142f86000836142dd565b9150614303826142e8565b600082019050919050565b6000614319826142eb565b9150819050919050565b600081905092915050565b6000614339826137a8565b6143438185614323565b93506143538185602086016137c4565b80840191505092915050565b600061436b828661432e565b9150614377828561432e565b9150614383828461432e565b9150819050949350505050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026143f27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826143b5565b6143fc86836143b5565b95508019841693508086168417925050509392505050565b6000819050919050565b600061443961443461442f8461355d565b614414565b61355d565b9050919050565b6000819050919050565b6144538361441e565b61446761445f82614440565b8484546143c2565b825550505050565b600090565b61447c61446f565b61448781848461444a565b505050565b5b818110156144ab576144a0600082614474565b60018101905061448d565b5050565b601f8211156144f0576144c181614390565b6144ca846143a5565b810160208510156144d9578190505b6144ed6144e5856143a5565b83018261448c565b50505b505050565b600082821c905092915050565b6000614513600019846008026144f5565b1980831691505092915050565b600061452c8383614502565b9150826002028217905092915050565b614545826137a8565b67ffffffffffffffff81111561455e5761455d6135d3565b5b614568825461420a565b6145738282856144af565b600060209050601f8311600181146145a65760008415614594578287015190505b61459e8582614520565b865550614606565b601f1984166145b486614390565b60005b828110156145dc578489015182556001820191506020850194506020810190506145b7565b868310156145f957848901516145f5601f891682614502565b8355505b6001600288020188555050505b505050505050565b60008160601b9050919050565b60006146268261460e565b9050919050565b60006146388261461b565b9050919050565b61465061464b82613896565b61462d565b82525050565b6000614662828461463f565b60148201915081905092915050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006146cd602f836137b3565b91506146d882614671565b604082019050919050565b600060208201905081810360008301526146fc816146c0565b9050919050565b600081546147108161420a565b61471a8186614323565b94506001821660008114614735576001811461474a5761477d565b60ff198316865281151582028601935061477d565b61475385614390565b60005b8381101561477557815481890152600182019150602081019050614756565b838801955050505b50505092915050565b6000614792828661432e565b915061479e828561432e565b91506147aa8284614703565b9150819050949350505050565b7f45737461206361727465697261206d696e746f752061207175616e746964616460008201527f65206c696d69746520646520746f6b656e73207075626c69636f73207065726d60208201527f697469646f7320706f722063617274656972612e000000000000000000000000604082015250565b60006148396054836137b3565b9150614844826147b7565b606082019050919050565b600060208201905081810360008301526148688161482c565b9050919050565b7f56616c6f72206461206d696e746167656d206469666572656e746520646f207660008201527f616c6f7220646566696e69646f206e6f20636f6e747261746f21000000000000602082015250565b60006148cb603a836137b3565b91506148d68261486f565b604082019050919050565b600060208201905081810360008301526148fa816148be565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061495d6026836137b3565b915061496882614901565b604082019050919050565b6000602082019050818103600083015261498c81614950565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006149c96020836137b3565b91506149d482614993565b602082019050919050565b600060208201905081810360008301526149f8816149bc565b9050919050565b6000614a0a8261355d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614a3c57614a3b613fe8565b5b600182019050919050565b6000614a528261355d565b9150614a5d8361355d565b9250828203905081811115614a7557614a74613fe8565b5b92915050565b6000614a868261355d565b9150614a918361355d565b925082614aa157614aa061427d565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000614b0282614adb565b614b0c8185614ae6565b9350614b1c8185602086016137c4565b614b25816135c2565b840191505092915050565b6000608082019050614b4560008301876138a8565b614b5260208301866138a8565b614b5f6040830185613567565b8181036060830152614b718184614af7565b905095945050505050565b600081519050614b8b81613475565b92915050565b600060208284031215614ba757614ba661343f565b5b6000614bb584828501614b7c565b9150509291505056fea26469706673582212209cd9fad8cd7b6aa6a528ce4e5efa4b55f6fff3e135e0ce3f50eea9d98c045cc464736f6c63430008110033

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000004468747470733a2f2f697066732e696f2f697066732f516d554d43744a6e53374e39566d4d5770344e584e535166654e3352696465693669466f645141756a57314167362f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004368747470733a2f2f697066732e696f2f697066732f516d5a52625157486f6b4d584272434234446f68626145654a4a69596d694638336973436b5633587548766870420000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004368747470733a2f2f697066732e696f2f697066732f516d5a52625157486f6b4d584272434234446f68626145654a4a69596d694638336973436b5633587548766870420000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _initBaseURI (string): https://ipfs.io/ipfs/QmUMCtJnS7N9VmMWp4NXNSQfeN3Ridei6iFodQAujW1Ag6/
Arg [1] : _initNotRevealedUri (string): https://ipfs.io/ipfs/QmZRbQWHokMXBrCB4DohbaEeJJiYmiF83isCkV3XuHvhpB
Arg [2] : _contractURI (string): https://ipfs.io/ipfs/QmZRbQWHokMXBrCB4DohbaEeJJiYmiF83isCkV3XuHvhpB

-----Encoded View---------------
15 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000044
Arg [4] : 68747470733a2f2f697066732e696f2f697066732f516d554d43744a6e53374e
Arg [5] : 39566d4d5770344e584e535166654e3352696465693669466f645141756a5731
Arg [6] : 4167362f00000000000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000043
Arg [8] : 68747470733a2f2f697066732e696f2f697066732f516d5a52625157486f6b4d
Arg [9] : 584272434234446f68626145654a4a69596d694638336973436b563358754876
Arg [10] : 6870420000000000000000000000000000000000000000000000000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000043
Arg [12] : 68747470733a2f2f697066732e696f2f697066732f516d5a52625157486f6b4d
Arg [13] : 584272434234446f68626145654a4a69596d694638336973436b563358754876
Arg [14] : 6870420000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

49101:7955:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28413:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55751:73;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53675:132;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51892:869;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31526:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33046:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32609:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54657:175;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27662:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33911:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53953:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56131:922;;;:::i;:::-;;50563:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31852:353;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34152:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54085:81;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54172:76;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55519:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50851:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31334:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55830:82;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54418:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56030:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28782:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48194:103;;;;;;;;;;;;;:::i;:::-;;55918:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54535:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53813:134;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47546:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31686:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25297:63;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33322:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54347:65;;;;;;;;;;;;;:::i;:::-;;54254:71;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34408:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50704:141;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55389:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52867:479;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54838:191;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53352:90;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53448:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55623:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52767:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33680:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49945:88;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51152:734;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55263:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48452:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53545:124;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28413:305;28515:4;28567:25;28552:40;;;:11;:40;;;;:105;;;;28624:33;28609:48;;;:11;:48;;;;28552:105;:158;;;;28674:36;28698:11;28674:23;:36::i;:::-;28552:158;28532:178;;28413:305;;;:::o;55751:73::-;47432:13;:11;:13::i;:::-;55812:6:::1;55803;;:15;;;;;;;;;;;;;;;;;;55751:73:::0;:::o;53675:132::-;53744:7;53767:34;;53760:41;;53675:132;:::o;51892:869::-;51990:32;52004:10;52016:5;51990:13;:32::i;:::-;51982:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;52080:6;;;;;;;;;;;52079:7;52071:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;52144:1;52130:11;:15;52122:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;52228:9;;52213:11;52197:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;52189:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;52293:16;:28;52310:10;52293:28;;;;;;;;;;;;;;;;;;;;;;;;;52292:29;52284:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;52418:34;;52378:24;:36;52403:10;52378:36;;;;;;;;;;;;;;;;52364:11;:50;;;;:::i;:::-;:88;;52356:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;52559:11;52519:24;:36;52544:10;52519:36;;;;;;;;;;;;;;;;:51;;;;;;;:::i;:::-;;;;;;;;52622:34;;52582:24;:36;52607:10;52582:36;;;;;;;;;;;;;;;;:74;52579:130;;52697:4;52666:16;:28;52683:10;52666:28;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;52579:130;52715:40;52721:10;52733:11;52715:40;;;;;;;;;;;;52750:4;52715:5;:40::i;:::-;51892:869;;:::o;31526:91::-;31571:13;31604:5;31597:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31526:91;:::o;33046:204::-;33114:7;33139:16;33147:7;33139;:16::i;:::-;33134:64;;33164:34;;;;;;;;;;;;;;33134:64;33218:15;:24;33234:7;33218:24;;;;;;;;;;;;;;;;;;;;;33211:31;;33046:204;;;:::o;32609:371::-;32682:13;32698:24;32714:7;32698:15;:24::i;:::-;32682:40;;32743:5;32737:11;;:2;:11;;;32733:48;;32757:24;;;;;;;;;;;;;;32733:48;32814:5;32798:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;32824:37;32841:5;32848:12;:10;:12::i;:::-;32824:16;:37::i;:::-;32823:38;32798:63;32794:138;;;32885:35;;;;;;;;;;;;;;32794:138;32944:28;32953:2;32957:7;32966:5;32944:8;:28::i;:::-;32671:309;32609:371;;:::o;54657:175::-;47432:13;:11;:13::i;:::-;54796:30:::1;54763;:63;;;;54657:175:::0;:::o;27662:303::-;27706:7;27931:15;:13;:15::i;:::-;27916:12;;27900:13;;:28;:46;27893:53;;27662:303;:::o;33911:170::-;34045:28;34055:4;34061:2;34065:7;34045:9;:28::i;:::-;33911:170;;;:::o;53953:126::-;54022:7;54045:20;:28;54066:6;54045:28;;;;;;;;;;;;;;;;54038:35;;53953:126;;;:::o;56131:922::-;47432:13;:11;:13::i;:::-;56417:7:::1;56438:42;56430:56;;56522:3;56518:1;56494:21;:25;;;;:::i;:::-;:31;;;;:::i;:::-;56430:100;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56416:114;;;56545:2;56537:11;;;::::0;::::1;;56875:7;56896;:5;:7::i;:::-;56888:21;;56917;56888:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56874:69;;;56958:2;56950:11;;;::::0;::::1;;56176:877;;56131:922::o:0;50563:135::-;50626:16;50658:26;:34;50685:6;50658:34;;;;;;;;;;;;;;;50651:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50563:135;;;:::o;31852:353::-;31945:13;31976:16;31984:7;31976;:16::i;:::-;31971:59;;32001:29;;;;;;;;;;;;;;31971:59;32043:21;32067:10;:8;:10::i;:::-;32043:34;;32120:1;32101:7;32095:21;:26;:102;;;;;;;;;;;;;;;;;32148:7;32157:18;:7;:16;:18::i;:::-;32177:13;32131:60;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;32095:102;32088:109;;;31852:353;;;;:::o;34152:185::-;34290:39;34307:4;34313:2;34317:7;34290:39;;;;;;;;;;;;:16;:39::i;:::-;34152:185;;;:::o;54085:81::-;54129:7;54151:9;;54144:16;;54085:81;:::o;54172:76::-;54214:4;54233:9;;;;;;;;;;;54226:16;;54172:76;:::o;55519:98::-;47432:13;:11;:13::i;:::-;55600:11:::1;55590:7;:21;;;;;;:::i;:::-;;55519:98:::0;:::o;50851:295::-;50934:4;50951:54;50960:5;50995;50978:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;50967:36;;;;;;50951:7;:54::i;:::-;50947:194;;;51021:16;:23;51038:5;51021:23;;;;;;;;;;;;;;;;;;;;;;;;;51017:62;;;51064:5;51057:12;;;;51017:62;51094:4;51087:11;;;;50947:194;51128:5;51121:12;;50851:295;;;;;:::o;31334:125::-;31398:7;31425:21;31438:7;31425:12;:21::i;:::-;:26;;;31418:33;;31334:125;;;:::o;55830:82::-;47432:13;:11;:13::i;:::-;55900:6:::1;55888:9;;:18;;;;;;;;;;;;;;;;;;55830:82:::0;:::o;54418:111::-;47432:13;:11;:13::i;:::-;54509:14:::1;54492;:31;;;;54418:111:::0;:::o;56030:95::-;47432:13;:11;:13::i;:::-;56109:10:::1;56097:9;:22;;;;56030:95:::0;:::o;28782:206::-;28846:7;28887:1;28870:19;;:5;:19;;;28866:60;;28898:28;;;;;;;;;;;;;;28866:60;28952:12;:19;28965:5;28952:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;28944:36;;28937:43;;28782:206;;;:::o;48194:103::-;47432:13;:11;:13::i;:::-;48259:30:::1;48286:1;48259:18;:30::i;:::-;48194:103::o:0;55918:106::-;47432:13;:11;:13::i;:::-;56014:4:::1;55987:16;:24;56004:6;55987:24;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;55918:106:::0;:::o;54535:116::-;47432:13;:11;:13::i;:::-;54628:17:::1;54612:13;:33;;;;54535:116:::0;:::o;53813:134::-;53886:7;53909:24;:32;53934:6;53909:32;;;;;;;;;;;;;;;;53902:39;;53813:134;;;:::o;47546:87::-;47592:7;47619:6;;;;;;;;;;;47612:13;;47546:87;:::o;31686:95::-;31733:13;31766:7;31759:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31686:95;:::o;25297:63::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;33322:287::-;33433:12;:10;:12::i;:::-;33421:24;;:8;:24;;;33417:54;;33454:17;;;;;;;;;;;;;;33417:54;33529:8;33484:18;:32;33503:12;:10;:12::i;:::-;33484:32;;;;;;;;;;;;;;;:42;33517:8;33484:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;33582:8;33553:48;;33568:12;:10;:12::i;:::-;33553:48;;;33592:8;33553:48;;;;;;:::i;:::-;;;;;;;;33322:287;;:::o;54347:65::-;47432:13;:11;:13::i;:::-;54402:4:::1;54391:8;;:15;;;;;;;;;;;;;;;;;;54347:65::o:0;54254:71::-;54294:4;54313:6;;;;;;;;;;;54306:13;;54254:71;:::o;34408:369::-;34575:28;34585:4;34591:2;34595:7;34575:9;:28::i;:::-;34618:15;:2;:13;;;:15::i;:::-;:76;;;;;34638:56;34669:4;34675:2;34679:7;34688:5;34638:30;:56::i;:::-;34637:57;34618:76;34614:156;;;34718:40;;;;;;;;;;;;;;34614:156;34408:369;;;;:::o;50704:141::-;50780:4;50802:37;50821:5;50828:4;;50834;50802:18;:37::i;:::-;50795:44;;50704:141;;;;:::o;55389:124::-;47432:13;:11;:13::i;:::-;55491:16:::1;55473:15;:34;;;;;;:::i;:::-;;55389:124:::0;:::o;52867:479::-;52951:13;52992:16;53000:7;52992;:16::i;:::-;52976:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;53097:5;53085:17;;:8;;;;;;;;;;;:17;;;53082:62;;53122:14;53115:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53082:62;53152:28;53183:10;:8;:10::i;:::-;53152:41;;53238:1;53213:14;53207:28;:32;:133;;;;;;;;;;;;;;;;;53275:14;53291:18;:7;:16;:18::i;:::-;53311:13;53258:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53207:133;53200:140;;;52867:479;;;;:::o;54838:191::-;47432:13;:11;:13::i;:::-;54989:34:::1;54952;:71;;;;54838:191:::0;:::o;53352:90::-;53400:7;53422:14;;53415:21;;53352:90;:::o;53448:91::-;53497:7;53520:13;;53513:20;;53448:91;:::o;55623:122::-;47432:13;:11;:13::i;:::-;55722:17:::1;55706:13;:33;;;;;;:::i;:::-;;55623:122:::0;:::o;52767:94::-;52811:13;52840:15;52833:22;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52767:94;:::o;33680:164::-;33777:4;33801:18;:25;33820:5;33801:25;;;;;;;;;;;;;;;:35;33827:8;33801:35;;;;;;;;;;;;;;;;;;;;;;;;;33794:42;;33680:164;;;;:::o;49945:88::-;;;;:::o;51152:734::-;51224:6;;;;;;;;;;;51223:7;51215:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;51288:1;51274:11;:15;51266:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;51372:9;;51357:11;51341:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;51333:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;51485:30;;51449:20;:32;51470:10;51449:32;;;;;;;;;;;;;;;;51436:11;:45;;;;:::i;:::-;:79;;51428:176;;;;;;;;;;;;:::i;:::-;;;;;;;;;51650:11;51633:14;;:28;;;;:::i;:::-;51619:9;:43;;51611:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;51770:11;51734:20;:32;51755:10;51734:32;;;;;;;;;;;;;;;;:47;;;;;;;:::i;:::-;;;;;;;;51788:40;51794:10;51806:11;51788:40;;;;;;;;;;;;51823:4;51788:5;:40::i;:::-;51845:14;;;;;;;;;;;51837:32;;:43;51870:9;51837:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51152:734;:::o;55263:120::-;47432:13;:11;:13::i;:::-;55362:15:::1;55345:14;:32;;;;;;:::i;:::-;;55263:120:::0;:::o;48452:201::-;47432:13;:11;:13::i;:::-;48561:1:::1;48541:22;;:8;:22;;::::0;48533:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;48617:28;48636:8;48617:18;:28::i;:::-;48452:201:::0;:::o;53545:124::-;53610:7;53633:30;;53626:37;;53545:124;:::o;13886:157::-;13971:4;14010:25;13995:40;;;:11;:40;;;;13988:47;;13886:157;;;:::o;47711:132::-;47786:12;:10;:12::i;:::-;47775:23;;:7;:5;:7::i;:::-;:23;;;47767:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47711:132::o;36103:1913::-;36242:20;36265:13;;36242:36;;36307:1;36293:16;;:2;:16;;;36289:48;;36318:19;;;;;;;;;;;;;;36289:48;36364:1;36352:8;:13;36348:44;;36374:18;;;;;;;;;;;;;;36348:44;36405:61;36435:1;36439:2;36443:12;36457:8;36405:21;:61::i;:::-;36486:26;:38;36513:10;36486:38;;;;;;;;;;;;;;;;36479:45;;;;:::i;:::-;36836:8;36801:12;:16;36814:2;36801:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36900:8;36860:12;:16;36873:2;36860:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36959:2;36926:11;:25;36938:12;36926:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;37026:15;36976:11;:25;36988:12;36976:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;37059:20;37082:12;37059:35;;37109:11;37138:8;37123:12;:23;37109:37;;37167:4;:23;;;;;37175:15;:2;:13;;;:15::i;:::-;37167:23;37163:721;;;37211:314;37267:12;37263:2;37242:38;;37259:1;37242:38;;;;;;;;;;;;37308:69;37347:1;37351:2;37355:14;;;;;;37371:5;37308:30;:69::i;:::-;37303:174;;37413:40;;;;;;;;;;;;;;37303:174;37520:3;37504:12;:19;37211:314;;37606:12;37589:13;;:29;37585:43;;37620:8;;;37585:43;37163:721;;;37669:200;37695:26;:38;37722:10;37695:38;;;;;;;;;;;;;;;37739:12;37695:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37805:14;;;;;;37801:2;37780:40;;37797:1;37780:40;;;;;;;;;;;;37864:3;37848:12;:19;37669:200;;37163:721;37914:12;37898:13;:28;;;;36776:1162;;37948:60;37977:1;37981:2;37985:12;37999:8;37948:20;:60::i;:::-;36231:1785;36103:1913;;;;:::o;35032:174::-;35089:4;35132:7;35113:15;:13;:15::i;:::-;:26;;:53;;;;;35153:13;;35143:7;:23;35113:53;:85;;;;;35171:11;:20;35183:7;35171:20;;;;;;;;;;;:27;;;;;;;;;;;;35170:28;35113:85;35106:92;;35032:174;;;:::o;23891:98::-;23944:7;23971:10;23964:17;;23891:98;:::o;43327:196::-;43469:2;43442:15;:24;43458:7;43442:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;43507:7;43503:2;43487:28;;43496:5;43487:28;;;;;;;;;;;;43327:196;;;:::o;27436:92::-;27492:7;27519:1;27512:8;;27436:92;:::o;38270:2130::-;38385:35;38423:21;38436:7;38423:12;:21::i;:::-;38385:59;;38483:4;38461:26;;:13;:18;;;:26;;;38457:67;;38496:28;;;;;;;;;;;;;;38457:67;38537:22;38579:4;38563:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;38600:36;38617:4;38623:12;:10;:12::i;:::-;38600:16;:36::i;:::-;38563:73;:126;;;;38677:12;:10;:12::i;:::-;38653:36;;:20;38665:7;38653:11;:20::i;:::-;:36;;;38563:126;38537:153;;38708:17;38703:66;;38734:35;;;;;;;;;;;;;;38703:66;38798:1;38784:16;;:2;:16;;;38780:52;;38809:23;;;;;;;;;;;;;;38780:52;38845:43;38867:4;38873:2;38877:7;38886:1;38845:21;:43::i;:::-;38953:35;38970:1;38974:7;38983:4;38953:8;:35::i;:::-;39314:1;39284:12;:18;39297:4;39284:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39358:1;39330:12;:16;39343:2;39330:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39376:31;39410:11;:20;39422:7;39410:20;;;;;;;;;;;39376:54;;39461:2;39445:8;:13;;;:18;;;;;;;;;;;;;;;;;;39511:15;39478:8;:23;;;:49;;;;;;;;;;;;;;;;;;39779:19;39811:1;39801:7;:11;39779:33;;39827:31;39861:11;:24;39873:11;39861:24;;;;;;;;;;;39827:58;;39929:1;39904:27;;:8;:13;;;;;;;;;;;;:27;;;39900:384;;40114:13;;40099:11;:28;40095:174;;40168:4;40152:8;:13;;;:20;;;;;;;;;;;;;;;;;;40221:13;:28;;;40195:8;:23;;;:54;;;;;;;;;;;;;;;;;;40095:174;39900:384;39259:1036;;;40331:7;40327:2;40312:27;;40321:4;40312:27;;;;;;;;;;;;40350:42;40371:4;40377:2;40381:7;40390:1;40350:20;:42::i;:::-;38374:2026;;38270:2130;;;:::o;50455:102::-;50515:13;50544:7;50537:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50455:102;:::o;430:723::-;486:13;716:1;707:5;:10;703:53;;734:10;;;;;;;;;;;;;;;;;;;;;703:53;766:12;781:5;766:20;;797:14;822:78;837:1;829:4;:9;822:78;;855:8;;;;;:::i;:::-;;;;886:2;878:10;;;;;:::i;:::-;;;822:78;;;910:19;942:6;932:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;910:39;;960:154;976:1;967:5;:10;960:154;;1004:1;994:11;;;;;:::i;:::-;;;1071:2;1063:5;:10;;;;:::i;:::-;1050:2;:24;;;;:::i;:::-;1037:39;;1020:6;1027;1020:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1100:2;1091:11;;;;;:::i;:::-;;;960:154;;;1138:6;1124:21;;;;;430:723;;;;:::o;30163:1109::-;30225:21;;:::i;:::-;30259:12;30274:7;30259:22;;30342:4;30323:15;:13;:15::i;:::-;:23;;:47;;;;;30357:13;;30350:4;:20;30323:47;30319:886;;;30391:31;30425:11;:17;30437:4;30425:17;;;;;;;;;;;30391:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30466:9;:16;;;30461:729;;30537:1;30511:28;;:9;:14;;;:28;;;30507:101;;30575:9;30568:16;;;;;;30507:101;30910:261;30917:4;30910:261;;;30950:6;;;;;;;;30995:11;:17;31007:4;30995:17;;;;;;;;;;;30983:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31069:1;31043:28;;:9;:14;;;:28;;;31039:109;;31111:9;31104:16;;;;;;31039:109;30910:261;;;30461:729;30372:833;30319:886;31233:31;;;;;;;;;;;;;;30163:1109;;;;:::o;48813:191::-;48887:16;48906:6;;;;;;;;;;;48887:25;;48932:8;48923:6;;:17;;;;;;;;;;;;;;;;;;48987:8;48956:40;;48977:8;48956:40;;;;;;;;;;;;48876:128;48813:191;:::o;3730:326::-;3790:4;4047:1;4025:7;:19;;;:23;4018:30;;3730:326;;;:::o;44015:667::-;44178:4;44215:2;44199:36;;;44236:12;:10;:12::i;:::-;44250:4;44256:7;44265:5;44199:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;44195:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44450:1;44433:6;:13;:18;44429:235;;44479:40;;;;;;;;;;;;;;44429:235;44622:6;44616:13;44607:6;44603:2;44599:15;44592:38;44195:480;44328:45;;;44318:55;;;:6;:55;;;;44311:62;;;44015:667;;;;;;:::o;21746:190::-;21871:4;21924;21895:25;21908:5;21915:4;21895:12;:25::i;:::-;:33;21888:40;;21746:190;;;;;:::o;45330:159::-;;;;;:::o;46148:158::-;;;;;:::o;22298:675::-;22381:7;22401:20;22424:4;22401:27;;22444:9;22439:497;22463:5;:12;22459:1;:16;22439:497;;;22497:20;22520:5;22526:1;22520:8;;;;;;;;:::i;:::-;;;;;;;;22497:31;;22563:12;22547;:28;22543:382;;22690:42;22705:12;22719;22690:14;:42::i;:::-;22675:57;;22543:382;;;22867:42;22882:12;22896;22867:14;:42::i;:::-;22852:57;;22543:382;22482:454;22477:3;;;;;:::i;:::-;;;;22439:497;;;;22953:12;22946:19;;;22298:675;;;;:::o;22981:224::-;23049:13;23112:1;23106:4;23099:15;23141:1;23135:4;23128:15;23182:4;23176;23166:21;23157:30;;22981:224;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:116::-;1588:21;1603:5;1588:21;:::i;:::-;1581:5;1578:32;1568:60;;1624:1;1621;1614:12;1568:60;1518:116;:::o;1640:133::-;1683:5;1721:6;1708:20;1699:29;;1737:30;1761:5;1737:30;:::i;:::-;1640:133;;;;:::o;1779:323::-;1835:6;1884:2;1872:9;1863:7;1859:23;1855:32;1852:119;;;1890:79;;:::i;:::-;1852:119;2010:1;2035:50;2077:7;2068:6;2057:9;2053:22;2035:50;:::i;:::-;2025:60;;1981:114;1779:323;;;;:::o;2108:77::-;2145:7;2174:5;2163:16;;2108:77;;;:::o;2191:118::-;2278:24;2296:5;2278:24;:::i;:::-;2273:3;2266:37;2191:118;;:::o;2315:222::-;2408:4;2446:2;2435:9;2431:18;2423:26;;2459:71;2527:1;2516:9;2512:17;2503:6;2459:71;:::i;:::-;2315:222;;;;:::o;2543:122::-;2616:24;2634:5;2616:24;:::i;:::-;2609:5;2606:35;2596:63;;2655:1;2652;2645:12;2596:63;2543:122;:::o;2671:139::-;2717:5;2755:6;2742:20;2733:29;;2771:33;2798:5;2771:33;:::i;:::-;2671:139;;;;:::o;2816:117::-;2925:1;2922;2915:12;2939:102;2980:6;3031:2;3027:7;3022:2;3015:5;3011:14;3007:28;2997:38;;2939:102;;;:::o;3047:180::-;3095:77;3092:1;3085:88;3192:4;3189:1;3182:15;3216:4;3213:1;3206:15;3233:281;3316:27;3338:4;3316:27;:::i;:::-;3308:6;3304:40;3446:6;3434:10;3431:22;3410:18;3398:10;3395:34;3392:62;3389:88;;;3457:18;;:::i;:::-;3389:88;3497:10;3493:2;3486:22;3276:238;3233:281;;:::o;3520:129::-;3554:6;3581:20;;:::i;:::-;3571:30;;3610:33;3638:4;3630:6;3610:33;:::i;:::-;3520:129;;;:::o;3655:311::-;3732:4;3822:18;3814:6;3811:30;3808:56;;;3844:18;;:::i;:::-;3808:56;3894:4;3886:6;3882:17;3874:25;;3954:4;3948;3944:15;3936:23;;3655:311;;;:::o;3972:117::-;4081:1;4078;4071:12;4095:77;4132:7;4161:5;4150:16;;4095:77;;;:::o;4178:122::-;4251:24;4269:5;4251:24;:::i;:::-;4244:5;4241:35;4231:63;;4290:1;4287;4280:12;4231:63;4178:122;:::o;4306:139::-;4352:5;4390:6;4377:20;4368:29;;4406:33;4433:5;4406:33;:::i;:::-;4306:139;;;;:::o;4468:710::-;4564:5;4589:81;4605:64;4662:6;4605:64;:::i;:::-;4589:81;:::i;:::-;4580:90;;4690:5;4719:6;4712:5;4705:21;4753:4;4746:5;4742:16;4735:23;;4806:4;4798:6;4794:17;4786:6;4782:30;4835:3;4827:6;4824:15;4821:122;;;4854:79;;:::i;:::-;4821:122;4969:6;4952:220;4986:6;4981:3;4978:15;4952:220;;;5061:3;5090:37;5123:3;5111:10;5090:37;:::i;:::-;5085:3;5078:50;5157:4;5152:3;5148:14;5141:21;;5028:144;5012:4;5007:3;5003:14;4996:21;;4952:220;;;4956:21;4570:608;;4468:710;;;;;:::o;5201:370::-;5272:5;5321:3;5314:4;5306:6;5302:17;5298:27;5288:122;;5329:79;;:::i;:::-;5288:122;5446:6;5433:20;5471:94;5561:3;5553:6;5546:4;5538:6;5534:17;5471:94;:::i;:::-;5462:103;;5278:293;5201:370;;;;:::o;5577:684::-;5670:6;5678;5727:2;5715:9;5706:7;5702:23;5698:32;5695:119;;;5733:79;;:::i;:::-;5695:119;5853:1;5878:53;5923:7;5914:6;5903:9;5899:22;5878:53;:::i;:::-;5868:63;;5824:117;6008:2;5997:9;5993:18;5980:32;6039:18;6031:6;6028:30;6025:117;;;6061:79;;:::i;:::-;6025:117;6166:78;6236:7;6227:6;6216:9;6212:22;6166:78;:::i;:::-;6156:88;;5951:303;5577:684;;;;;:::o;6267:99::-;6319:6;6353:5;6347:12;6337:22;;6267:99;;;:::o;6372:169::-;6456:11;6490:6;6485:3;6478:19;6530:4;6525:3;6521:14;6506:29;;6372:169;;;;:::o;6547:246::-;6628:1;6638:113;6652:6;6649:1;6646:13;6638:113;;;6737:1;6732:3;6728:11;6722:18;6718:1;6713:3;6709:11;6702:39;6674:2;6671:1;6667:10;6662:15;;6638:113;;;6785:1;6776:6;6771:3;6767:16;6760:27;6609:184;6547:246;;;:::o;6799:377::-;6887:3;6915:39;6948:5;6915:39;:::i;:::-;6970:71;7034:6;7029:3;6970:71;:::i;:::-;6963:78;;7050:65;7108:6;7103:3;7096:4;7089:5;7085:16;7050:65;:::i;:::-;7140:29;7162:6;7140:29;:::i;:::-;7135:3;7131:39;7124:46;;6891:285;6799:377;;;;:::o;7182:313::-;7295:4;7333:2;7322:9;7318:18;7310:26;;7382:9;7376:4;7372:20;7368:1;7357:9;7353:17;7346:47;7410:78;7483:4;7474:6;7410:78;:::i;:::-;7402:86;;7182:313;;;;:::o;7501:329::-;7560:6;7609:2;7597:9;7588:7;7584:23;7580:32;7577:119;;;7615:79;;:::i;:::-;7577:119;7735:1;7760:53;7805:7;7796:6;7785:9;7781:22;7760:53;:::i;:::-;7750:63;;7706:117;7501:329;;;;:::o;7836:126::-;7873:7;7913:42;7906:5;7902:54;7891:65;;7836:126;;;:::o;7968:96::-;8005:7;8034:24;8052:5;8034:24;:::i;:::-;8023:35;;7968:96;;;:::o;8070:118::-;8157:24;8175:5;8157:24;:::i;:::-;8152:3;8145:37;8070:118;;:::o;8194:222::-;8287:4;8325:2;8314:9;8310:18;8302:26;;8338:71;8406:1;8395:9;8391:17;8382:6;8338:71;:::i;:::-;8194:222;;;;:::o;8422:122::-;8495:24;8513:5;8495:24;:::i;:::-;8488:5;8485:35;8475:63;;8534:1;8531;8524:12;8475:63;8422:122;:::o;8550:139::-;8596:5;8634:6;8621:20;8612:29;;8650:33;8677:5;8650:33;:::i;:::-;8550:139;;;;:::o;8695:474::-;8763:6;8771;8820:2;8808:9;8799:7;8795:23;8791:32;8788:119;;;8826:79;;:::i;:::-;8788:119;8946:1;8971:53;9016:7;9007:6;8996:9;8992:22;8971:53;:::i;:::-;8961:63;;8917:117;9073:2;9099:53;9144:7;9135:6;9124:9;9120:22;9099:53;:::i;:::-;9089:63;;9044:118;8695:474;;;;;:::o;9175:619::-;9252:6;9260;9268;9317:2;9305:9;9296:7;9292:23;9288:32;9285:119;;;9323:79;;:::i;:::-;9285:119;9443:1;9468:53;9513:7;9504:6;9493:9;9489:22;9468:53;:::i;:::-;9458:63;;9414:117;9570:2;9596:53;9641:7;9632:6;9621:9;9617:22;9596:53;:::i;:::-;9586:63;;9541:118;9698:2;9724:53;9769:7;9760:6;9749:9;9745:22;9724:53;:::i;:::-;9714:63;;9669:118;9175:619;;;;;:::o;9800:329::-;9859:6;9908:2;9896:9;9887:7;9883:23;9879:32;9876:119;;;9914:79;;:::i;:::-;9876:119;10034:1;10059:53;10104:7;10095:6;10084:9;10080:22;10059:53;:::i;:::-;10049:63;;10005:117;9800:329;;;;:::o;10135:114::-;10202:6;10236:5;10230:12;10220:22;;10135:114;;;:::o;10255:184::-;10354:11;10388:6;10383:3;10376:19;10428:4;10423:3;10419:14;10404:29;;10255:184;;;;:::o;10445:132::-;10512:4;10535:3;10527:11;;10565:4;10560:3;10556:14;10548:22;;10445:132;;;:::o;10583:108::-;10660:24;10678:5;10660:24;:::i;:::-;10655:3;10648:37;10583:108;;:::o;10697:179::-;10766:10;10787:46;10829:3;10821:6;10787:46;:::i;:::-;10865:4;10860:3;10856:14;10842:28;;10697:179;;;;:::o;10882:113::-;10952:4;10984;10979:3;10975:14;10967:22;;10882:113;;;:::o;11031:732::-;11150:3;11179:54;11227:5;11179:54;:::i;:::-;11249:86;11328:6;11323:3;11249:86;:::i;:::-;11242:93;;11359:56;11409:5;11359:56;:::i;:::-;11438:7;11469:1;11454:284;11479:6;11476:1;11473:13;11454:284;;;11555:6;11549:13;11582:63;11641:3;11626:13;11582:63;:::i;:::-;11575:70;;11668:60;11721:6;11668:60;:::i;:::-;11658:70;;11514:224;11501:1;11498;11494:9;11489:14;;11454:284;;;11458:14;11754:3;11747:10;;11155:608;;;11031:732;;;;:::o;11769:373::-;11912:4;11950:2;11939:9;11935:18;11927:26;;11999:9;11993:4;11989:20;11985:1;11974:9;11970:17;11963:47;12027:108;12130:4;12121:6;12027:108;:::i;:::-;12019:116;;11769:373;;;;:::o;12148:117::-;12257:1;12254;12247:12;12271:308;12333:4;12423:18;12415:6;12412:30;12409:56;;;12445:18;;:::i;:::-;12409:56;12483:29;12505:6;12483:29;:::i;:::-;12475:37;;12567:4;12561;12557:15;12549:23;;12271:308;;;:::o;12585:146::-;12682:6;12677:3;12672;12659:30;12723:1;12714:6;12709:3;12705:16;12698:27;12585:146;;;:::o;12737:425::-;12815:5;12840:66;12856:49;12898:6;12856:49;:::i;:::-;12840:66;:::i;:::-;12831:75;;12929:6;12922:5;12915:21;12967:4;12960:5;12956:16;13005:3;12996:6;12991:3;12987:16;12984:25;12981:112;;;13012:79;;:::i;:::-;12981:112;13102:54;13149:6;13144:3;13139;13102:54;:::i;:::-;12821:341;12737:425;;;;;:::o;13182:340::-;13238:5;13287:3;13280:4;13272:6;13268:17;13264:27;13254:122;;13295:79;;:::i;:::-;13254:122;13412:6;13399:20;13437:79;13512:3;13504:6;13497:4;13489:6;13485:17;13437:79;:::i;:::-;13428:88;;13244:278;13182:340;;;;:::o;13528:654::-;13606:6;13614;13663:2;13651:9;13642:7;13638:23;13634:32;13631:119;;;13669:79;;:::i;:::-;13631:119;13789:1;13814:53;13859:7;13850:6;13839:9;13835:22;13814:53;:::i;:::-;13804:63;;13760:117;13944:2;13933:9;13929:18;13916:32;13975:18;13967:6;13964:30;13961:117;;;13997:79;;:::i;:::-;13961:117;14102:63;14157:7;14148:6;14137:9;14133:22;14102:63;:::i;:::-;14092:73;;13887:288;13528:654;;;;;:::o;14188:509::-;14257:6;14306:2;14294:9;14285:7;14281:23;14277:32;14274:119;;;14312:79;;:::i;:::-;14274:119;14460:1;14449:9;14445:17;14432:31;14490:18;14482:6;14479:30;14476:117;;;14512:79;;:::i;:::-;14476:117;14617:63;14672:7;14663:6;14652:9;14648:22;14617:63;:::i;:::-;14607:73;;14403:287;14188:509;;;;:::o;14703:684::-;14796:6;14804;14853:2;14841:9;14832:7;14828:23;14824:32;14821:119;;;14859:79;;:::i;:::-;14821:119;14979:1;15004:53;15049:7;15040:6;15029:9;15025:22;15004:53;:::i;:::-;14994:63;;14950:117;15134:2;15123:9;15119:18;15106:32;15165:18;15157:6;15154:30;15151:117;;;15187:79;;:::i;:::-;15151:117;15292:78;15362:7;15353:6;15342:9;15338:22;15292:78;:::i;:::-;15282:88;;15077:303;14703:684;;;;;:::o;15393:468::-;15458:6;15466;15515:2;15503:9;15494:7;15490:23;15486:32;15483:119;;;15521:79;;:::i;:::-;15483:119;15641:1;15666:53;15711:7;15702:6;15691:9;15687:22;15666:53;:::i;:::-;15656:63;;15612:117;15768:2;15794:50;15836:7;15827:6;15816:9;15812:22;15794:50;:::i;:::-;15784:60;;15739:115;15393:468;;;;;:::o;15867:307::-;15928:4;16018:18;16010:6;16007:30;16004:56;;;16040:18;;:::i;:::-;16004:56;16078:29;16100:6;16078:29;:::i;:::-;16070:37;;16162:4;16156;16152:15;16144:23;;15867:307;;;:::o;16180:423::-;16257:5;16282:65;16298:48;16339:6;16298:48;:::i;:::-;16282:65;:::i;:::-;16273:74;;16370:6;16363:5;16356:21;16408:4;16401:5;16397:16;16446:3;16437:6;16432:3;16428:16;16425:25;16422:112;;;16453:79;;:::i;:::-;16422:112;16543:54;16590:6;16585:3;16580;16543:54;:::i;:::-;16263:340;16180:423;;;;;:::o;16622:338::-;16677:5;16726:3;16719:4;16711:6;16707:17;16703:27;16693:122;;16734:79;;:::i;:::-;16693:122;16851:6;16838:20;16876:78;16950:3;16942:6;16935:4;16927:6;16923:17;16876:78;:::i;:::-;16867:87;;16683:277;16622:338;;;;:::o;16966:943::-;17061:6;17069;17077;17085;17134:3;17122:9;17113:7;17109:23;17105:33;17102:120;;;17141:79;;:::i;:::-;17102:120;17261:1;17286:53;17331:7;17322:6;17311:9;17307:22;17286:53;:::i;:::-;17276:63;;17232:117;17388:2;17414:53;17459:7;17450:6;17439:9;17435:22;17414:53;:::i;:::-;17404:63;;17359:118;17516:2;17542:53;17587:7;17578:6;17567:9;17563:22;17542:53;:::i;:::-;17532:63;;17487:118;17672:2;17661:9;17657:18;17644:32;17703:18;17695:6;17692:30;17689:117;;;17725:79;;:::i;:::-;17689:117;17830:62;17884:7;17875:6;17864:9;17860:22;17830:62;:::i;:::-;17820:72;;17615:287;16966:943;;;;;;;:::o;17915:684::-;18008:6;18016;18065:2;18053:9;18044:7;18040:23;18036:32;18033:119;;;18071:79;;:::i;:::-;18033:119;18219:1;18208:9;18204:17;18191:31;18249:18;18241:6;18238:30;18235:117;;;18271:79;;:::i;:::-;18235:117;18376:78;18446:7;18437:6;18426:9;18422:22;18376:78;:::i;:::-;18366:88;;18162:302;18503:2;18529:53;18574:7;18565:6;18554:9;18550:22;18529:53;:::i;:::-;18519:63;;18474:118;17915:684;;;;;:::o;18605:474::-;18673:6;18681;18730:2;18718:9;18709:7;18705:23;18701:32;18698:119;;;18736:79;;:::i;:::-;18698:119;18856:1;18881:53;18926:7;18917:6;18906:9;18902:22;18881:53;:::i;:::-;18871:63;;18827:117;18983:2;19009:53;19054:7;19045:6;19034:9;19030:22;19009:53;:::i;:::-;18999:63;;18954:118;18605:474;;;;;:::o;19085:118::-;19172:24;19190:5;19172:24;:::i;:::-;19167:3;19160:37;19085:118;;:::o;19209:222::-;19302:4;19340:2;19329:9;19325:18;19317:26;;19353:71;19421:1;19410:9;19406:17;19397:6;19353:71;:::i;:::-;19209:222;;;;:::o;19437:224::-;19577:34;19573:1;19565:6;19561:14;19554:58;19646:7;19641:2;19633:6;19629:15;19622:32;19437:224;:::o;19667:366::-;19809:3;19830:67;19894:2;19889:3;19830:67;:::i;:::-;19823:74;;19906:93;19995:3;19906:93;:::i;:::-;20024:2;20019:3;20015:12;20008:19;;19667:366;;;:::o;20039:419::-;20205:4;20243:2;20232:9;20228:18;20220:26;;20292:9;20286:4;20282:20;20278:1;20267:9;20263:17;20256:47;20320:131;20446:4;20320:131;:::i;:::-;20312:139;;20039:419;;;:::o;20464:174::-;20604:26;20600:1;20592:6;20588:14;20581:50;20464:174;:::o;20644:366::-;20786:3;20807:67;20871:2;20866:3;20807:67;:::i;:::-;20800:74;;20883:93;20972:3;20883:93;:::i;:::-;21001:2;20996:3;20992:12;20985:19;;20644:366;;;:::o;21016:419::-;21182:4;21220:2;21209:9;21205:18;21197:26;;21269:9;21263:4;21259:20;21255:1;21244:9;21240:17;21233:47;21297:131;21423:4;21297:131;:::i;:::-;21289:139;;21016:419;;;:::o;21441:182::-;21581:34;21577:1;21569:6;21565:14;21558:58;21441:182;:::o;21629:366::-;21771:3;21792:67;21856:2;21851:3;21792:67;:::i;:::-;21785:74;;21868:93;21957:3;21868:93;:::i;:::-;21986:2;21981:3;21977:12;21970:19;;21629:366;;;:::o;22001:419::-;22167:4;22205:2;22194:9;22190:18;22182:26;;22254:9;22248:4;22244:20;22240:1;22229:9;22225:17;22218:47;22282:131;22408:4;22282:131;:::i;:::-;22274:139;;22001:419;;;:::o;22426:180::-;22474:77;22471:1;22464:88;22571:4;22568:1;22561:15;22595:4;22592:1;22585:15;22612:191;22652:3;22671:20;22689:1;22671:20;:::i;:::-;22666:25;;22705:20;22723:1;22705:20;:::i;:::-;22700:25;;22748:1;22745;22741:9;22734:16;;22769:3;22766:1;22763:10;22760:36;;;22776:18;;:::i;:::-;22760:36;22612:191;;;;:::o;22809:222::-;22949:34;22945:1;22937:6;22933:14;22926:58;23018:5;23013:2;23005:6;23001:15;22994:30;22809:222;:::o;23037:366::-;23179:3;23200:67;23264:2;23259:3;23200:67;:::i;:::-;23193:74;;23276:93;23365:3;23276:93;:::i;:::-;23394:2;23389:3;23385:12;23378:19;;23037:366;;;:::o;23409:419::-;23575:4;23613:2;23602:9;23598:18;23590:26;;23662:9;23656:4;23652:20;23648:1;23637:9;23633:17;23626:47;23690:131;23816:4;23690:131;:::i;:::-;23682:139;;23409:419;;;:::o;23834:173::-;23974:25;23970:1;23962:6;23958:14;23951:49;23834:173;:::o;24013:366::-;24155:3;24176:67;24240:2;24235:3;24176:67;:::i;:::-;24169:74;;24252:93;24341:3;24252:93;:::i;:::-;24370:2;24365:3;24361:12;24354:19;;24013:366;;;:::o;24385:419::-;24551:4;24589:2;24578:9;24574:18;24566:26;;24638:9;24632:4;24628:20;24624:1;24613:9;24609:17;24602:47;24666:131;24792:4;24666:131;:::i;:::-;24658:139;;24385:419;;;:::o;24810:240::-;24950:34;24946:1;24938:6;24934:14;24927:58;25019:23;25014:2;25006:6;25002:15;24995:48;24810:240;:::o;25056:366::-;25198:3;25219:67;25283:2;25278:3;25219:67;:::i;:::-;25212:74;;25295:93;25384:3;25295:93;:::i;:::-;25413:2;25408:3;25404:12;25397:19;;25056:366;;;:::o;25428:419::-;25594:4;25632:2;25621:9;25617:18;25609:26;;25681:9;25675:4;25671:20;25667:1;25656:9;25652:17;25645:47;25709:131;25835:4;25709:131;:::i;:::-;25701:139;;25428:419;;;:::o;25853:180::-;25901:77;25898:1;25891:88;25998:4;25995:1;25988:15;26022:4;26019:1;26012:15;26039:320;26083:6;26120:1;26114:4;26110:12;26100:22;;26167:1;26161:4;26157:12;26188:18;26178:81;;26244:4;26236:6;26232:17;26222:27;;26178:81;26306:2;26298:6;26295:14;26275:18;26272:38;26269:84;;26325:18;;:::i;:::-;26269:84;26090:269;26039:320;;;:::o;26365:410::-;26405:7;26428:20;26446:1;26428:20;:::i;:::-;26423:25;;26462:20;26480:1;26462:20;:::i;:::-;26457:25;;26517:1;26514;26510:9;26539:30;26557:11;26539:30;:::i;:::-;26528:41;;26718:1;26709:7;26705:15;26702:1;26699:22;26679:1;26672:9;26652:83;26629:139;;26748:18;;:::i;:::-;26629:139;26413:362;26365:410;;;;:::o;26781:180::-;26829:77;26826:1;26819:88;26926:4;26923:1;26916:15;26950:4;26947:1;26940:15;26967:185;27007:1;27024:20;27042:1;27024:20;:::i;:::-;27019:25;;27058:20;27076:1;27058:20;:::i;:::-;27053:25;;27097:1;27087:35;;27102:18;;:::i;:::-;27087:35;27144:1;27141;27137:9;27132:14;;26967:185;;;;:::o;27158:147::-;27259:11;27296:3;27281:18;;27158:147;;;;:::o;27311:114::-;;:::o;27431:398::-;27590:3;27611:83;27692:1;27687:3;27611:83;:::i;:::-;27604:90;;27703:93;27792:3;27703:93;:::i;:::-;27821:1;27816:3;27812:11;27805:18;;27431:398;;;:::o;27835:379::-;28019:3;28041:147;28184:3;28041:147;:::i;:::-;28034:154;;28205:3;28198:10;;27835:379;;;:::o;28220:148::-;28322:11;28359:3;28344:18;;28220:148;;;;:::o;28374:390::-;28480:3;28508:39;28541:5;28508:39;:::i;:::-;28563:89;28645:6;28640:3;28563:89;:::i;:::-;28556:96;;28661:65;28719:6;28714:3;28707:4;28700:5;28696:16;28661:65;:::i;:::-;28751:6;28746:3;28742:16;28735:23;;28484:280;28374:390;;;;:::o;28770:595::-;28998:3;29020:95;29111:3;29102:6;29020:95;:::i;:::-;29013:102;;29132:95;29223:3;29214:6;29132:95;:::i;:::-;29125:102;;29244:95;29335:3;29326:6;29244:95;:::i;:::-;29237:102;;29356:3;29349:10;;28770:595;;;;;;:::o;29371:141::-;29420:4;29443:3;29435:11;;29466:3;29463:1;29456:14;29500:4;29497:1;29487:18;29479:26;;29371:141;;;:::o;29518:93::-;29555:6;29602:2;29597;29590:5;29586:14;29582:23;29572:33;;29518:93;;;:::o;29617:107::-;29661:8;29711:5;29705:4;29701:16;29680:37;;29617:107;;;;:::o;29730:393::-;29799:6;29849:1;29837:10;29833:18;29872:97;29902:66;29891:9;29872:97;:::i;:::-;29990:39;30020:8;30009:9;29990:39;:::i;:::-;29978:51;;30062:4;30058:9;30051:5;30047:21;30038:30;;30111:4;30101:8;30097:19;30090:5;30087:30;30077:40;;29806:317;;29730:393;;;;;:::o;30129:60::-;30157:3;30178:5;30171:12;;30129:60;;;:::o;30195:142::-;30245:9;30278:53;30296:34;30305:24;30323:5;30305:24;:::i;:::-;30296:34;:::i;:::-;30278:53;:::i;:::-;30265:66;;30195:142;;;:::o;30343:75::-;30386:3;30407:5;30400:12;;30343:75;;;:::o;30424:269::-;30534:39;30565:7;30534:39;:::i;:::-;30595:91;30644:41;30668:16;30644:41;:::i;:::-;30636:6;30629:4;30623:11;30595:91;:::i;:::-;30589:4;30582:105;30500:193;30424:269;;;:::o;30699:73::-;30744:3;30699:73;:::o;30778:189::-;30855:32;;:::i;:::-;30896:65;30954:6;30946;30940:4;30896:65;:::i;:::-;30831:136;30778:189;;:::o;30973:186::-;31033:120;31050:3;31043:5;31040:14;31033:120;;;31104:39;31141:1;31134:5;31104:39;:::i;:::-;31077:1;31070:5;31066:13;31057:22;;31033:120;;;30973:186;;:::o;31165:543::-;31266:2;31261:3;31258:11;31255:446;;;31300:38;31332:5;31300:38;:::i;:::-;31384:29;31402:10;31384:29;:::i;:::-;31374:8;31370:44;31567:2;31555:10;31552:18;31549:49;;;31588:8;31573:23;;31549:49;31611:80;31667:22;31685:3;31667:22;:::i;:::-;31657:8;31653:37;31640:11;31611:80;:::i;:::-;31270:431;;31255:446;31165:543;;;:::o;31714:117::-;31768:8;31818:5;31812:4;31808:16;31787:37;;31714:117;;;;:::o;31837:169::-;31881:6;31914:51;31962:1;31958:6;31950:5;31947:1;31943:13;31914:51;:::i;:::-;31910:56;31995:4;31989;31985:15;31975:25;;31888:118;31837:169;;;;:::o;32011:295::-;32087:4;32233:29;32258:3;32252:4;32233:29;:::i;:::-;32225:37;;32295:3;32292:1;32288:11;32282:4;32279:21;32271:29;;32011:295;;;;:::o;32311:1395::-;32428:37;32461:3;32428:37;:::i;:::-;32530:18;32522:6;32519:30;32516:56;;;32552:18;;:::i;:::-;32516:56;32596:38;32628:4;32622:11;32596:38;:::i;:::-;32681:67;32741:6;32733;32727:4;32681:67;:::i;:::-;32775:1;32799:4;32786:17;;32831:2;32823:6;32820:14;32848:1;32843:618;;;;33505:1;33522:6;33519:77;;;33571:9;33566:3;33562:19;33556:26;33547:35;;33519:77;33622:67;33682:6;33675:5;33622:67;:::i;:::-;33616:4;33609:81;33478:222;32813:887;;32843:618;32895:4;32891:9;32883:6;32879:22;32929:37;32961:4;32929:37;:::i;:::-;32988:1;33002:208;33016:7;33013:1;33010:14;33002:208;;;33095:9;33090:3;33086:19;33080:26;33072:6;33065:42;33146:1;33138:6;33134:14;33124:24;;33193:2;33182:9;33178:18;33165:31;;33039:4;33036:1;33032:12;33027:17;;33002:208;;;33238:6;33229:7;33226:19;33223:179;;;33296:9;33291:3;33287:19;33281:26;33339:48;33381:4;33373:6;33369:17;33358:9;33339:48;:::i;:::-;33331:6;33324:64;33246:156;33223:179;33448:1;33444;33436:6;33432:14;33428:22;33422:4;33415:36;32850:611;;;32813:887;;32403:1303;;;32311:1395;;:::o;33712:94::-;33745:8;33793:5;33789:2;33785:14;33764:35;;33712:94;;;:::o;33812:::-;33851:7;33880:20;33894:5;33880:20;:::i;:::-;33869:31;;33812:94;;;:::o;33912:100::-;33951:7;33980:26;34000:5;33980:26;:::i;:::-;33969:37;;33912:100;;;:::o;34018:157::-;34123:45;34143:24;34161:5;34143:24;:::i;:::-;34123:45;:::i;:::-;34118:3;34111:58;34018:157;;:::o;34181:256::-;34293:3;34308:75;34379:3;34370:6;34308:75;:::i;:::-;34408:2;34403:3;34399:12;34392:19;;34428:3;34421:10;;34181:256;;;;:::o;34443:234::-;34583:34;34579:1;34571:6;34567:14;34560:58;34652:17;34647:2;34639:6;34635:15;34628:42;34443:234;:::o;34683:366::-;34825:3;34846:67;34910:2;34905:3;34846:67;:::i;:::-;34839:74;;34922:93;35011:3;34922:93;:::i;:::-;35040:2;35035:3;35031:12;35024:19;;34683:366;;;:::o;35055:419::-;35221:4;35259:2;35248:9;35244:18;35236:26;;35308:9;35302:4;35298:20;35294:1;35283:9;35279:17;35272:47;35336:131;35462:4;35336:131;:::i;:::-;35328:139;;35055:419;;;:::o;35504:874::-;35607:3;35644:5;35638:12;35673:36;35699:9;35673:36;:::i;:::-;35725:89;35807:6;35802:3;35725:89;:::i;:::-;35718:96;;35845:1;35834:9;35830:17;35861:1;35856:166;;;;36036:1;36031:341;;;;35823:549;;35856:166;35940:4;35936:9;35925;35921:25;35916:3;35909:38;36002:6;35995:14;35988:22;35980:6;35976:35;35971:3;35967:45;35960:52;;35856:166;;36031:341;36098:38;36130:5;36098:38;:::i;:::-;36158:1;36172:154;36186:6;36183:1;36180:13;36172:154;;;36260:7;36254:14;36250:1;36245:3;36241:11;36234:35;36310:1;36301:7;36297:15;36286:26;;36208:4;36205:1;36201:12;36196:17;;36172:154;;;36355:6;36350:3;36346:16;36339:23;;36038:334;;35823:549;;35611:767;;35504:874;;;;:::o;36384:589::-;36609:3;36631:95;36722:3;36713:6;36631:95;:::i;:::-;36624:102;;36743:95;36834:3;36825:6;36743:95;:::i;:::-;36736:102;;36855:92;36943:3;36934:6;36855:92;:::i;:::-;36848:99;;36964:3;36957:10;;36384:589;;;;;;:::o;36979:308::-;37119:34;37115:1;37107:6;37103:14;37096:58;37188:34;37183:2;37175:6;37171:15;37164:59;37257:22;37252:2;37244:6;37240:15;37233:47;36979:308;:::o;37293:366::-;37435:3;37456:67;37520:2;37515:3;37456:67;:::i;:::-;37449:74;;37532:93;37621:3;37532:93;:::i;:::-;37650:2;37645:3;37641:12;37634:19;;37293:366;;;:::o;37665:419::-;37831:4;37869:2;37858:9;37854:18;37846:26;;37918:9;37912:4;37908:20;37904:1;37893:9;37889:17;37882:47;37946:131;38072:4;37946:131;:::i;:::-;37938:139;;37665:419;;;:::o;38090:245::-;38230:34;38226:1;38218:6;38214:14;38207:58;38299:28;38294:2;38286:6;38282:15;38275:53;38090:245;:::o;38341:366::-;38483:3;38504:67;38568:2;38563:3;38504:67;:::i;:::-;38497:74;;38580:93;38669:3;38580:93;:::i;:::-;38698:2;38693:3;38689:12;38682:19;;38341:366;;;:::o;38713:419::-;38879:4;38917:2;38906:9;38902:18;38894:26;;38966:9;38960:4;38956:20;38952:1;38941:9;38937:17;38930:47;38994:131;39120:4;38994:131;:::i;:::-;38986:139;;38713:419;;;:::o;39138:225::-;39278:34;39274:1;39266:6;39262:14;39255:58;39347:8;39342:2;39334:6;39330:15;39323:33;39138:225;:::o;39369:366::-;39511:3;39532:67;39596:2;39591:3;39532:67;:::i;:::-;39525:74;;39608:93;39697:3;39608:93;:::i;:::-;39726:2;39721:3;39717:12;39710:19;;39369:366;;;:::o;39741:419::-;39907:4;39945:2;39934:9;39930:18;39922:26;;39994:9;39988:4;39984:20;39980:1;39969:9;39965:17;39958:47;40022:131;40148:4;40022:131;:::i;:::-;40014:139;;39741:419;;;:::o;40166:182::-;40306:34;40302:1;40294:6;40290:14;40283:58;40166:182;:::o;40354:366::-;40496:3;40517:67;40581:2;40576:3;40517:67;:::i;:::-;40510:74;;40593:93;40682:3;40593:93;:::i;:::-;40711:2;40706:3;40702:12;40695:19;;40354:366;;;:::o;40726:419::-;40892:4;40930:2;40919:9;40915:18;40907:26;;40979:9;40973:4;40969:20;40965:1;40954:9;40950:17;40943:47;41007:131;41133:4;41007:131;:::i;:::-;40999:139;;40726:419;;;:::o;41151:233::-;41190:3;41213:24;41231:5;41213:24;:::i;:::-;41204:33;;41259:66;41252:5;41249:77;41246:103;;41329:18;;:::i;:::-;41246:103;41376:1;41369:5;41365:13;41358:20;;41151:233;;;:::o;41390:194::-;41430:4;41450:20;41468:1;41450:20;:::i;:::-;41445:25;;41484:20;41502:1;41484:20;:::i;:::-;41479:25;;41528:1;41525;41521:9;41513:17;;41552:1;41546:4;41543:11;41540:37;;;41557:18;;:::i;:::-;41540:37;41390:194;;;;:::o;41590:176::-;41622:1;41639:20;41657:1;41639:20;:::i;:::-;41634:25;;41673:20;41691:1;41673:20;:::i;:::-;41668:25;;41712:1;41702:35;;41717:18;;:::i;:::-;41702:35;41758:1;41755;41751:9;41746:14;;41590:176;;;;:::o;41772:180::-;41820:77;41817:1;41810:88;41917:4;41914:1;41907:15;41941:4;41938:1;41931:15;41958:98;42009:6;42043:5;42037:12;42027:22;;41958:98;;;:::o;42062:168::-;42145:11;42179:6;42174:3;42167:19;42219:4;42214:3;42210:14;42195:29;;42062:168;;;;:::o;42236:373::-;42322:3;42350:38;42382:5;42350:38;:::i;:::-;42404:70;42467:6;42462:3;42404:70;:::i;:::-;42397:77;;42483:65;42541:6;42536:3;42529:4;42522:5;42518:16;42483:65;:::i;:::-;42573:29;42595:6;42573:29;:::i;:::-;42568:3;42564:39;42557:46;;42326:283;42236:373;;;;:::o;42615:640::-;42810:4;42848:3;42837:9;42833:19;42825:27;;42862:71;42930:1;42919:9;42915:17;42906:6;42862:71;:::i;:::-;42943:72;43011:2;43000:9;42996:18;42987:6;42943:72;:::i;:::-;43025;43093:2;43082:9;43078:18;43069:6;43025:72;:::i;:::-;43144:9;43138:4;43134:20;43129:2;43118:9;43114:18;43107:48;43172:76;43243:4;43234:6;43172:76;:::i;:::-;43164:84;;42615:640;;;;;;;:::o;43261:141::-;43317:5;43348:6;43342:13;43333:22;;43364:32;43390:5;43364:32;:::i;:::-;43261:141;;;;:::o;43408:349::-;43477:6;43526:2;43514:9;43505:7;43501:23;43497:32;43494:119;;;43532:79;;:::i;:::-;43494:119;43652:1;43677:63;43732:7;43723:6;43712:9;43708:22;43677:63;:::i;:::-;43667:73;;43623:127;43408:349;;;;:::o

Swarm Source

ipfs://9cd9fad8cd7b6aa6a528ce4e5efa4b55f6fff3e135e0ce3f50eea9d98c045cc4
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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