ETH Price: $3,412.37 (+3.39%)

Token

Eloms (ELOMS)
 

Overview

Max Total Supply

4,420 ELOMS

Holders

1,768

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
*今夜烟花灿烂.eth
Balance
2 ELOMS
0x438b17E9E37f2AA691278f1F32A598d7cA06D876
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:
Eloms

Compiler Version
v0.8.12+commit.f00d7308

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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


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

                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.6.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 be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

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

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

    /**
     * @dev 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/contracts/utils/Strings.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

// File: @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: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts v4.4.1 (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 Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

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

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



pragma solidity ^0.8.12;










error AllOwnershipsHaveBeenSet();
error QuantityMustBeNonZero();
error NoTokensMintedYet();

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Does not support burning tokens to address(0).
 *
 * Assumes that an owner cannot have more than the 2**128 (max value of uint128) of supply
 */
contract ERC721E is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable, Ownable {
    using Address for address;
    using Strings for uint256;
    uint96 royaltyFeesInBips;
    address royaltyReceiver;
    string public contractURI;

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 internal currentIndex;

    // 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) private _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_, uint96 _royaltyFeesInBips, string memory _contractURI) {
        _name = name_;
        _symbol = symbol_;
        royaltyFeesInBips = _royaltyFeesInBips;
        contractURI = _contractURI;
        royaltyReceiver = msg.sender;
    }

    modifier callerIsUser() {
        require(tx.origin == msg.sender, "The caller is another contract");
        _;
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view override returns (uint256) {
        require(index < totalSupply(), 'ERC721E: global index out of bounds');
        return index;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) {
        require(index < balanceOf(owner), 'ERC721E: owner index out of bounds');
        uint256 numMintedSoFar = totalSupply();
        uint256 tokenIdsIdx;
        address currOwnershipAddr = address(0);
        for (uint256 i = 0; i < numMintedSoFar; i++) {
            TokenOwnership memory ownership = _ownerships[i];
            if (ownership.addr != address(0)) {
                currOwnershipAddr = ownership.addr;
            }
            if (currOwnershipAddr == owner) {
                if (tokenIdsIdx == index) {
                    return i;
                }
                tokenIdsIdx++;
            }
        }
        revert('ERC721E: unable to get token of owner by index');
    }

    /**
     * @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 ||
            interfaceId == type(IERC721Enumerable).interfaceId ||
            interfaceId == 0x2a55205a ||
            super.supportsInterface(interfaceId);
    }

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

    function _numberMinted(address owner) internal view returns (uint256) {
        require(owner != address(0), 'ERC721E: number minted query for the zero address');
        return uint256(_addressData[owner].numberMinted);
    }

    function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        require(_exists(tokenId), 'ERC721E: owner query for nonexistent token');

        for (uint256 curr = tokenId; ; curr--) {
            TokenOwnership memory ownership = _ownerships[curr];
            if (ownership.addr != address(0)) {
                return ownership;
            }
        }

        revert('ERC721E: unable to determine the owner of token');
    }

    /**
     * @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 override returns (string memory) {
        return _name;
    }

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

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

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

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

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            'ERC721E: transfer to non ERC721Receiver implementer'
        );
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return tokenId < currentIndex;
    }

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

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` cannot be larger than the max batch size.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        uint256 startTokenId = currentIndex;
        require(to != address(0), 'ERC721E: mint to the zero address');
        // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering.
        require(!_exists(startTokenId), 'ERC721E: token already minted');
        require(quantity > 0, 'ERC721E: quantity must be greater 0');

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

        _addressData[to].balance += uint128(quantity);
        _addressData[to].numberMinted += uint128(quantity);

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

        uint256 updatedIndex = startTokenId;

        for (uint256 i = 0; i < quantity; i++) {
            emit Transfer(address(0), to, updatedIndex);
            require(
                _checkOnERC721Received(address(0), to, updatedIndex, _data),
                'ERC721E: transfer to non ERC721Receiver implementer'
            );
            updatedIndex++;
        }

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

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            getApproved(tokenId) == _msgSender() ||
            isApprovedForAll(prevOwnership.addr, _msgSender()));

        require(isApprovedOrOwner, 'ERC721E: transfer caller is not owner nor approved');

        require(prevOwnership.addr == from, 'ERC721E: transfer from incorrect owner');
        require(to != address(0), 'ERC721E: transfer to the zero address');

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;
        }

        _ownerships[tokenId].addr = to;
        _ownerships[tokenId].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;
        if (_ownerships[nextTokenId].addr == address(0)) {
            if (_exists(nextTokenId)) {
                _ownerships[nextTokenId].addr = prevOwnership.addr;
                _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
            }
        }

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

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

    uint256 public nextOwnerToExplicitlySet;

    /**
     * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf().
     */
    function _setOwnersExplicit(uint256 quantity) internal {
        require(quantity > 0, 'quantity must be greater than zero');
        require(currentIndex > 0, 'no tokens minted yet');
        require(nextOwnerToExplicitlySet < currentIndex, 'all ownerships have been set');

        uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet;
        uint256 endIndex = oldNextOwnerToSet + quantity - 1;
        // Set the end index to be the last token index
        if (endIndex > currentIndex - 1) {
            endIndex = currentIndex - 1;
        }

        for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) {
            if (_ownerships[i].addr == address(0)) {
                TokenOwnership memory ownership = ownershipOf(i);
                _ownerships[i].addr = ownership.addr;
                _ownerships[i].startTimestamp = ownership.startTimestamp;
            }
        }
        nextOwnerToExplicitlySet = endIndex + 1;
    }   

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

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     *
     * 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`.
     */
    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.
     *
     * 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` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    address public signerAddress;

  /*
   * @dev Requires msg.sender to have valid access message.
   * @param _v ECDSA signature parameter v.
   * @param _r ECDSA signature parameters r.
   * @param _s ECDSA signature parameters s.
   */
  modifier onlyValidAccess(
      bytes32 _r,
      bytes32 _s,
      uint8 _v
  ) {
      require(isValidAccessMessage(msg.sender, _r, _s, _v));
      _;
  }

  function setSignerAddress(address newAddress) external onlyOwner {
      signerAddress = newAddress;
  }

  /*
   * @dev Verifies if message was signed by owner to give access to _add for this contract.
   *      Assumes Geth signature prefix.
   * @param _add Address of agent with access
   * @param _v ECDSA signature parameter v.
   * @param _r ECDSA signature parameters r.
   * @param _s ECDSA signature parameters s.
   * @return Validity of access message for a given address.
   */
  function isValidAccessMessage(
      address _add,
      bytes32 _r,
      bytes32 _s,
      uint8 _v
  ) public view returns (bool) {
      bytes32 digest = keccak256(abi.encode(2, _add));
      address signer = ecrecover(digest, _v, _r, _s);
      require(signer != address(0), 'ECDSA: invalid signature'); // Added check for zero address
      require(signerAddress == signer, "Signature does not match");
	  return signer == signerAddress;
  }

  function royaltyInfo(
        uint256 _tokenId,
        uint256 _salePrice
    ) external view returns (
        address receiver,
        uint256 royaltyAmount
    ) {
        return (royaltyReceiver, calculateRoyalty(_salePrice)); 
    }

  function calculateRoyalty(uint256 _salePrice) view public returns (uint256) {
      return (_salePrice / 10000) * royaltyFeesInBips;
  }

  function setRoyaltyInfo(address _receiver, uint96 _royaltyFeesInBips) public onlyOwner {
      royaltyReceiver = _receiver;
      royaltyFeesInBips = _royaltyFeesInBips;
  }

  function setContractURI(string calldata _contractURI) public onlyOwner {
      contractURI = _contractURI;
  }
}

// File: contracts/Eloms.sol



//     ▄████████  ▄█        ▄██████▄    ▄▄▄▄███▄▄▄▄      ▄████████ 
//    ███    ███ ███       ███    ███ ▄██▀▀▀███▀▀▀██▄   ███    ███ 
//    ███    █▀  ███       ███    ███ ███   ███   ███   ███    █▀  
//   ▄███▄▄▄     ███       ███    ███ ███   ███   ███   ███        
//  ▀▀███▀▀▀     ███       ███    ███ ███   ███   ███ ▀███████████ 
//    ███    █▄  ███       ███    ███ ███   ███   ███          ███ 
//    ███    ███ ███▌    ▄ ███    ███ ███   ███   ███    ▄█    ███ 
//    ██████████ █████▄▄██  ▀██████▀   ▀█   ███   █▀   ▄████████▀  
//               ▀                                                 

pragma solidity ^0.8.12;





contract Eloms is ERC721E, ReentrancyGuard {
  using Strings for uint256;
  string public provenanceHash;
  string private _baseTokenURI;


  // Sale Params
  uint256 public tokensMaxPerTx = 2;
  uint256 public tokensMaxPerWallet = 2;
  uint256 public tokensReserved = 420;
  uint256 public tokensMaxSupply = 4420;
  uint256 public cost = 0 ether;
  bool public isPublicSaleActive = false;

  constructor() ERC721E("Eloms", "ELOMS", 750, "https://elomsmetadata.s3.us-east-2.amazonaws.com/contractURI.json") {
  }

  function mintElom(uint256 quantity) external payable nonReentrant {
    require(quantity > 0, "QUANTITY SHOULD BE MORE THAN 0");
    require(isPublicSaleActive, "PUBLIC SALE NOT ACTIVE");
    require(quantity + numberMinted(msg.sender) <= tokensMaxPerWallet, "EXCEEDING MAX TOKENS PER WALLET");
    require(totalSupply() + quantity + tokensReserved <= tokensMaxSupply, "EXCEEDING MAX SUPPLY");
    require(msg.value >= cost * quantity, "INSUFFICIENT ETH");
    _safeMint(msg.sender, quantity, "");
  }

  function TeamMint(address[] calldata recipient, uint[] calldata quantity) external onlyOwner{
    require(recipient.length == quantity.length, "RECIPIENT AND QUANTITY NOT EQUAL LENGTH");
    uint256 totalQuantity = 0;
    for(uint256 i; i < quantity.length; i++){
      totalQuantity += quantity[i];
    }
    require(totalQuantity <= tokensReserved, "EXCEEDING REMAINING RESERVED SUPPLY");
    require(totalQuantity + totalSupply()  <= tokensMaxSupply, "EXCEEDING MAX SUPPLY");
    for(uint256 i; i < recipient.length; i++){
      tokensReserved -= quantity[i];
      _safeMint(recipient[i], quantity[i], "");
    }
  }

  // Withdrawal functions
  function emergencyWithdraw() external onlyOwner {
    address w1 = payable(0x2A03b32C24c40B435C65933ee574424Aa86b92AE);
    (bool success, ) = w1.call{value: address(this).balance}("");
    require(success, "Transaction Unsuccessful");
  }

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

  function setBaseURI(string calldata baseURI) external onlyOwner {
    _baseTokenURI = baseURI;
  }

  // Getters
  function numberMinted(address owner) public view returns (uint256) {
    return _numberMinted(owner);
  }
  
  function getOwnershipData(uint256 tokenId) external view returns (TokenOwnership memory) {
    return ownershipOf(tokenId);
  }

  // Setters
  function settokensReserved(uint256 _newMax) external onlyOwner {
    tokensReserved = _newMax;
  }

  function settokensMaxPerWallet(uint256 _newMax) external onlyOwner {
    tokensMaxPerWallet = _newMax;
  }

  function settokensMaxSupply(uint256 _newMax) external onlyOwner {
    tokensMaxSupply = _newMax;
  }

  function setPublicSaleStatus(bool _newState) public onlyOwner {
    isPublicSaleActive = _newState;
  }

  function setOwnersExplicit(uint256 quantity) external onlyOwner nonReentrant {
    _setOwnersExplicit(quantity);
  }

  receive() external payable {}
  fallback() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"address[]","name":"recipient","type":"address[]"},{"internalType":"uint256[]","name":"quantity","type":"uint256[]"}],"name":"TeamMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"calculateRoyalty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"}],"internalType":"struct ERC721E.TokenOwnership","name":"","type":"tuple"}],"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":"isPublicSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_add","type":"address"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"},{"internalType":"uint8","name":"_v","type":"uint8"}],"name":"isValidAccessMessage","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintElom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"provenanceHash","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_contractURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"setOwnersExplicit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_newState","type":"bool"}],"name":"setPublicSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint96","name":"_royaltyFeesInBips","type":"uint96"}],"name":"setRoyaltyInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"setSignerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMax","type":"uint256"}],"name":"settokensMaxPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMax","type":"uint256"}],"name":"settokensMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMax","type":"uint256"}],"name":"settokensReserved","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"signerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensMaxPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensMaxPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensReserved","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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"},{"stateMutability":"payable","type":"receive"}]

60806040526002600f5560026010556101a460115561114460125560006013556000601460006101000a81548160ff0219169083151502179055503480156200004757600080fd5b506040518060400160405280600581526020017f456c6f6d730000000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f454c4f4d530000000000000000000000000000000000000000000000000000008152506102ee60405180608001604052806041815260200162005fec60419139620000f1620000e5620001c060201b60201c565b620001c860201b60201c565b8360049080519060200190620001099291906200028c565b508260059080519060200190620001229291906200028c565b5081600060146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff16021790555080600290805190602001906200016c9291906200028c565b5033600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050506001600c81905550620003a1565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200029a906200036b565b90600052602060002090601f016020900481019282620002be57600085556200030a565b82601f10620002d957805160ff19168380011785556200030a565b828001600101855582156200030a579182015b8281111562000309578251825591602001919060010190620002ec565b5b5090506200031991906200031d565b5090565b5b80821115620003385760008160009055506001016200031e565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200038457607f821691505b602082108114156200039b576200039a6200033c565b5b50919050565b615c3b80620003b16000396000f3fe6080604052600436106102815760003560e01c80636352211e1161014f578063b88d4fde116100c1578063dc33e6811161007a578063dc33e681146109b8578063e2273866146109f5578063e8a3d48514610a1e578063e985e9c514610a49578063f2fde38b14610a86578063f5d2a65814610aaf57610288565b8063b88d4fde146108a8578063c1dd27dc146108d1578063c6ab67a31461090e578063c87b56dd14610939578063d7224ba014610976578063db2e21bc146109a157610288565b80639231ab2a116101135780639231ab2a14610788578063938e3d7b146107c557806395d89b41146107ee578063a22cb46514610819578063a2e6961314610842578063b423fe671461087f57610288565b80636352211e146106a157806370a08231146106de578063711e9c0d1461071b578063715018a6146107465780638da5cb5b1461075d57610288565b80631e84c413116101f357806342842e0e116101ac57806342842e0e14610593578063433adb05146105bc578063462f11dc146105e75780634f6ccce71461061057806355f804b31461064d5780635b7633d01461067657610288565b80631e84c41314610470578063208da7801461049b57806323b872dd146104c65780632a55205a146104ef5780632d20fb601461052d5780632f745c591461055657610288565b8063081812fc11610245578063081812fc1461036d57806308f9ab4c146103aa578063095ea7b3146103c65780630d920bfa146103ef57806313faede61461041a57806318160ddd1461044557610288565b806301ffc9a71461028a57806302fa7c47146102c7578063046dc166146102f05780630490ffb31461031957806306fdde031461034257610288565b3661028857005b005b34801561029657600080fd5b506102b160048036038101906102ac9190613bb5565b610ad8565b6040516102be9190613bfd565b60405180910390f35b3480156102d357600080fd5b506102ee60048036038101906102e99190613cba565b610c52565b005b3480156102fc57600080fd5b5061031760048036038101906103129190613cfa565b610d44565b005b34801561032557600080fd5b50610340600480360381019061033b9190613d5d565b610e04565b005b34801561034e57600080fd5b50610357610e8a565b6040516103649190613e23565b60405180910390f35b34801561037957600080fd5b50610394600480360381019061038f9190613d5d565b610f1c565b6040516103a19190613e54565b60405180910390f35b6103c460048036038101906103bf9190613d5d565b610fa1565b005b3480156103d257600080fd5b506103ed60048036038101906103e89190613e6f565b6111b2565b005b3480156103fb57600080fd5b506104046112cb565b6040516104119190613ebe565b60405180910390f35b34801561042657600080fd5b5061042f6112d1565b60405161043c9190613ebe565b60405180910390f35b34801561045157600080fd5b5061045a6112d7565b6040516104679190613ebe565b60405180910390f35b34801561047c57600080fd5b506104856112e1565b6040516104929190613bfd565b60405180910390f35b3480156104a757600080fd5b506104b06112f4565b6040516104bd9190613ebe565b60405180910390f35b3480156104d257600080fd5b506104ed60048036038101906104e89190613ed9565b6112fa565b005b3480156104fb57600080fd5b5061051660048036038101906105119190613f2c565b61130a565b604051610524929190613f6c565b60405180910390f35b34801561053957600080fd5b50610554600480360381019061054f9190613d5d565b611344565b005b34801561056257600080fd5b5061057d60048036038101906105789190613e6f565b611422565b60405161058a9190613ebe565b60405180910390f35b34801561059f57600080fd5b506105ba60048036038101906105b59190613ed9565b611624565b005b3480156105c857600080fd5b506105d1611644565b6040516105de9190613ebe565b60405180910390f35b3480156105f357600080fd5b5061060e60048036038101906106099190614050565b61164a565b005b34801561061c57600080fd5b5061063760048036038101906106329190613d5d565b6118a9565b6040516106449190613ebe565b60405180910390f35b34801561065957600080fd5b50610674600480360381019061066f9190614127565b6118fc565b005b34801561068257600080fd5b5061068b61198e565b6040516106989190613e54565b60405180910390f35b3480156106ad57600080fd5b506106c860048036038101906106c39190613d5d565b6119b4565b6040516106d59190613e54565b60405180910390f35b3480156106ea57600080fd5b5061070560048036038101906107009190613cfa565b6119ca565b6040516107129190613ebe565b60405180910390f35b34801561072757600080fd5b50610730611ab3565b60405161073d9190613ebe565b60405180910390f35b34801561075257600080fd5b5061075b611ab9565b005b34801561076957600080fd5b50610772611b41565b60405161077f9190613e54565b60405180910390f35b34801561079457600080fd5b506107af60048036038101906107aa9190613d5d565b611b6a565b6040516107bc91906141d5565b60405180910390f35b3480156107d157600080fd5b506107ec60048036038101906107e79190614127565b611b82565b005b3480156107fa57600080fd5b50610803611c14565b6040516108109190613e23565b60405180910390f35b34801561082557600080fd5b50610840600480360381019061083b919061421c565b611ca6565b005b34801561084e57600080fd5b5061086960048036038101906108649190613d5d565b611e27565b6040516108769190613ebe565b60405180910390f35b34801561088b57600080fd5b506108a660048036038101906108a1919061425c565b611e70565b005b3480156108b457600080fd5b506108cf60048036038101906108ca91906143b9565b611f09565b005b3480156108dd57600080fd5b506108f860048036038101906108f391906144ab565b611f65565b6040516109059190613bfd565b60405180910390f35b34801561091a57600080fd5b50610923612144565b6040516109309190613e23565b60405180910390f35b34801561094557600080fd5b50610960600480360381019061095b9190613d5d565b6121d2565b60405161096d9190613e23565b60405180910390f35b34801561098257600080fd5b5061098b612279565b6040516109989190613ebe565b60405180910390f35b3480156109ad57600080fd5b506109b661227f565b005b3480156109c457600080fd5b506109df60048036038101906109da9190613cfa565b6123c4565b6040516109ec9190613ebe565b60405180910390f35b348015610a0157600080fd5b50610a1c6004803603810190610a179190613d5d565b6123d6565b005b348015610a2a57600080fd5b50610a3361245c565b604051610a409190613e23565b60405180910390f35b348015610a5557600080fd5b50610a706004803603810190610a6b9190614512565b6124ea565b604051610a7d9190613bfd565b60405180910390f35b348015610a9257600080fd5b50610aad6004803603810190610aa89190613cfa565b61257e565b005b348015610abb57600080fd5b50610ad66004803603810190610ad19190613d5d565b612676565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ba357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610c0b57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610c3b5750632a55205a60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610c4b5750610c4a826126fc565b5b9050919050565b610c5a612766565b73ffffffffffffffffffffffffffffffffffffffff16610c78611b41565b73ffffffffffffffffffffffffffffffffffffffff1614610cce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc59061459e565b60405180910390fd5b81600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600060146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055505050565b610d4c612766565b73ffffffffffffffffffffffffffffffffffffffff16610d6a611b41565b73ffffffffffffffffffffffffffffffffffffffff1614610dc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db79061459e565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610e0c612766565b73ffffffffffffffffffffffffffffffffffffffff16610e2a611b41565b73ffffffffffffffffffffffffffffffffffffffff1614610e80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e779061459e565b60405180910390fd5b8060118190555050565b606060048054610e99906145ed565b80601f0160208091040260200160405190810160405280929190818152602001828054610ec5906145ed565b8015610f125780601f10610ee757610100808354040283529160200191610f12565b820191906000526020600020905b815481529060010190602001808311610ef557829003601f168201915b5050505050905090565b6000610f278261276e565b610f66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5d90614691565b60405180910390fd5b6008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6002600c541415610fe7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fde906146fd565b60405180910390fd5b6002600c8190555060008111611032576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102990614769565b60405180910390fd5b601460009054906101000a900460ff16611081576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611078906147d5565b60405180910390fd5b60105461108d336123c4565b826110989190614824565b11156110d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d0906148c6565b60405180910390fd5b601254601154826110e86112d7565b6110f29190614824565b6110fc9190614824565b111561113d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113490614932565b60405180910390fd5b8060135461114b9190614952565b34101561118d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611184906149f8565b60405180910390fd5b6111a733826040518060200160405280600081525061277c565b6001600c8190555050565b60006111bd826119b4565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561122e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122590614a8a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661124d612766565b73ffffffffffffffffffffffffffffffffffffffff16148061127c575061127b81611276612766565b6124ea565b5b6112bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b290614b1c565b60405180910390fd5b6112c6838383612b59565b505050565b600f5481565b60135481565b6000600354905090565b601460009054906101000a900460ff1681565b60125481565b611305838383612c0b565b505050565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661133984611e27565b915091509250929050565b61134c612766565b73ffffffffffffffffffffffffffffffffffffffff1661136a611b41565b73ffffffffffffffffffffffffffffffffffffffff16146113c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b79061459e565b60405180910390fd5b6002600c541415611406576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fd906146fd565b60405180910390fd5b6002600c8190555061141781613154565b6001600c8190555050565b600061142d836119ca565b821061146e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146590614bae565b60405180910390fd5b60006114786112d7565b90506000806000905060005b838110156115e2576000600660008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461157657806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156115ce57868414156115bf57819550505050505061161e565b83806115ca90614bce565b9450505b5080806115da90614bce565b915050611484565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161590614c89565b60405180910390fd5b92915050565b61163f83838360405180602001604052806000815250611f09565b505050565b60115481565b611652612766565b73ffffffffffffffffffffffffffffffffffffffff16611670611b41565b73ffffffffffffffffffffffffffffffffffffffff16146116c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bd9061459e565b60405180910390fd5b81819050848490501461170e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170590614d1b565b60405180910390fd5b6000805b83839050811015611757578383828181106117305761172f614d3b565b5b90506020020135826117429190614824565b9150808061174f90614bce565b915050611712565b5060115481111561179d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179490614ddc565b60405180910390fd5b6012546117a86112d7565b826117b39190614824565b11156117f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117eb90614932565b60405180910390fd5b60005b858590508110156118a15783838281811061181557611814614d3b565b5b905060200201356011600082825461182d9190614dfc565b9250508190555061188e86868381811061184a57611849614d3b565b5b905060200201602081019061185f9190613cfa565b85858481811061187257611871614d3b565b5b905060200201356040518060200160405280600081525061277c565b808061189990614bce565b9150506117f7565b505050505050565b60006118b36112d7565b82106118f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118eb90614ea2565b60405180910390fd5b819050919050565b611904612766565b73ffffffffffffffffffffffffffffffffffffffff16611922611b41565b73ffffffffffffffffffffffffffffffffffffffff1614611978576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196f9061459e565b60405180910390fd5b8181600e9190611989929190613a6c565b505050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006119bf826133ba565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3290614f34565b60405180910390fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b60105481565b611ac1612766565b73ffffffffffffffffffffffffffffffffffffffff16611adf611b41565b73ffffffffffffffffffffffffffffffffffffffff1614611b35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2c9061459e565b60405180910390fd5b611b3f6000613515565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611b72613af2565b611b7b826133ba565b9050919050565b611b8a612766565b73ffffffffffffffffffffffffffffffffffffffff16611ba8611b41565b73ffffffffffffffffffffffffffffffffffffffff1614611bfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf59061459e565b60405180910390fd5b818160029190611c0f929190613a6c565b505050565b606060058054611c23906145ed565b80601f0160208091040260200160405190810160405280929190818152602001828054611c4f906145ed565b8015611c9c5780601f10611c7157610100808354040283529160200191611c9c565b820191906000526020600020905b815481529060010190602001808311611c7f57829003601f168201915b5050505050905090565b611cae612766565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1390614fa0565b60405180910390fd5b8060096000611d29612766565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611dd6612766565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e1b9190613bfd565b60405180910390a35050565b60008060149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff1661271083611e5f9190614fef565b611e699190614952565b9050919050565b611e78612766565b73ffffffffffffffffffffffffffffffffffffffff16611e96611b41565b73ffffffffffffffffffffffffffffffffffffffff1614611eec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee39061459e565b60405180910390fd5b80601460006101000a81548160ff02191690831515021790555050565b611f14848484612c0b565b611f20848484846135d9565b611f5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5690615092565b60405180910390fd5b50505050565b600080600286604051602001611f7c9291906150f7565b604051602081830303815290604052805190602001209050600060018285888860405160008152602001604052604051611fb9949392919061513e565b6020604051602081039080840390855afa158015611fdb573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612057576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204e906151cf565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146120e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120de9061523b565b60405180910390fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161492505050949350505050565b600d8054612151906145ed565b80601f016020809104026020016040519081016040528092919081815260200182805461217d906145ed565b80156121ca5780601f1061219f576101008083540402835291602001916121ca565b820191906000526020600020905b8154815290600101906020018083116121ad57829003601f168201915b505050505081565b60606121dd8261276e565b61221c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612213906152cd565b60405180910390fd5b6000612226613761565b905060008151116122465760405180602001604052806000815250612271565b80612250846137f3565b604051602001612261929190615329565b6040516020818303038152906040525b915050919050565b600a5481565b612287612766565b73ffffffffffffffffffffffffffffffffffffffff166122a5611b41565b73ffffffffffffffffffffffffffffffffffffffff16146122fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f29061459e565b60405180910390fd5b6000732a03b32c24c40b435c65933ee574424aa86b92ae905060008173ffffffffffffffffffffffffffffffffffffffff164760405161233a9061537e565b60006040518083038185875af1925050503d8060008114612377576040519150601f19603f3d011682016040523d82523d6000602084013e61237c565b606091505b50509050806123c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b7906153df565b60405180910390fd5b5050565b60006123cf82613954565b9050919050565b6123de612766565b73ffffffffffffffffffffffffffffffffffffffff166123fc611b41565b73ffffffffffffffffffffffffffffffffffffffff1614612452576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124499061459e565b60405180910390fd5b8060128190555050565b60028054612469906145ed565b80601f0160208091040260200160405190810160405280929190818152602001828054612495906145ed565b80156124e25780601f106124b7576101008083540402835291602001916124e2565b820191906000526020600020905b8154815290600101906020018083116124c557829003601f168201915b505050505081565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612586612766565b73ffffffffffffffffffffffffffffffffffffffff166125a4611b41565b73ffffffffffffffffffffffffffffffffffffffff16146125fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125f19061459e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561266a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266190615471565b60405180910390fd5b61267381613515565b50565b61267e612766565b73ffffffffffffffffffffffffffffffffffffffff1661269c611b41565b73ffffffffffffffffffffffffffffffffffffffff16146126f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e99061459e565b60405180910390fd5b8060108190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600060035482109050919050565b60006003549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156127f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ea90615503565b60405180910390fd5b6127fc8161276e565b1561283c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128339061556f565b60405180910390fd5b6000831161287f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287690615601565b60405180910390fd5b61288c6000858386613a3d565b82600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166128f9919061563d565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555082600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff1661299c919061563d565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836006600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426006600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b84811015612b3d57818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612add60008784876135d9565b612b1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1390615092565b60405180910390fd5b8180612b2790614bce565b9250508080612b3590614bce565b915050612a6c565b5080600381905550612b526000868487613a43565b5050505050565b826008600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000612c16826133ba565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16612c3d612766565b73ffffffffffffffffffffffffffffffffffffffff161480612c995750612c62612766565b73ffffffffffffffffffffffffffffffffffffffff16612c8184610f1c565b73ffffffffffffffffffffffffffffffffffffffff16145b80612cb55750612cb48260000151612caf612766565b6124ea565b5b905080612cf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cee906156f5565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612d69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d6090615787565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612dd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dd090615819565b60405180910390fd5b612de68585856001613a3d565b612df66000848460000151612b59565b6001600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836006600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426006600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184612fcd9190614824565b9050600073ffffffffffffffffffffffffffffffffffffffff166006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156130e4576130438161276e565b156130e35782600001516006600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516006600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461314c8686866001613a43565b505050505050565b60008111613197576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161318e906158ab565b60405180910390fd5b6000600354116131dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131d390615917565b60405180910390fd5b600354600a5410613222576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161321990615983565b60405180910390fd5b6000600a5490506000600183836132399190614824565b6132439190614dfc565b905060016003546132549190614dfc565b81111561326d57600160035461326a9190614dfc565b90505b60008290505b8181116133a157600073ffffffffffffffffffffffffffffffffffffffff166006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561338e5760006132f0826133ba565b905080600001516006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080602001516006600084815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505b808061339990614bce565b915050613273565b506001816133af9190614824565b600a81905550505050565b6133c2613af2565b6133cb8261276e565b61340a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161340190615a15565b60405180910390fd5b60008290505b6000600660008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146134fc578092505050613510565b50808061350890615a35565b915050613410565b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006135fa8473ffffffffffffffffffffffffffffffffffffffff16613a49565b15613754578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613623612766565b8786866040518563ffffffff1660e01b81526004016136459493929190615ab4565b6020604051808303816000875af192505050801561368157506040513d601f19601f8201168201806040525081019061367e9190615b15565b60015b613704573d80600081146136b1576040519150601f19603f3d011682016040523d82523d6000602084013e6136b6565b606091505b506000815114156136fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136f390615092565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613759565b600190505b949350505050565b6060600e8054613770906145ed565b80601f016020809104026020016040519081016040528092919081815260200182805461379c906145ed565b80156137e95780601f106137be576101008083540402835291602001916137e9565b820191906000526020600020905b8154815290600101906020018083116137cc57829003601f168201915b5050505050905090565b6060600082141561383b576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061394f565b600082905060005b6000821461386d57808061385690614bce565b915050600a826138669190614fef565b9150613843565b60008167ffffffffffffffff8111156138895761388861428e565b5b6040519080825280601f01601f1916602001820160405280156138bb5781602001600182028036833780820191505090505b5090505b60008514613948576001826138d49190614dfc565b9150600a856138e39190615b42565b60306138ef9190614824565b60f81b81838151811061390557613904614d3b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856139419190614fef565b94506138bf565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156139c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139bc90615be5565b60405180910390fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b50505050565b50505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054613a78906145ed565b90600052602060002090601f016020900481019282613a9a5760008555613ae1565b82601f10613ab357803560ff1916838001178555613ae1565b82800160010185558215613ae1579182015b82811115613ae0578235825591602001919060010190613ac5565b5b509050613aee9190613b2c565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115613b45576000816000905550600101613b2d565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613b9281613b5d565b8114613b9d57600080fd5b50565b600081359050613baf81613b89565b92915050565b600060208284031215613bcb57613bca613b53565b5b6000613bd984828501613ba0565b91505092915050565b60008115159050919050565b613bf781613be2565b82525050565b6000602082019050613c126000830184613bee565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613c4382613c18565b9050919050565b613c5381613c38565b8114613c5e57600080fd5b50565b600081359050613c7081613c4a565b92915050565b60006bffffffffffffffffffffffff82169050919050565b613c9781613c76565b8114613ca257600080fd5b50565b600081359050613cb481613c8e565b92915050565b60008060408385031215613cd157613cd0613b53565b5b6000613cdf85828601613c61565b9250506020613cf085828601613ca5565b9150509250929050565b600060208284031215613d1057613d0f613b53565b5b6000613d1e84828501613c61565b91505092915050565b6000819050919050565b613d3a81613d27565b8114613d4557600080fd5b50565b600081359050613d5781613d31565b92915050565b600060208284031215613d7357613d72613b53565b5b6000613d8184828501613d48565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613dc4578082015181840152602081019050613da9565b83811115613dd3576000848401525b50505050565b6000601f19601f8301169050919050565b6000613df582613d8a565b613dff8185613d95565b9350613e0f818560208601613da6565b613e1881613dd9565b840191505092915050565b60006020820190508181036000830152613e3d8184613dea565b905092915050565b613e4e81613c38565b82525050565b6000602082019050613e696000830184613e45565b92915050565b60008060408385031215613e8657613e85613b53565b5b6000613e9485828601613c61565b9250506020613ea585828601613d48565b9150509250929050565b613eb881613d27565b82525050565b6000602082019050613ed36000830184613eaf565b92915050565b600080600060608486031215613ef257613ef1613b53565b5b6000613f0086828701613c61565b9350506020613f1186828701613c61565b9250506040613f2286828701613d48565b9150509250925092565b60008060408385031215613f4357613f42613b53565b5b6000613f5185828601613d48565b9250506020613f6285828601613d48565b9150509250929050565b6000604082019050613f816000830185613e45565b613f8e6020830184613eaf565b9392505050565b600080fd5b600080fd5b600080fd5b60008083601f840112613fba57613fb9613f95565b5b8235905067ffffffffffffffff811115613fd757613fd6613f9a565b5b602083019150836020820283011115613ff357613ff2613f9f565b5b9250929050565b60008083601f8401126140105761400f613f95565b5b8235905067ffffffffffffffff81111561402d5761402c613f9a565b5b60208301915083602082028301111561404957614048613f9f565b5b9250929050565b6000806000806040858703121561406a57614069613b53565b5b600085013567ffffffffffffffff81111561408857614087613b58565b5b61409487828801613fa4565b9450945050602085013567ffffffffffffffff8111156140b7576140b6613b58565b5b6140c387828801613ffa565b925092505092959194509250565b60008083601f8401126140e7576140e6613f95565b5b8235905067ffffffffffffffff81111561410457614103613f9a565b5b6020830191508360018202830111156141205761411f613f9f565b5b9250929050565b6000806020838503121561413e5761413d613b53565b5b600083013567ffffffffffffffff81111561415c5761415b613b58565b5b614168858286016140d1565b92509250509250929050565b61417d81613c38565b82525050565b600067ffffffffffffffff82169050919050565b6141a081614183565b82525050565b6040820160008201516141bc6000850182614174565b5060208201516141cf6020850182614197565b50505050565b60006040820190506141ea60008301846141a6565b92915050565b6141f981613be2565b811461420457600080fd5b50565b600081359050614216816141f0565b92915050565b6000806040838503121561423357614232613b53565b5b600061424185828601613c61565b925050602061425285828601614207565b9150509250929050565b60006020828403121561427257614271613b53565b5b600061428084828501614207565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6142c682613dd9565b810181811067ffffffffffffffff821117156142e5576142e461428e565b5b80604052505050565b60006142f8613b49565b905061430482826142bd565b919050565b600067ffffffffffffffff8211156143245761432361428e565b5b61432d82613dd9565b9050602081019050919050565b82818337600083830152505050565b600061435c61435784614309565b6142ee565b90508281526020810184848401111561437857614377614289565b5b61438384828561433a565b509392505050565b600082601f8301126143a05761439f613f95565b5b81356143b0848260208601614349565b91505092915050565b600080600080608085870312156143d3576143d2613b53565b5b60006143e187828801613c61565b94505060206143f287828801613c61565b935050604061440387828801613d48565b925050606085013567ffffffffffffffff81111561442457614423613b58565b5b6144308782880161438b565b91505092959194509250565b6000819050919050565b61444f8161443c565b811461445a57600080fd5b50565b60008135905061446c81614446565b92915050565b600060ff82169050919050565b61448881614472565b811461449357600080fd5b50565b6000813590506144a58161447f565b92915050565b600080600080608085870312156144c5576144c4613b53565b5b60006144d387828801613c61565b94505060206144e48782880161445d565b93505060406144f58782880161445d565b925050606061450687828801614496565b91505092959194509250565b6000806040838503121561452957614528613b53565b5b600061453785828601613c61565b925050602061454885828601613c61565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614588602083613d95565b915061459382614552565b602082019050919050565b600060208201905081810360008301526145b78161457b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061460557607f821691505b60208210811415614619576146186145be565b5b50919050565b7f455243373231453a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b600061467b602d83613d95565b91506146868261461f565b604082019050919050565b600060208201905081810360008301526146aa8161466e565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006146e7601f83613d95565b91506146f2826146b1565b602082019050919050565b60006020820190508181036000830152614716816146da565b9050919050565b7f5155414e544954592053484f554c44204245204d4f5245205448414e20300000600082015250565b6000614753601e83613d95565b915061475e8261471d565b602082019050919050565b6000602082019050818103600083015261478281614746565b9050919050565b7f5055424c49432053414c45204e4f542041435449564500000000000000000000600082015250565b60006147bf601683613d95565b91506147ca82614789565b602082019050919050565b600060208201905081810360008301526147ee816147b2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061482f82613d27565b915061483a83613d27565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561486f5761486e6147f5565b5b828201905092915050565b7f455843454544494e47204d415820544f4b454e53205045522057414c4c455400600082015250565b60006148b0601f83613d95565b91506148bb8261487a565b602082019050919050565b600060208201905081810360008301526148df816148a3565b9050919050565b7f455843454544494e47204d415820535550504c59000000000000000000000000600082015250565b600061491c601483613d95565b9150614927826148e6565b602082019050919050565b6000602082019050818103600083015261494b8161490f565b9050919050565b600061495d82613d27565b915061496883613d27565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156149a1576149a06147f5565b5b828202905092915050565b7f494e53554646494349454e542045544800000000000000000000000000000000600082015250565b60006149e2601083613d95565b91506149ed826149ac565b602082019050919050565b60006020820190508181036000830152614a11816149d5565b9050919050565b7f455243373231453a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b6000614a74602283613d95565b9150614a7f82614a18565b604082019050919050565b60006020820190508181036000830152614aa381614a67565b9050919050565b7f455243373231453a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b6000614b06603983613d95565b9150614b1182614aaa565b604082019050919050565b60006020820190508181036000830152614b3581614af9565b9050919050565b7f455243373231453a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b6000614b98602283613d95565b9150614ba382614b3c565b604082019050919050565b60006020820190508181036000830152614bc781614b8b565b9050919050565b6000614bd982613d27565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614c0c57614c0b6147f5565b5b600182019050919050565b7f455243373231453a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b6000614c73602e83613d95565b9150614c7e82614c17565b604082019050919050565b60006020820190508181036000830152614ca281614c66565b9050919050565b7f524543495049454e5420414e44205155414e54495459204e4f5420455155414c60008201527f204c454e47544800000000000000000000000000000000000000000000000000602082015250565b6000614d05602783613d95565b9150614d1082614ca9565b604082019050919050565b60006020820190508181036000830152614d3481614cf8565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f455843454544494e472052454d41494e494e472052455345525645442053555060008201527f504c590000000000000000000000000000000000000000000000000000000000602082015250565b6000614dc6602383613d95565b9150614dd182614d6a565b604082019050919050565b60006020820190508181036000830152614df581614db9565b9050919050565b6000614e0782613d27565b9150614e1283613d27565b925082821015614e2557614e246147f5565b5b828203905092915050565b7f455243373231453a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b6000614e8c602383613d95565b9150614e9782614e30565b604082019050919050565b60006020820190508181036000830152614ebb81614e7f565b9050919050565b7f455243373231453a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000614f1e602b83613d95565b9150614f2982614ec2565b604082019050919050565b60006020820190508181036000830152614f4d81614f11565b9050919050565b7f455243373231453a20617070726f766520746f2063616c6c6572000000000000600082015250565b6000614f8a601a83613d95565b9150614f9582614f54565b602082019050919050565b60006020820190508181036000830152614fb981614f7d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614ffa82613d27565b915061500583613d27565b92508261501557615014614fc0565b5b828204905092915050565b7f455243373231453a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b600061507c603383613d95565b915061508782615020565b604082019050919050565b600060208201905081810360008301526150ab8161506f565b9050919050565b6000819050919050565b6000819050919050565b60006150e16150dc6150d7846150b2565b6150bc565b614472565b9050919050565b6150f1816150c6565b82525050565b600060408201905061510c60008301856150e8565b6151196020830184613e45565b9392505050565b6151298161443c565b82525050565b61513881614472565b82525050565b60006080820190506151536000830187615120565b615160602083018661512f565b61516d6040830185615120565b61517a6060830184615120565b95945050505050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b60006151b9601883613d95565b91506151c482615183565b602082019050919050565b600060208201905081810360008301526151e8816151ac565b9050919050565b7f5369676e617475726520646f6573206e6f74206d617463680000000000000000600082015250565b6000615225601883613d95565b9150615230826151ef565b602082019050919050565b6000602082019050818103600083015261525481615218565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006152b7602f83613d95565b91506152c28261525b565b604082019050919050565b600060208201905081810360008301526152e6816152aa565b9050919050565b600081905092915050565b600061530382613d8a565b61530d81856152ed565b935061531d818560208601613da6565b80840191505092915050565b600061533582856152f8565b915061534182846152f8565b91508190509392505050565b600081905092915050565b50565b600061536860008361534d565b915061537382615358565b600082019050919050565b60006153898261535b565b9150819050919050565b7f5472616e73616374696f6e20556e7375636365737366756c0000000000000000600082015250565b60006153c9601883613d95565b91506153d482615393565b602082019050919050565b600060208201905081810360008301526153f8816153bc565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061545b602683613d95565b9150615466826153ff565b604082019050919050565b6000602082019050818103600083015261548a8161544e565b9050919050565b7f455243373231453a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006154ed602183613d95565b91506154f882615491565b604082019050919050565b6000602082019050818103600083015261551c816154e0565b9050919050565b7f455243373231453a20746f6b656e20616c7265616479206d696e746564000000600082015250565b6000615559601d83613d95565b915061556482615523565b602082019050919050565b600060208201905081810360008301526155888161554c565b9050919050565b7f455243373231453a207175616e74697479206d7573742062652067726561746560008201527f7220300000000000000000000000000000000000000000000000000000000000602082015250565b60006155eb602383613d95565b91506155f68261558f565b604082019050919050565b6000602082019050818103600083015261561a816155de565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600061564882615621565b915061565383615621565b9250826fffffffffffffffffffffffffffffffff03821115615678576156776147f5565b5b828201905092915050565b7f455243373231453a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b60006156df603283613d95565b91506156ea82615683565b604082019050919050565b6000602082019050818103600083015261570e816156d2565b9050919050565b7f455243373231453a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b6000615771602683613d95565b915061577c82615715565b604082019050919050565b600060208201905081810360008301526157a081615764565b9050919050565b7f455243373231453a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000615803602583613d95565b915061580e826157a7565b604082019050919050565b60006020820190508181036000830152615832816157f6565b9050919050565b7f7175616e74697479206d7573742062652067726561746572207468616e207a6560008201527f726f000000000000000000000000000000000000000000000000000000000000602082015250565b6000615895602283613d95565b91506158a082615839565b604082019050919050565b600060208201905081810360008301526158c481615888565b9050919050565b7f6e6f20746f6b656e73206d696e74656420796574000000000000000000000000600082015250565b6000615901601483613d95565b915061590c826158cb565b602082019050919050565b60006020820190508181036000830152615930816158f4565b9050919050565b7f616c6c206f776e657273686970732068617665206265656e2073657400000000600082015250565b600061596d601c83613d95565b915061597882615937565b602082019050919050565b6000602082019050818103600083015261599c81615960565b9050919050565b7f455243373231453a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b60006159ff602a83613d95565b9150615a0a826159a3565b604082019050919050565b60006020820190508181036000830152615a2e816159f2565b9050919050565b6000615a4082613d27565b91506000821415615a5457615a536147f5565b5b600182039050919050565b600081519050919050565b600082825260208201905092915050565b6000615a8682615a5f565b615a908185615a6a565b9350615aa0818560208601613da6565b615aa981613dd9565b840191505092915050565b6000608082019050615ac96000830187613e45565b615ad66020830186613e45565b615ae36040830185613eaf565b8181036060830152615af58184615a7b565b905095945050505050565b600081519050615b0f81613b89565b92915050565b600060208284031215615b2b57615b2a613b53565b5b6000615b3984828501615b00565b91505092915050565b6000615b4d82613d27565b9150615b5883613d27565b925082615b6857615b67614fc0565b5b828206905092915050565b7f455243373231453a206e756d626572206d696e74656420717565727920666f7260008201527f20746865207a65726f2061646472657373000000000000000000000000000000602082015250565b6000615bcf603183613d95565b9150615bda82615b73565b604082019050919050565b60006020820190508181036000830152615bfe81615bc2565b905091905056fea2646970667358221220268a25d8423d1a7c7fe6fd2f8c4e5850a3c01f159a5ff04b77a0293dceb56e5a64736f6c634300080c003368747470733a2f2f656c6f6d736d657461646174612e73332e75732d656173742d322e616d617a6f6e6177732e636f6d2f636f6e74726163745552492e6a736f6e

Deployed Bytecode

0x6080604052600436106102815760003560e01c80636352211e1161014f578063b88d4fde116100c1578063dc33e6811161007a578063dc33e681146109b8578063e2273866146109f5578063e8a3d48514610a1e578063e985e9c514610a49578063f2fde38b14610a86578063f5d2a65814610aaf57610288565b8063b88d4fde146108a8578063c1dd27dc146108d1578063c6ab67a31461090e578063c87b56dd14610939578063d7224ba014610976578063db2e21bc146109a157610288565b80639231ab2a116101135780639231ab2a14610788578063938e3d7b146107c557806395d89b41146107ee578063a22cb46514610819578063a2e6961314610842578063b423fe671461087f57610288565b80636352211e146106a157806370a08231146106de578063711e9c0d1461071b578063715018a6146107465780638da5cb5b1461075d57610288565b80631e84c413116101f357806342842e0e116101ac57806342842e0e14610593578063433adb05146105bc578063462f11dc146105e75780634f6ccce71461061057806355f804b31461064d5780635b7633d01461067657610288565b80631e84c41314610470578063208da7801461049b57806323b872dd146104c65780632a55205a146104ef5780632d20fb601461052d5780632f745c591461055657610288565b8063081812fc11610245578063081812fc1461036d57806308f9ab4c146103aa578063095ea7b3146103c65780630d920bfa146103ef57806313faede61461041a57806318160ddd1461044557610288565b806301ffc9a71461028a57806302fa7c47146102c7578063046dc166146102f05780630490ffb31461031957806306fdde031461034257610288565b3661028857005b005b34801561029657600080fd5b506102b160048036038101906102ac9190613bb5565b610ad8565b6040516102be9190613bfd565b60405180910390f35b3480156102d357600080fd5b506102ee60048036038101906102e99190613cba565b610c52565b005b3480156102fc57600080fd5b5061031760048036038101906103129190613cfa565b610d44565b005b34801561032557600080fd5b50610340600480360381019061033b9190613d5d565b610e04565b005b34801561034e57600080fd5b50610357610e8a565b6040516103649190613e23565b60405180910390f35b34801561037957600080fd5b50610394600480360381019061038f9190613d5d565b610f1c565b6040516103a19190613e54565b60405180910390f35b6103c460048036038101906103bf9190613d5d565b610fa1565b005b3480156103d257600080fd5b506103ed60048036038101906103e89190613e6f565b6111b2565b005b3480156103fb57600080fd5b506104046112cb565b6040516104119190613ebe565b60405180910390f35b34801561042657600080fd5b5061042f6112d1565b60405161043c9190613ebe565b60405180910390f35b34801561045157600080fd5b5061045a6112d7565b6040516104679190613ebe565b60405180910390f35b34801561047c57600080fd5b506104856112e1565b6040516104929190613bfd565b60405180910390f35b3480156104a757600080fd5b506104b06112f4565b6040516104bd9190613ebe565b60405180910390f35b3480156104d257600080fd5b506104ed60048036038101906104e89190613ed9565b6112fa565b005b3480156104fb57600080fd5b5061051660048036038101906105119190613f2c565b61130a565b604051610524929190613f6c565b60405180910390f35b34801561053957600080fd5b50610554600480360381019061054f9190613d5d565b611344565b005b34801561056257600080fd5b5061057d60048036038101906105789190613e6f565b611422565b60405161058a9190613ebe565b60405180910390f35b34801561059f57600080fd5b506105ba60048036038101906105b59190613ed9565b611624565b005b3480156105c857600080fd5b506105d1611644565b6040516105de9190613ebe565b60405180910390f35b3480156105f357600080fd5b5061060e60048036038101906106099190614050565b61164a565b005b34801561061c57600080fd5b5061063760048036038101906106329190613d5d565b6118a9565b6040516106449190613ebe565b60405180910390f35b34801561065957600080fd5b50610674600480360381019061066f9190614127565b6118fc565b005b34801561068257600080fd5b5061068b61198e565b6040516106989190613e54565b60405180910390f35b3480156106ad57600080fd5b506106c860048036038101906106c39190613d5d565b6119b4565b6040516106d59190613e54565b60405180910390f35b3480156106ea57600080fd5b5061070560048036038101906107009190613cfa565b6119ca565b6040516107129190613ebe565b60405180910390f35b34801561072757600080fd5b50610730611ab3565b60405161073d9190613ebe565b60405180910390f35b34801561075257600080fd5b5061075b611ab9565b005b34801561076957600080fd5b50610772611b41565b60405161077f9190613e54565b60405180910390f35b34801561079457600080fd5b506107af60048036038101906107aa9190613d5d565b611b6a565b6040516107bc91906141d5565b60405180910390f35b3480156107d157600080fd5b506107ec60048036038101906107e79190614127565b611b82565b005b3480156107fa57600080fd5b50610803611c14565b6040516108109190613e23565b60405180910390f35b34801561082557600080fd5b50610840600480360381019061083b919061421c565b611ca6565b005b34801561084e57600080fd5b5061086960048036038101906108649190613d5d565b611e27565b6040516108769190613ebe565b60405180910390f35b34801561088b57600080fd5b506108a660048036038101906108a1919061425c565b611e70565b005b3480156108b457600080fd5b506108cf60048036038101906108ca91906143b9565b611f09565b005b3480156108dd57600080fd5b506108f860048036038101906108f391906144ab565b611f65565b6040516109059190613bfd565b60405180910390f35b34801561091a57600080fd5b50610923612144565b6040516109309190613e23565b60405180910390f35b34801561094557600080fd5b50610960600480360381019061095b9190613d5d565b6121d2565b60405161096d9190613e23565b60405180910390f35b34801561098257600080fd5b5061098b612279565b6040516109989190613ebe565b60405180910390f35b3480156109ad57600080fd5b506109b661227f565b005b3480156109c457600080fd5b506109df60048036038101906109da9190613cfa565b6123c4565b6040516109ec9190613ebe565b60405180910390f35b348015610a0157600080fd5b50610a1c6004803603810190610a179190613d5d565b6123d6565b005b348015610a2a57600080fd5b50610a3361245c565b604051610a409190613e23565b60405180910390f35b348015610a5557600080fd5b50610a706004803603810190610a6b9190614512565b6124ea565b604051610a7d9190613bfd565b60405180910390f35b348015610a9257600080fd5b50610aad6004803603810190610aa89190613cfa565b61257e565b005b348015610abb57600080fd5b50610ad66004803603810190610ad19190613d5d565b612676565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ba357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610c0b57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610c3b5750632a55205a60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610c4b5750610c4a826126fc565b5b9050919050565b610c5a612766565b73ffffffffffffffffffffffffffffffffffffffff16610c78611b41565b73ffffffffffffffffffffffffffffffffffffffff1614610cce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc59061459e565b60405180910390fd5b81600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600060146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055505050565b610d4c612766565b73ffffffffffffffffffffffffffffffffffffffff16610d6a611b41565b73ffffffffffffffffffffffffffffffffffffffff1614610dc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db79061459e565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610e0c612766565b73ffffffffffffffffffffffffffffffffffffffff16610e2a611b41565b73ffffffffffffffffffffffffffffffffffffffff1614610e80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e779061459e565b60405180910390fd5b8060118190555050565b606060048054610e99906145ed565b80601f0160208091040260200160405190810160405280929190818152602001828054610ec5906145ed565b8015610f125780601f10610ee757610100808354040283529160200191610f12565b820191906000526020600020905b815481529060010190602001808311610ef557829003601f168201915b5050505050905090565b6000610f278261276e565b610f66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5d90614691565b60405180910390fd5b6008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6002600c541415610fe7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fde906146fd565b60405180910390fd5b6002600c8190555060008111611032576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102990614769565b60405180910390fd5b601460009054906101000a900460ff16611081576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611078906147d5565b60405180910390fd5b60105461108d336123c4565b826110989190614824565b11156110d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d0906148c6565b60405180910390fd5b601254601154826110e86112d7565b6110f29190614824565b6110fc9190614824565b111561113d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113490614932565b60405180910390fd5b8060135461114b9190614952565b34101561118d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611184906149f8565b60405180910390fd5b6111a733826040518060200160405280600081525061277c565b6001600c8190555050565b60006111bd826119b4565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561122e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122590614a8a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661124d612766565b73ffffffffffffffffffffffffffffffffffffffff16148061127c575061127b81611276612766565b6124ea565b5b6112bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b290614b1c565b60405180910390fd5b6112c6838383612b59565b505050565b600f5481565b60135481565b6000600354905090565b601460009054906101000a900460ff1681565b60125481565b611305838383612c0b565b505050565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661133984611e27565b915091509250929050565b61134c612766565b73ffffffffffffffffffffffffffffffffffffffff1661136a611b41565b73ffffffffffffffffffffffffffffffffffffffff16146113c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b79061459e565b60405180910390fd5b6002600c541415611406576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fd906146fd565b60405180910390fd5b6002600c8190555061141781613154565b6001600c8190555050565b600061142d836119ca565b821061146e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146590614bae565b60405180910390fd5b60006114786112d7565b90506000806000905060005b838110156115e2576000600660008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461157657806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156115ce57868414156115bf57819550505050505061161e565b83806115ca90614bce565b9450505b5080806115da90614bce565b915050611484565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161590614c89565b60405180910390fd5b92915050565b61163f83838360405180602001604052806000815250611f09565b505050565b60115481565b611652612766565b73ffffffffffffffffffffffffffffffffffffffff16611670611b41565b73ffffffffffffffffffffffffffffffffffffffff16146116c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bd9061459e565b60405180910390fd5b81819050848490501461170e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170590614d1b565b60405180910390fd5b6000805b83839050811015611757578383828181106117305761172f614d3b565b5b90506020020135826117429190614824565b9150808061174f90614bce565b915050611712565b5060115481111561179d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179490614ddc565b60405180910390fd5b6012546117a86112d7565b826117b39190614824565b11156117f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117eb90614932565b60405180910390fd5b60005b858590508110156118a15783838281811061181557611814614d3b565b5b905060200201356011600082825461182d9190614dfc565b9250508190555061188e86868381811061184a57611849614d3b565b5b905060200201602081019061185f9190613cfa565b85858481811061187257611871614d3b565b5b905060200201356040518060200160405280600081525061277c565b808061189990614bce565b9150506117f7565b505050505050565b60006118b36112d7565b82106118f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118eb90614ea2565b60405180910390fd5b819050919050565b611904612766565b73ffffffffffffffffffffffffffffffffffffffff16611922611b41565b73ffffffffffffffffffffffffffffffffffffffff1614611978576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196f9061459e565b60405180910390fd5b8181600e9190611989929190613a6c565b505050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006119bf826133ba565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3290614f34565b60405180910390fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b60105481565b611ac1612766565b73ffffffffffffffffffffffffffffffffffffffff16611adf611b41565b73ffffffffffffffffffffffffffffffffffffffff1614611b35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2c9061459e565b60405180910390fd5b611b3f6000613515565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611b72613af2565b611b7b826133ba565b9050919050565b611b8a612766565b73ffffffffffffffffffffffffffffffffffffffff16611ba8611b41565b73ffffffffffffffffffffffffffffffffffffffff1614611bfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf59061459e565b60405180910390fd5b818160029190611c0f929190613a6c565b505050565b606060058054611c23906145ed565b80601f0160208091040260200160405190810160405280929190818152602001828054611c4f906145ed565b8015611c9c5780601f10611c7157610100808354040283529160200191611c9c565b820191906000526020600020905b815481529060010190602001808311611c7f57829003601f168201915b5050505050905090565b611cae612766565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1390614fa0565b60405180910390fd5b8060096000611d29612766565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611dd6612766565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e1b9190613bfd565b60405180910390a35050565b60008060149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff1661271083611e5f9190614fef565b611e699190614952565b9050919050565b611e78612766565b73ffffffffffffffffffffffffffffffffffffffff16611e96611b41565b73ffffffffffffffffffffffffffffffffffffffff1614611eec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee39061459e565b60405180910390fd5b80601460006101000a81548160ff02191690831515021790555050565b611f14848484612c0b565b611f20848484846135d9565b611f5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5690615092565b60405180910390fd5b50505050565b600080600286604051602001611f7c9291906150f7565b604051602081830303815290604052805190602001209050600060018285888860405160008152602001604052604051611fb9949392919061513e565b6020604051602081039080840390855afa158015611fdb573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612057576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204e906151cf565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146120e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120de9061523b565b60405180910390fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161492505050949350505050565b600d8054612151906145ed565b80601f016020809104026020016040519081016040528092919081815260200182805461217d906145ed565b80156121ca5780601f1061219f576101008083540402835291602001916121ca565b820191906000526020600020905b8154815290600101906020018083116121ad57829003601f168201915b505050505081565b60606121dd8261276e565b61221c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612213906152cd565b60405180910390fd5b6000612226613761565b905060008151116122465760405180602001604052806000815250612271565b80612250846137f3565b604051602001612261929190615329565b6040516020818303038152906040525b915050919050565b600a5481565b612287612766565b73ffffffffffffffffffffffffffffffffffffffff166122a5611b41565b73ffffffffffffffffffffffffffffffffffffffff16146122fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f29061459e565b60405180910390fd5b6000732a03b32c24c40b435c65933ee574424aa86b92ae905060008173ffffffffffffffffffffffffffffffffffffffff164760405161233a9061537e565b60006040518083038185875af1925050503d8060008114612377576040519150601f19603f3d011682016040523d82523d6000602084013e61237c565b606091505b50509050806123c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b7906153df565b60405180910390fd5b5050565b60006123cf82613954565b9050919050565b6123de612766565b73ffffffffffffffffffffffffffffffffffffffff166123fc611b41565b73ffffffffffffffffffffffffffffffffffffffff1614612452576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124499061459e565b60405180910390fd5b8060128190555050565b60028054612469906145ed565b80601f0160208091040260200160405190810160405280929190818152602001828054612495906145ed565b80156124e25780601f106124b7576101008083540402835291602001916124e2565b820191906000526020600020905b8154815290600101906020018083116124c557829003601f168201915b505050505081565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612586612766565b73ffffffffffffffffffffffffffffffffffffffff166125a4611b41565b73ffffffffffffffffffffffffffffffffffffffff16146125fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125f19061459e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561266a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266190615471565b60405180910390fd5b61267381613515565b50565b61267e612766565b73ffffffffffffffffffffffffffffffffffffffff1661269c611b41565b73ffffffffffffffffffffffffffffffffffffffff16146126f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e99061459e565b60405180910390fd5b8060108190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600060035482109050919050565b60006003549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156127f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ea90615503565b60405180910390fd5b6127fc8161276e565b1561283c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128339061556f565b60405180910390fd5b6000831161287f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287690615601565b60405180910390fd5b61288c6000858386613a3d565b82600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166128f9919061563d565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555082600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff1661299c919061563d565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836006600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426006600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b84811015612b3d57818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612add60008784876135d9565b612b1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1390615092565b60405180910390fd5b8180612b2790614bce565b9250508080612b3590614bce565b915050612a6c565b5080600381905550612b526000868487613a43565b5050505050565b826008600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000612c16826133ba565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16612c3d612766565b73ffffffffffffffffffffffffffffffffffffffff161480612c995750612c62612766565b73ffffffffffffffffffffffffffffffffffffffff16612c8184610f1c565b73ffffffffffffffffffffffffffffffffffffffff16145b80612cb55750612cb48260000151612caf612766565b6124ea565b5b905080612cf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cee906156f5565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612d69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d6090615787565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612dd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dd090615819565b60405180910390fd5b612de68585856001613a3d565b612df66000848460000151612b59565b6001600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836006600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426006600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184612fcd9190614824565b9050600073ffffffffffffffffffffffffffffffffffffffff166006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156130e4576130438161276e565b156130e35782600001516006600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516006600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461314c8686866001613a43565b505050505050565b60008111613197576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161318e906158ab565b60405180910390fd5b6000600354116131dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131d390615917565b60405180910390fd5b600354600a5410613222576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161321990615983565b60405180910390fd5b6000600a5490506000600183836132399190614824565b6132439190614dfc565b905060016003546132549190614dfc565b81111561326d57600160035461326a9190614dfc565b90505b60008290505b8181116133a157600073ffffffffffffffffffffffffffffffffffffffff166006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561338e5760006132f0826133ba565b905080600001516006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080602001516006600084815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505b808061339990614bce565b915050613273565b506001816133af9190614824565b600a81905550505050565b6133c2613af2565b6133cb8261276e565b61340a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161340190615a15565b60405180910390fd5b60008290505b6000600660008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146134fc578092505050613510565b50808061350890615a35565b915050613410565b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006135fa8473ffffffffffffffffffffffffffffffffffffffff16613a49565b15613754578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613623612766565b8786866040518563ffffffff1660e01b81526004016136459493929190615ab4565b6020604051808303816000875af192505050801561368157506040513d601f19601f8201168201806040525081019061367e9190615b15565b60015b613704573d80600081146136b1576040519150601f19603f3d011682016040523d82523d6000602084013e6136b6565b606091505b506000815114156136fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136f390615092565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613759565b600190505b949350505050565b6060600e8054613770906145ed565b80601f016020809104026020016040519081016040528092919081815260200182805461379c906145ed565b80156137e95780601f106137be576101008083540402835291602001916137e9565b820191906000526020600020905b8154815290600101906020018083116137cc57829003601f168201915b5050505050905090565b6060600082141561383b576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061394f565b600082905060005b6000821461386d57808061385690614bce565b915050600a826138669190614fef565b9150613843565b60008167ffffffffffffffff8111156138895761388861428e565b5b6040519080825280601f01601f1916602001820160405280156138bb5781602001600182028036833780820191505090505b5090505b60008514613948576001826138d49190614dfc565b9150600a856138e39190615b42565b60306138ef9190614824565b60f81b81838151811061390557613904614d3b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856139419190614fef565b94506138bf565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156139c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139bc90615be5565b60405180910390fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b50505050565b50505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054613a78906145ed565b90600052602060002090601f016020900481019282613a9a5760008555613ae1565b82601f10613ab357803560ff1916838001178555613ae1565b82800160010185558215613ae1579182015b82811115613ae0578235825591602001919060010190613ac5565b5b509050613aee9190613b2c565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115613b45576000816000905550600101613b2d565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613b9281613b5d565b8114613b9d57600080fd5b50565b600081359050613baf81613b89565b92915050565b600060208284031215613bcb57613bca613b53565b5b6000613bd984828501613ba0565b91505092915050565b60008115159050919050565b613bf781613be2565b82525050565b6000602082019050613c126000830184613bee565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613c4382613c18565b9050919050565b613c5381613c38565b8114613c5e57600080fd5b50565b600081359050613c7081613c4a565b92915050565b60006bffffffffffffffffffffffff82169050919050565b613c9781613c76565b8114613ca257600080fd5b50565b600081359050613cb481613c8e565b92915050565b60008060408385031215613cd157613cd0613b53565b5b6000613cdf85828601613c61565b9250506020613cf085828601613ca5565b9150509250929050565b600060208284031215613d1057613d0f613b53565b5b6000613d1e84828501613c61565b91505092915050565b6000819050919050565b613d3a81613d27565b8114613d4557600080fd5b50565b600081359050613d5781613d31565b92915050565b600060208284031215613d7357613d72613b53565b5b6000613d8184828501613d48565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613dc4578082015181840152602081019050613da9565b83811115613dd3576000848401525b50505050565b6000601f19601f8301169050919050565b6000613df582613d8a565b613dff8185613d95565b9350613e0f818560208601613da6565b613e1881613dd9565b840191505092915050565b60006020820190508181036000830152613e3d8184613dea565b905092915050565b613e4e81613c38565b82525050565b6000602082019050613e696000830184613e45565b92915050565b60008060408385031215613e8657613e85613b53565b5b6000613e9485828601613c61565b9250506020613ea585828601613d48565b9150509250929050565b613eb881613d27565b82525050565b6000602082019050613ed36000830184613eaf565b92915050565b600080600060608486031215613ef257613ef1613b53565b5b6000613f0086828701613c61565b9350506020613f1186828701613c61565b9250506040613f2286828701613d48565b9150509250925092565b60008060408385031215613f4357613f42613b53565b5b6000613f5185828601613d48565b9250506020613f6285828601613d48565b9150509250929050565b6000604082019050613f816000830185613e45565b613f8e6020830184613eaf565b9392505050565b600080fd5b600080fd5b600080fd5b60008083601f840112613fba57613fb9613f95565b5b8235905067ffffffffffffffff811115613fd757613fd6613f9a565b5b602083019150836020820283011115613ff357613ff2613f9f565b5b9250929050565b60008083601f8401126140105761400f613f95565b5b8235905067ffffffffffffffff81111561402d5761402c613f9a565b5b60208301915083602082028301111561404957614048613f9f565b5b9250929050565b6000806000806040858703121561406a57614069613b53565b5b600085013567ffffffffffffffff81111561408857614087613b58565b5b61409487828801613fa4565b9450945050602085013567ffffffffffffffff8111156140b7576140b6613b58565b5b6140c387828801613ffa565b925092505092959194509250565b60008083601f8401126140e7576140e6613f95565b5b8235905067ffffffffffffffff81111561410457614103613f9a565b5b6020830191508360018202830111156141205761411f613f9f565b5b9250929050565b6000806020838503121561413e5761413d613b53565b5b600083013567ffffffffffffffff81111561415c5761415b613b58565b5b614168858286016140d1565b92509250509250929050565b61417d81613c38565b82525050565b600067ffffffffffffffff82169050919050565b6141a081614183565b82525050565b6040820160008201516141bc6000850182614174565b5060208201516141cf6020850182614197565b50505050565b60006040820190506141ea60008301846141a6565b92915050565b6141f981613be2565b811461420457600080fd5b50565b600081359050614216816141f0565b92915050565b6000806040838503121561423357614232613b53565b5b600061424185828601613c61565b925050602061425285828601614207565b9150509250929050565b60006020828403121561427257614271613b53565b5b600061428084828501614207565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6142c682613dd9565b810181811067ffffffffffffffff821117156142e5576142e461428e565b5b80604052505050565b60006142f8613b49565b905061430482826142bd565b919050565b600067ffffffffffffffff8211156143245761432361428e565b5b61432d82613dd9565b9050602081019050919050565b82818337600083830152505050565b600061435c61435784614309565b6142ee565b90508281526020810184848401111561437857614377614289565b5b61438384828561433a565b509392505050565b600082601f8301126143a05761439f613f95565b5b81356143b0848260208601614349565b91505092915050565b600080600080608085870312156143d3576143d2613b53565b5b60006143e187828801613c61565b94505060206143f287828801613c61565b935050604061440387828801613d48565b925050606085013567ffffffffffffffff81111561442457614423613b58565b5b6144308782880161438b565b91505092959194509250565b6000819050919050565b61444f8161443c565b811461445a57600080fd5b50565b60008135905061446c81614446565b92915050565b600060ff82169050919050565b61448881614472565b811461449357600080fd5b50565b6000813590506144a58161447f565b92915050565b600080600080608085870312156144c5576144c4613b53565b5b60006144d387828801613c61565b94505060206144e48782880161445d565b93505060406144f58782880161445d565b925050606061450687828801614496565b91505092959194509250565b6000806040838503121561452957614528613b53565b5b600061453785828601613c61565b925050602061454885828601613c61565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614588602083613d95565b915061459382614552565b602082019050919050565b600060208201905081810360008301526145b78161457b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061460557607f821691505b60208210811415614619576146186145be565b5b50919050565b7f455243373231453a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b600061467b602d83613d95565b91506146868261461f565b604082019050919050565b600060208201905081810360008301526146aa8161466e565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006146e7601f83613d95565b91506146f2826146b1565b602082019050919050565b60006020820190508181036000830152614716816146da565b9050919050565b7f5155414e544954592053484f554c44204245204d4f5245205448414e20300000600082015250565b6000614753601e83613d95565b915061475e8261471d565b602082019050919050565b6000602082019050818103600083015261478281614746565b9050919050565b7f5055424c49432053414c45204e4f542041435449564500000000000000000000600082015250565b60006147bf601683613d95565b91506147ca82614789565b602082019050919050565b600060208201905081810360008301526147ee816147b2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061482f82613d27565b915061483a83613d27565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561486f5761486e6147f5565b5b828201905092915050565b7f455843454544494e47204d415820544f4b454e53205045522057414c4c455400600082015250565b60006148b0601f83613d95565b91506148bb8261487a565b602082019050919050565b600060208201905081810360008301526148df816148a3565b9050919050565b7f455843454544494e47204d415820535550504c59000000000000000000000000600082015250565b600061491c601483613d95565b9150614927826148e6565b602082019050919050565b6000602082019050818103600083015261494b8161490f565b9050919050565b600061495d82613d27565b915061496883613d27565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156149a1576149a06147f5565b5b828202905092915050565b7f494e53554646494349454e542045544800000000000000000000000000000000600082015250565b60006149e2601083613d95565b91506149ed826149ac565b602082019050919050565b60006020820190508181036000830152614a11816149d5565b9050919050565b7f455243373231453a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b6000614a74602283613d95565b9150614a7f82614a18565b604082019050919050565b60006020820190508181036000830152614aa381614a67565b9050919050565b7f455243373231453a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b6000614b06603983613d95565b9150614b1182614aaa565b604082019050919050565b60006020820190508181036000830152614b3581614af9565b9050919050565b7f455243373231453a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b6000614b98602283613d95565b9150614ba382614b3c565b604082019050919050565b60006020820190508181036000830152614bc781614b8b565b9050919050565b6000614bd982613d27565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614c0c57614c0b6147f5565b5b600182019050919050565b7f455243373231453a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b6000614c73602e83613d95565b9150614c7e82614c17565b604082019050919050565b60006020820190508181036000830152614ca281614c66565b9050919050565b7f524543495049454e5420414e44205155414e54495459204e4f5420455155414c60008201527f204c454e47544800000000000000000000000000000000000000000000000000602082015250565b6000614d05602783613d95565b9150614d1082614ca9565b604082019050919050565b60006020820190508181036000830152614d3481614cf8565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f455843454544494e472052454d41494e494e472052455345525645442053555060008201527f504c590000000000000000000000000000000000000000000000000000000000602082015250565b6000614dc6602383613d95565b9150614dd182614d6a565b604082019050919050565b60006020820190508181036000830152614df581614db9565b9050919050565b6000614e0782613d27565b9150614e1283613d27565b925082821015614e2557614e246147f5565b5b828203905092915050565b7f455243373231453a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b6000614e8c602383613d95565b9150614e9782614e30565b604082019050919050565b60006020820190508181036000830152614ebb81614e7f565b9050919050565b7f455243373231453a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000614f1e602b83613d95565b9150614f2982614ec2565b604082019050919050565b60006020820190508181036000830152614f4d81614f11565b9050919050565b7f455243373231453a20617070726f766520746f2063616c6c6572000000000000600082015250565b6000614f8a601a83613d95565b9150614f9582614f54565b602082019050919050565b60006020820190508181036000830152614fb981614f7d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614ffa82613d27565b915061500583613d27565b92508261501557615014614fc0565b5b828204905092915050565b7f455243373231453a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b600061507c603383613d95565b915061508782615020565b604082019050919050565b600060208201905081810360008301526150ab8161506f565b9050919050565b6000819050919050565b6000819050919050565b60006150e16150dc6150d7846150b2565b6150bc565b614472565b9050919050565b6150f1816150c6565b82525050565b600060408201905061510c60008301856150e8565b6151196020830184613e45565b9392505050565b6151298161443c565b82525050565b61513881614472565b82525050565b60006080820190506151536000830187615120565b615160602083018661512f565b61516d6040830185615120565b61517a6060830184615120565b95945050505050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b60006151b9601883613d95565b91506151c482615183565b602082019050919050565b600060208201905081810360008301526151e8816151ac565b9050919050565b7f5369676e617475726520646f6573206e6f74206d617463680000000000000000600082015250565b6000615225601883613d95565b9150615230826151ef565b602082019050919050565b6000602082019050818103600083015261525481615218565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006152b7602f83613d95565b91506152c28261525b565b604082019050919050565b600060208201905081810360008301526152e6816152aa565b9050919050565b600081905092915050565b600061530382613d8a565b61530d81856152ed565b935061531d818560208601613da6565b80840191505092915050565b600061533582856152f8565b915061534182846152f8565b91508190509392505050565b600081905092915050565b50565b600061536860008361534d565b915061537382615358565b600082019050919050565b60006153898261535b565b9150819050919050565b7f5472616e73616374696f6e20556e7375636365737366756c0000000000000000600082015250565b60006153c9601883613d95565b91506153d482615393565b602082019050919050565b600060208201905081810360008301526153f8816153bc565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061545b602683613d95565b9150615466826153ff565b604082019050919050565b6000602082019050818103600083015261548a8161544e565b9050919050565b7f455243373231453a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006154ed602183613d95565b91506154f882615491565b604082019050919050565b6000602082019050818103600083015261551c816154e0565b9050919050565b7f455243373231453a20746f6b656e20616c7265616479206d696e746564000000600082015250565b6000615559601d83613d95565b915061556482615523565b602082019050919050565b600060208201905081810360008301526155888161554c565b9050919050565b7f455243373231453a207175616e74697479206d7573742062652067726561746560008201527f7220300000000000000000000000000000000000000000000000000000000000602082015250565b60006155eb602383613d95565b91506155f68261558f565b604082019050919050565b6000602082019050818103600083015261561a816155de565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600061564882615621565b915061565383615621565b9250826fffffffffffffffffffffffffffffffff03821115615678576156776147f5565b5b828201905092915050565b7f455243373231453a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b60006156df603283613d95565b91506156ea82615683565b604082019050919050565b6000602082019050818103600083015261570e816156d2565b9050919050565b7f455243373231453a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b6000615771602683613d95565b915061577c82615715565b604082019050919050565b600060208201905081810360008301526157a081615764565b9050919050565b7f455243373231453a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000615803602583613d95565b915061580e826157a7565b604082019050919050565b60006020820190508181036000830152615832816157f6565b9050919050565b7f7175616e74697479206d7573742062652067726561746572207468616e207a6560008201527f726f000000000000000000000000000000000000000000000000000000000000602082015250565b6000615895602283613d95565b91506158a082615839565b604082019050919050565b600060208201905081810360008301526158c481615888565b9050919050565b7f6e6f20746f6b656e73206d696e74656420796574000000000000000000000000600082015250565b6000615901601483613d95565b915061590c826158cb565b602082019050919050565b60006020820190508181036000830152615930816158f4565b9050919050565b7f616c6c206f776e657273686970732068617665206265656e2073657400000000600082015250565b600061596d601c83613d95565b915061597882615937565b602082019050919050565b6000602082019050818103600083015261599c81615960565b9050919050565b7f455243373231453a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b60006159ff602a83613d95565b9150615a0a826159a3565b604082019050919050565b60006020820190508181036000830152615a2e816159f2565b9050919050565b6000615a4082613d27565b91506000821415615a5457615a536147f5565b5b600182039050919050565b600081519050919050565b600082825260208201905092915050565b6000615a8682615a5f565b615a908185615a6a565b9350615aa0818560208601613da6565b615aa981613dd9565b840191505092915050565b6000608082019050615ac96000830187613e45565b615ad66020830186613e45565b615ae36040830185613eaf565b8181036060830152615af58184615a7b565b905095945050505050565b600081519050615b0f81613b89565b92915050565b600060208284031215615b2b57615b2a613b53565b5b6000615b3984828501615b00565b91505092915050565b6000615b4d82613d27565b9150615b5883613d27565b925082615b6857615b67614fc0565b5b828206905092915050565b7f455243373231453a206e756d626572206d696e74656420717565727920666f7260008201527f20746865207a65726f2061646472657373000000000000000000000000000000602082015250565b6000615bcf603183613d95565b9150615bda82615b73565b604082019050919050565b60006020820190508181036000830152615bfe81615bc2565b905091905056fea2646970667358221220268a25d8423d1a7c7fe6fd2f8c4e5850a3c01f159a5ff04b77a0293dceb56e5a64736f6c634300080c0033

Deployed Bytecode Sourcemap

46924:3104:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30430:414;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45386:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44019:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49399:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32099;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33660:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47457:508;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33181:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47090:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47252:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28875:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47286:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47210:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34536:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44989:247;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;49838:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29539:819;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34769:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47170:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47971:632;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29052:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49015:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43604:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31908:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30908:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47128:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25762:103;;;;;;;;;;;;;:::i;:::-;;25111:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49250:129;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45568:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32268:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33946:288;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45242:138;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49727:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35017:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44525:458;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47002:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32443:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39894:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48636:243;;;;;;;;;;;;;:::i;:::-;;49135:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49619:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27434:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34305:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26020:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49505:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30430:414;30532:4;30584:25;30569:40;;;:11;:40;;;;:105;;;;30641:33;30626:48;;;:11;:48;;;;30569:105;:172;;;;30706:35;30691:50;;;:11;:50;;;;30569:172;:214;;;;30773:10;30758:25;;:11;:25;;;;30569:214;:267;;;;30800:36;30824:11;30800:23;:36::i;:::-;30569:267;30549:287;;30430:414;;;:::o;45386:176::-;25342:12;:10;:12::i;:::-;25331:23;;:7;:5;:7::i;:::-;:23;;;25323:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45500:9:::1;45482:15;;:27;;;;;;;;;;;;;;;;;;45538:18;45518:17;;:38;;;;;;;;;;;;;;;;;;45386:176:::0;;:::o;44019:106::-;25342:12;:10;:12::i;:::-;25331:23;;:7;:5;:7::i;:::-;:23;;;25323:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44109:10:::1;44093:13;;:26;;;;;;;;;;;;;;;;;;44019:106:::0;:::o;49399:100::-;25342:12;:10;:12::i;:::-;25331:23;;:7;:5;:7::i;:::-;:23;;;25323:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49486:7:::1;49469:14;:24;;;;49399:100:::0;:::o;32099:::-;32153:13;32186:5;32179:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32099:100;:::o;33660:214::-;33728:7;33756:16;33764:7;33756;:16::i;:::-;33748:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;33842:15;:24;33858:7;33842:24;;;;;;;;;;;;;;;;;;;;;33835:31;;33660:214;;;:::o;47457:508::-;22209:1;22807:7;;:19;;22799:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;22209:1;22940:7;:18;;;;47549:1:::1;47538:8;:12;47530:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;47600:18;;;;;;;;;;;47592:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;47699:18;;47671:24;47684:10;47671:12;:24::i;:::-;47660:8;:35;;;;:::i;:::-;:57;;47652:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;47813:15;;47795:14;;47784:8;47768:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:41;;;;:::i;:::-;:60;;47760:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;47888:8;47881:4;;:15;;;;:::i;:::-;47868:9;:28;;47860:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;47924:35;47934:10;47946:8;47924:35;;;;;;;;;;;::::0;:9:::1;:35::i;:::-;22165:1:::0;23119:7;:22;;;;47457:508;:::o;33181:413::-;33254:13;33270:24;33286:7;33270:15;:24::i;:::-;33254:40;;33319:5;33313:11;;:2;:11;;;;33305:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;33414:5;33398:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;33423:37;33440:5;33447:12;:10;:12::i;:::-;33423:16;:37::i;:::-;33398:62;33376:169;;;;;;;;;;;;:::i;:::-;;;;;;;;;33558:28;33567:2;33571:7;33580:5;33558:8;:28::i;:::-;33243:351;33181:413;;:::o;47090:33::-;;;;:::o;47252:29::-;;;;:::o;28875:100::-;28928:7;28955:12;;28948:19;;28875:100;:::o;47286:38::-;;;;;;;;;;;;;:::o;47210:37::-;;;;:::o;34536:162::-;34662:28;34672:4;34678:2;34682:7;34662:9;:28::i;:::-;34536:162;;;:::o;44989:247::-;45106:16;45133:21;45181:15;;;;;;;;;;;45198:28;45215:10;45198:16;:28::i;:::-;45173:54;;;;44989:247;;;;;:::o;49838:118::-;25342:12;:10;:12::i;:::-;25331:23;;:7;:5;:7::i;:::-;:23;;;25323:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22209:1:::1;22807:7;;:19;;22799:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;22209:1;22940:7;:18;;;;49922:28:::2;49941:8;49922:18;:28::i;:::-;22165:1:::1;23119:7;:22;;;;49838:118:::0;:::o;29539:819::-;29628:7;29664:16;29674:5;29664:9;:16::i;:::-;29656:5;:24;29648:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;29730:22;29755:13;:11;:13::i;:::-;29730:38;;29779:19;29809:25;29845:1;29809:38;;29863:9;29858:426;29882:14;29878:1;:18;29858:426;;;29918:31;29952:11;:14;29964:1;29952:14;;;;;;;;;;;29918:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30011:1;29985:28;;:9;:14;;;:28;;;29981:103;;30054:9;:14;;;30034:34;;29981:103;30123:5;30102:26;;:17;:26;;;30098:175;;;30168:5;30153:11;:20;30149:77;;;30205:1;30198:8;;;;;;;;;30149:77;30244:13;;;;;:::i;:::-;;;;30098:175;29903:381;29898:3;;;;;:::i;:::-;;;;29858:426;;;;30294:56;;;;;;;;;;:::i;:::-;;;;;;;;29539:819;;;;;:::o;34769:177::-;34899:39;34916:4;34922:2;34926:7;34899:39;;;;;;;;;;;;:16;:39::i;:::-;34769:177;;;:::o;47170:35::-;;;;:::o;47971:632::-;25342:12;:10;:12::i;:::-;25331:23;;:7;:5;:7::i;:::-;:23;;;25323:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48098:8:::1;;:15;;48078:9;;:16;;:35;48070:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;48164:21;48200:9:::0;48196:85:::1;48215:8;;:15;;48211:1;:19;48196:85;;;48262:8;;48271:1;48262:11;;;;;;;:::i;:::-;;;;;;;;48245:28;;;;;:::i;:::-;;;48232:3;;;;;:::i;:::-;;;;48196:85;;;;48312:14;;48295:13;:31;;48287:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;48415:15;;48397:13;:11;:13::i;:::-;48381;:29;;;;:::i;:::-;:49;;48373:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;48466:9;48462:136;48481:9;;:16;;48477:1;:20;48462:136;;;48530:8;;48539:1;48530:11;;;;;;;:::i;:::-;;;;;;;;48512:14;;:29;;;;;;;:::i;:::-;;;;;;;;48550:40;48560:9;;48570:1;48560:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;48574:8;;48583:1;48574:11;;;;;;;:::i;:::-;;;;;;;;48550:40;;;;;;;;;;;::::0;:9:::1;:40::i;:::-;48499:3;;;;;:::i;:::-;;;;48462:136;;;;48063:540;47971:632:::0;;;;:::o;29052:187::-;29119:7;29155:13;:11;:13::i;:::-;29147:5;:21;29139:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;29226:5;29219:12;;29052:187;;;:::o;49015:100::-;25342:12;:10;:12::i;:::-;25331:23;;:7;:5;:7::i;:::-;:23;;;25323:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49102:7:::1;;49086:13;:23;;;;;;;:::i;:::-;;49015:100:::0;;:::o;43604:28::-;;;;;;;;;;;;;:::o;31908:124::-;31972:7;31999:20;32011:7;31999:11;:20::i;:::-;:25;;;31992:32;;31908:124;;;:::o;30908:221::-;30972:7;31017:1;31000:19;;:5;:19;;;;30992:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;31093:12;:19;31106:5;31093:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;31085:36;;31078:43;;30908:221;;;:::o;47128:37::-;;;;:::o;25762:103::-;25342:12;:10;:12::i;:::-;25331:23;;:7;:5;:7::i;:::-;:23;;;25323:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;25827:30:::1;25854:1;25827:18;:30::i;:::-;25762:103::o:0;25111:87::-;25157:7;25184:6;;;;;;;;;;;25177:13;;25111:87;:::o;49250:129::-;49316:21;;:::i;:::-;49353:20;49365:7;49353:11;:20::i;:::-;49346:27;;49250:129;;;:::o;45568:112::-;25342:12;:10;:12::i;:::-;25331:23;;:7;:5;:7::i;:::-;:23;;;25323:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45662:12:::1;;45648:11;:26;;;;;;;:::i;:::-;;45568:112:::0;;:::o;32268:104::-;32324:13;32357:7;32350:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32268:104;:::o;33946:288::-;34053:12;:10;:12::i;:::-;34041:24;;:8;:24;;;;34033:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;34154:8;34109:18;:32;34128:12;:10;:12::i;:::-;34109:32;;;;;;;;;;;;;;;:42;34142:8;34109:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;34207:8;34178:48;;34193:12;:10;:12::i;:::-;34178:48;;;34217:8;34178:48;;;;;;:::i;:::-;;;;;;;;33946:288;;:::o;45242:138::-;45309:7;45357:17;;;;;;;;;;;45334:40;;45348:5;45335:10;:18;;;;:::i;:::-;45334:40;;;;:::i;:::-;45327:47;;45242:138;;;:::o;49727:105::-;25342:12;:10;:12::i;:::-;25331:23;;:7;:5;:7::i;:::-;:23;;;25323:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49817:9:::1;49796:18;;:30;;;;;;;;;;;;;;;;;;49727:105:::0;:::o;35017:355::-;35176:28;35186:4;35192:2;35196:7;35176:9;:28::i;:::-;35237:48;35260:4;35266:2;35270:7;35279:5;35237:22;:48::i;:::-;35215:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;35017:355;;;;:::o;44525:458::-;44657:4;44672:14;44710:1;44713:4;44699:19;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44689:30;;;;;;44672:47;;44728:14;44745:29;44755:6;44763:2;44767;44771;44745:29;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44728:46;;44809:1;44791:20;;:6;:20;;;;44783:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;44906:6;44889:23;;:13;;;;;;;;;;;:23;;;44881:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;44964:13;;;;;;;;;;;44954:23;;:6;:23;;;44947:30;;;;44525:458;;;;;;:::o;47002:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32443:334::-;32516:13;32550:16;32558:7;32550;:16::i;:::-;32542:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;32631:21;32655:10;:8;:10::i;:::-;32631:34;;32707:1;32689:7;32683:21;:25;:86;;;;;;;;;;;;;;;;;32735:7;32744:18;:7;:16;:18::i;:::-;32718:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;32683:86;32676:93;;;32443:334;;;:::o;39894:39::-;;;;:::o;48636:243::-;25342:12;:10;:12::i;:::-;25331:23;;:7;:5;:7::i;:::-;:23;;;25323:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48691:10:::1;48712:42;48691:64;;48763:12;48781:2;:7;;48796:21;48781:41;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48762:60;;;48837:7;48829:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;48684:195;;48636:243::o:0;49135:107::-;49193:7;49216:20;49230:5;49216:13;:20::i;:::-;49209:27;;49135:107;;;:::o;49619:102::-;25342:12;:10;:12::i;:::-;25331:23;;:7;:5;:7::i;:::-;:23;;;25323:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49708:7:::1;49690:15;:25;;;;49619:102:::0;:::o;27434:25::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;34305:164::-;34402:4;34426:18;:25;34445:5;34426:25;;;;;;;;;;;;;;;:35;34452:8;34426:35;;;;;;;;;;;;;;;;;;;;;;;;;34419:42;;34305:164;;;;:::o;26020:201::-;25342:12;:10;:12::i;:::-;25331:23;;:7;:5;:7::i;:::-;:23;;;25323:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;26129:1:::1;26109:22;;:8;:22;;;;26101:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26185:28;26204:8;26185:18;:28::i;:::-;26020:201:::0;:::o;49505:108::-;25342:12;:10;:12::i;:::-;25331:23;;:7;:5;:7::i;:::-;:23;;;25323:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49600:7:::1;49579:18;:28;;;;49505:108:::0;:::o;11339:157::-;11424:4;11463:25;11448:40;;;:11;:40;;;;11441:47;;11339:157;;;:::o;23835:98::-;23888:7;23915:10;23908:17;;23835:98;:::o;35627:111::-;35684:4;35718:12;;35708:7;:22;35701:29;;35627:111;;;:::o;36127:1324::-;36250:20;36273:12;;36250:35;;36318:1;36304:16;;:2;:16;;;;36296:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;36503:21;36511:12;36503:7;:21::i;:::-;36502:22;36494:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;36588:1;36577:8;:12;36569:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;36642:61;36672:1;36676:2;36680:12;36694:8;36642:21;:61::i;:::-;36752:8;36716:12;:16;36729:2;36716:16;;;;;;;;;;;;;;;:24;;;:45;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;36813:8;36772:12;:16;36785:2;36772:16;;;;;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;36868:2;36835:11;:25;36847:12;36835:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;36931:15;36881:11;:25;36893:12;36881:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;36960:20;36983:12;36960:35;;37013:9;37008:325;37032:8;37028:1;:12;37008:325;;;37092:12;37088:2;37067:38;;37084:1;37067:38;;;;;;;;;;;;37146:59;37177:1;37181:2;37185:12;37199:5;37146:22;:59::i;:::-;37120:172;;;;;;;;;;;;:::i;:::-;;;;;;;;;37307:14;;;;;:::i;:::-;;;;37042:3;;;;;:::i;:::-;;;;37008:325;;;;37360:12;37345;:27;;;;37383:60;37412:1;37416:2;37420:12;37434:8;37383:20;:60::i;:::-;36239:1212;;36127:1324;;;:::o;39690:196::-;39832:2;39805:15;:24;39821:7;39805:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;39870:7;39866:2;39850:28;;39859:5;39850:28;;;;;;;;;;;;39690:196;;;:::o;37705:1867::-;37820:35;37858:20;37870:7;37858:11;:20::i;:::-;37820:58;;37891:22;37933:13;:18;;;37917:34;;:12;:10;:12::i;:::-;:34;;;:87;;;;37992:12;:10;:12::i;:::-;37968:36;;:20;37980:7;37968:11;:20::i;:::-;:36;;;37917:87;:154;;;;38021:50;38038:13;:18;;;38058:12;:10;:12::i;:::-;38021:16;:50::i;:::-;37917:154;37891:181;;38093:17;38085:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;38208:4;38186:26;;:13;:18;;;:26;;;38178:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;38288:1;38274:16;;:2;:16;;;;38266:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;38345:43;38367:4;38373:2;38377:7;38386:1;38345:21;:43::i;:::-;38453:49;38470:1;38474:7;38483:13;:18;;;38453:8;:49::i;:::-;38737:1;38707:12;:18;38720:4;38707:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38781:1;38753:12;:16;38766:2;38753:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38834:2;38806:11;:20;38818:7;38806:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;38892:15;38847:11;:20;38859:7;38847:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;39148:19;39180:1;39170:7;:11;;;;:::i;:::-;39148:33;;39237:1;39196:43;;:11;:24;39208:11;39196:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;39192:275;;;39260:20;39268:11;39260:7;:20::i;:::-;39256:200;;;39333:13;:18;;;39301:11;:24;39313:11;39301:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;39412:13;:28;;;39370:11;:24;39382:11;39370:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;39256:200;39192:275;39503:7;39499:2;39484:27;;39493:4;39484:27;;;;;;;;;;;;39522:42;39543:4;39549:2;39553:7;39562:1;39522:20;:42::i;:::-;37809:1763;;;37705:1867;;;:::o;40046:961::-;40131:1;40120:8;:12;40112:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;40205:1;40190:12;;:16;40182:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;40277:12;;40250:24;;:39;40242:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;40335:25;40363:24;;40335:52;;40398:16;40448:1;40437:8;40417:17;:28;;;;:::i;:::-;:32;;;;:::i;:::-;40398:51;;40547:1;40532:12;;:16;;;;:::i;:::-;40521:8;:27;40517:87;;;40591:1;40576:12;;:16;;;;:::i;:::-;40565:27;;40517:87;40621:9;40633:17;40621:29;;40616:334;40657:8;40652:1;:13;40616:334;;40722:1;40691:33;;:11;:14;40703:1;40691:14;;;;;;;;;;;:19;;;;;;;;;;;;:33;;;40687:252;;;40745:31;40779:14;40791:1;40779:11;:14::i;:::-;40745:48;;40834:9;:14;;;40812:11;:14;40824:1;40812:14;;;;;;;;;;;:19;;;:36;;;;;;;;;;;;;;;;;;40899:9;:24;;;40867:11;:14;40879:1;40867:14;;;;;;;;;;;:29;;;:56;;;;;;;;;;;;;;;;;;40726:213;40687:252;40667:3;;;;;:::i;:::-;;;;40616:334;;;;40998:1;40987:8;:12;;;;:::i;:::-;40960:24;:39;;;;40101:906;;40046:961;:::o;31374:472::-;31435:21;;:::i;:::-;31477:16;31485:7;31477;:16::i;:::-;31469:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;31558:12;31573:7;31558:22;;31553:216;31607:31;31641:11;:17;31653:4;31641:17;;;;;;;;;;;31607:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31703:1;31677:28;;:9;:14;;;:28;;;31673:85;;31733:9;31726:16;;;;;;31673:85;31592:177;31584:6;;;;;:::i;:::-;;;;31553:216;;31374:472;;;;:::o;26381:191::-;26455:16;26474:6;;;;;;;;;;;26455:25;;26500:8;26491:6;;:17;;;;;;;;;;;;;;;;;;26555:8;26524:40;;26545:8;26524:40;;;;;;;;;;;;26444:128;26381:191;:::o;41575:804::-;41730:4;41751:15;:2;:13;;;:15::i;:::-;41747:625;;;41803:2;41787:36;;;41824:12;:10;:12::i;:::-;41838:4;41844:7;41853:5;41787:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;41783:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42050:1;42033:6;:13;:18;42029:273;;;42076:61;;;;;;;;;;:::i;:::-;;;;;;;;42029:273;42252:6;42246:13;42237:6;42233:2;42229:15;42222:38;41783:534;41920:45;;;41910:55;;;:6;:55;;;;41903:62;;;;;41747:625;42356:4;42349:11;;41575:804;;;;;;;:::o;48901:108::-;48961:13;48990;48983:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48901:108;:::o;18638:723::-;18694:13;18924:1;18915:5;:10;18911:53;;;18942:10;;;;;;;;;;;;;;;;;;;;;18911:53;18974:12;18989:5;18974:20;;19005:14;19030:78;19045:1;19037:4;:9;19030:78;;19063:8;;;;;:::i;:::-;;;;19094:2;19086:10;;;;;:::i;:::-;;;19030:78;;;19118:19;19150:6;19140:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19118:39;;19168:154;19184:1;19175:5;:10;19168:154;;19212:1;19202:11;;;;;:::i;:::-;;;19279:2;19271:5;:10;;;;:::i;:::-;19258:2;:24;;;;:::i;:::-;19245:39;;19228:6;19235;19228:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;19308:2;19299:11;;;;;:::i;:::-;;;19168:154;;;19346:6;19332:21;;;;;18638:723;;;;:::o;31137:229::-;31198:7;31243:1;31226:19;;:5;:19;;;;31218:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;31325:12;:19;31338:5;31325:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;31317:41;;31310:48;;31137:229;;;:::o;42867:159::-;;;;;:::o;43438:158::-;;;;;:::o;1233:326::-;1293:4;1550:1;1528:7;:19;;;:23;1521:30;;1233:326;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::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:126::-;1555:7;1595:42;1588:5;1584:54;1573:65;;1518:126;;;:::o;1650:96::-;1687:7;1716:24;1734:5;1716:24;:::i;:::-;1705:35;;1650:96;;;:::o;1752:122::-;1825:24;1843:5;1825:24;:::i;:::-;1818:5;1815:35;1805:63;;1864:1;1861;1854:12;1805:63;1752:122;:::o;1880:139::-;1926:5;1964:6;1951:20;1942:29;;1980:33;2007:5;1980:33;:::i;:::-;1880:139;;;;:::o;2025:109::-;2061:7;2101:26;2094:5;2090:38;2079:49;;2025:109;;;:::o;2140:120::-;2212:23;2229:5;2212:23;:::i;:::-;2205:5;2202:34;2192:62;;2250:1;2247;2240:12;2192:62;2140:120;:::o;2266:137::-;2311:5;2349:6;2336:20;2327:29;;2365:32;2391:5;2365:32;:::i;:::-;2266:137;;;;:::o;2409:472::-;2476:6;2484;2533:2;2521:9;2512:7;2508:23;2504:32;2501:119;;;2539:79;;:::i;:::-;2501:119;2659:1;2684:53;2729:7;2720:6;2709:9;2705:22;2684:53;:::i;:::-;2674:63;;2630:117;2786:2;2812:52;2856:7;2847:6;2836:9;2832:22;2812:52;:::i;:::-;2802:62;;2757:117;2409:472;;;;;:::o;2887:329::-;2946:6;2995:2;2983:9;2974:7;2970:23;2966:32;2963:119;;;3001:79;;:::i;:::-;2963:119;3121:1;3146:53;3191:7;3182:6;3171:9;3167:22;3146:53;:::i;:::-;3136:63;;3092:117;2887:329;;;;:::o;3222:77::-;3259:7;3288:5;3277:16;;3222:77;;;:::o;3305:122::-;3378:24;3396:5;3378:24;:::i;:::-;3371:5;3368:35;3358:63;;3417:1;3414;3407:12;3358:63;3305:122;:::o;3433:139::-;3479:5;3517:6;3504:20;3495:29;;3533:33;3560:5;3533:33;:::i;:::-;3433:139;;;;:::o;3578:329::-;3637:6;3686:2;3674:9;3665:7;3661:23;3657:32;3654:119;;;3692:79;;:::i;:::-;3654:119;3812:1;3837:53;3882:7;3873:6;3862:9;3858:22;3837:53;:::i;:::-;3827:63;;3783:117;3578:329;;;;:::o;3913:99::-;3965:6;3999:5;3993:12;3983:22;;3913:99;;;:::o;4018:169::-;4102:11;4136:6;4131:3;4124:19;4176:4;4171:3;4167:14;4152:29;;4018:169;;;;:::o;4193:307::-;4261:1;4271:113;4285:6;4282:1;4279:13;4271:113;;;4370:1;4365:3;4361:11;4355:18;4351:1;4346:3;4342:11;4335:39;4307:2;4304:1;4300:10;4295:15;;4271:113;;;4402:6;4399:1;4396:13;4393:101;;;4482:1;4473:6;4468:3;4464:16;4457:27;4393:101;4242:258;4193:307;;;:::o;4506:102::-;4547:6;4598:2;4594:7;4589:2;4582:5;4578:14;4574:28;4564:38;;4506:102;;;:::o;4614:364::-;4702:3;4730:39;4763:5;4730:39;:::i;:::-;4785:71;4849:6;4844:3;4785:71;:::i;:::-;4778:78;;4865:52;4910:6;4905:3;4898:4;4891:5;4887:16;4865:52;:::i;:::-;4942:29;4964:6;4942:29;:::i;:::-;4937:3;4933:39;4926:46;;4706:272;4614:364;;;;:::o;4984:313::-;5097:4;5135:2;5124:9;5120:18;5112:26;;5184:9;5178:4;5174:20;5170:1;5159:9;5155:17;5148:47;5212:78;5285:4;5276:6;5212:78;:::i;:::-;5204:86;;4984:313;;;;:::o;5303:118::-;5390:24;5408:5;5390:24;:::i;:::-;5385:3;5378:37;5303:118;;:::o;5427:222::-;5520:4;5558:2;5547:9;5543:18;5535:26;;5571:71;5639:1;5628:9;5624:17;5615:6;5571:71;:::i;:::-;5427:222;;;;:::o;5655:474::-;5723:6;5731;5780:2;5768:9;5759:7;5755:23;5751:32;5748:119;;;5786:79;;:::i;:::-;5748:119;5906:1;5931:53;5976:7;5967:6;5956:9;5952:22;5931:53;:::i;:::-;5921:63;;5877:117;6033:2;6059:53;6104:7;6095:6;6084:9;6080:22;6059:53;:::i;:::-;6049:63;;6004:118;5655:474;;;;;:::o;6135:118::-;6222:24;6240:5;6222:24;:::i;:::-;6217:3;6210:37;6135:118;;:::o;6259:222::-;6352:4;6390:2;6379:9;6375:18;6367:26;;6403:71;6471:1;6460:9;6456:17;6447:6;6403:71;:::i;:::-;6259:222;;;;:::o;6487:619::-;6564:6;6572;6580;6629:2;6617:9;6608:7;6604:23;6600:32;6597:119;;;6635:79;;:::i;:::-;6597:119;6755:1;6780:53;6825:7;6816:6;6805:9;6801:22;6780:53;:::i;:::-;6770:63;;6726:117;6882:2;6908:53;6953:7;6944:6;6933:9;6929:22;6908:53;:::i;:::-;6898:63;;6853:118;7010:2;7036:53;7081:7;7072:6;7061:9;7057:22;7036:53;:::i;:::-;7026:63;;6981:118;6487:619;;;;;:::o;7112:474::-;7180:6;7188;7237:2;7225:9;7216:7;7212:23;7208:32;7205:119;;;7243:79;;:::i;:::-;7205:119;7363:1;7388:53;7433:7;7424:6;7413:9;7409:22;7388:53;:::i;:::-;7378:63;;7334:117;7490:2;7516:53;7561:7;7552:6;7541:9;7537:22;7516:53;:::i;:::-;7506:63;;7461:118;7112:474;;;;;:::o;7592:332::-;7713:4;7751:2;7740:9;7736:18;7728:26;;7764:71;7832:1;7821:9;7817:17;7808:6;7764:71;:::i;:::-;7845:72;7913:2;7902:9;7898:18;7889:6;7845:72;:::i;:::-;7592:332;;;;;:::o;7930:117::-;8039:1;8036;8029:12;8053:117;8162:1;8159;8152:12;8176:117;8285:1;8282;8275:12;8316:568;8389:8;8399:6;8449:3;8442:4;8434:6;8430:17;8426:27;8416:122;;8457:79;;:::i;:::-;8416:122;8570:6;8557:20;8547:30;;8600:18;8592:6;8589:30;8586:117;;;8622:79;;:::i;:::-;8586:117;8736:4;8728:6;8724:17;8712:29;;8790:3;8782:4;8774:6;8770:17;8760:8;8756:32;8753:41;8750:128;;;8797:79;;:::i;:::-;8750:128;8316:568;;;;;:::o;8907:::-;8980:8;8990:6;9040:3;9033:4;9025:6;9021:17;9017:27;9007:122;;9048:79;;:::i;:::-;9007:122;9161:6;9148:20;9138:30;;9191:18;9183:6;9180:30;9177:117;;;9213:79;;:::i;:::-;9177:117;9327:4;9319:6;9315:17;9303:29;;9381:3;9373:4;9365:6;9361:17;9351:8;9347:32;9344:41;9341:128;;;9388:79;;:::i;:::-;9341:128;8907:568;;;;;:::o;9481:934::-;9603:6;9611;9619;9627;9676:2;9664:9;9655:7;9651:23;9647:32;9644:119;;;9682:79;;:::i;:::-;9644:119;9830:1;9819:9;9815:17;9802:31;9860:18;9852:6;9849:30;9846:117;;;9882:79;;:::i;:::-;9846:117;9995:80;10067:7;10058:6;10047:9;10043:22;9995:80;:::i;:::-;9977:98;;;;9773:312;10152:2;10141:9;10137:18;10124:32;10183:18;10175:6;10172:30;10169:117;;;10205:79;;:::i;:::-;10169:117;10318:80;10390:7;10381:6;10370:9;10366:22;10318:80;:::i;:::-;10300:98;;;;10095:313;9481:934;;;;;;;:::o;10435:553::-;10493:8;10503:6;10553:3;10546:4;10538:6;10534:17;10530:27;10520:122;;10561:79;;:::i;:::-;10520:122;10674:6;10661:20;10651:30;;10704:18;10696:6;10693:30;10690:117;;;10726:79;;:::i;:::-;10690:117;10840:4;10832:6;10828:17;10816:29;;10894:3;10886:4;10878:6;10874:17;10864:8;10860:32;10857:41;10854:128;;;10901:79;;:::i;:::-;10854:128;10435:553;;;;;:::o;10994:529::-;11065:6;11073;11122:2;11110:9;11101:7;11097:23;11093:32;11090:119;;;11128:79;;:::i;:::-;11090:119;11276:1;11265:9;11261:17;11248:31;11306:18;11298:6;11295:30;11292:117;;;11328:79;;:::i;:::-;11292:117;11441:65;11498:7;11489:6;11478:9;11474:22;11441:65;:::i;:::-;11423:83;;;;11219:297;10994:529;;;;;:::o;11529:108::-;11606:24;11624:5;11606:24;:::i;:::-;11601:3;11594:37;11529:108;;:::o;11643:101::-;11679:7;11719:18;11712:5;11708:30;11697:41;;11643:101;;;:::o;11750:105::-;11825:23;11842:5;11825:23;:::i;:::-;11820:3;11813:36;11750:105;;:::o;11931:527::-;12090:4;12085:3;12081:14;12177:4;12170:5;12166:16;12160:23;12196:63;12253:4;12248:3;12244:14;12230:12;12196:63;:::i;:::-;12105:164;12361:4;12354:5;12350:16;12344:23;12380:61;12435:4;12430:3;12426:14;12412:12;12380:61;:::i;:::-;12279:172;12059:399;11931:527;;:::o;12464:346::-;12619:4;12657:2;12646:9;12642:18;12634:26;;12670:133;12800:1;12789:9;12785:17;12776:6;12670:133;:::i;:::-;12464:346;;;;:::o;12816:116::-;12886:21;12901:5;12886:21;:::i;:::-;12879:5;12876:32;12866:60;;12922:1;12919;12912:12;12866:60;12816:116;:::o;12938:133::-;12981:5;13019:6;13006:20;12997:29;;13035:30;13059:5;13035:30;:::i;:::-;12938:133;;;;:::o;13077:468::-;13142:6;13150;13199:2;13187:9;13178:7;13174:23;13170:32;13167:119;;;13205:79;;:::i;:::-;13167:119;13325:1;13350:53;13395:7;13386:6;13375:9;13371:22;13350:53;:::i;:::-;13340:63;;13296:117;13452:2;13478:50;13520:7;13511:6;13500:9;13496:22;13478:50;:::i;:::-;13468:60;;13423:115;13077:468;;;;;:::o;13551:323::-;13607:6;13656:2;13644:9;13635:7;13631:23;13627:32;13624:119;;;13662:79;;:::i;:::-;13624:119;13782:1;13807:50;13849:7;13840:6;13829:9;13825:22;13807:50;:::i;:::-;13797:60;;13753:114;13551:323;;;;:::o;13880:117::-;13989:1;13986;13979:12;14003:180;14051:77;14048:1;14041:88;14148:4;14145:1;14138:15;14172:4;14169:1;14162:15;14189:281;14272:27;14294:4;14272:27;:::i;:::-;14264:6;14260:40;14402:6;14390:10;14387:22;14366:18;14354:10;14351:34;14348:62;14345:88;;;14413:18;;:::i;:::-;14345:88;14453:10;14449:2;14442:22;14232:238;14189:281;;:::o;14476:129::-;14510:6;14537:20;;:::i;:::-;14527:30;;14566:33;14594:4;14586:6;14566:33;:::i;:::-;14476:129;;;:::o;14611:307::-;14672:4;14762:18;14754:6;14751:30;14748:56;;;14784:18;;:::i;:::-;14748:56;14822:29;14844:6;14822:29;:::i;:::-;14814:37;;14906:4;14900;14896:15;14888:23;;14611:307;;;:::o;14924:154::-;15008:6;15003:3;14998;14985:30;15070:1;15061:6;15056:3;15052:16;15045:27;14924:154;;;:::o;15084:410::-;15161:5;15186:65;15202:48;15243:6;15202:48;:::i;:::-;15186:65;:::i;:::-;15177:74;;15274:6;15267:5;15260:21;15312:4;15305:5;15301:16;15350:3;15341:6;15336:3;15332:16;15329:25;15326:112;;;15357:79;;:::i;:::-;15326:112;15447:41;15481:6;15476:3;15471;15447:41;:::i;:::-;15167:327;15084:410;;;;;:::o;15513:338::-;15568:5;15617:3;15610:4;15602:6;15598:17;15594:27;15584:122;;15625:79;;:::i;:::-;15584:122;15742:6;15729:20;15767:78;15841:3;15833:6;15826:4;15818:6;15814:17;15767:78;:::i;:::-;15758:87;;15574:277;15513:338;;;;:::o;15857:943::-;15952:6;15960;15968;15976;16025:3;16013:9;16004:7;16000:23;15996:33;15993:120;;;16032:79;;:::i;:::-;15993:120;16152:1;16177:53;16222:7;16213:6;16202:9;16198:22;16177:53;:::i;:::-;16167:63;;16123:117;16279:2;16305:53;16350:7;16341:6;16330:9;16326:22;16305:53;:::i;:::-;16295:63;;16250:118;16407:2;16433:53;16478:7;16469:6;16458:9;16454:22;16433:53;:::i;:::-;16423:63;;16378:118;16563:2;16552:9;16548:18;16535:32;16594:18;16586:6;16583:30;16580:117;;;16616:79;;:::i;:::-;16580:117;16721:62;16775:7;16766:6;16755:9;16751:22;16721:62;:::i;:::-;16711:72;;16506:287;15857:943;;;;;;;:::o;16806:77::-;16843:7;16872:5;16861:16;;16806:77;;;:::o;16889:122::-;16962:24;16980:5;16962:24;:::i;:::-;16955:5;16952:35;16942:63;;17001:1;16998;16991:12;16942:63;16889:122;:::o;17017:139::-;17063:5;17101:6;17088:20;17079:29;;17117:33;17144:5;17117:33;:::i;:::-;17017:139;;;;:::o;17162:86::-;17197:7;17237:4;17230:5;17226:16;17215:27;;17162:86;;;:::o;17254:118::-;17325:22;17341:5;17325:22;:::i;:::-;17318:5;17315:33;17305:61;;17362:1;17359;17352:12;17305:61;17254:118;:::o;17378:135::-;17422:5;17460:6;17447:20;17438:29;;17476:31;17501:5;17476:31;:::i;:::-;17378:135;;;;:::o;17519:761::-;17603:6;17611;17619;17627;17676:3;17664:9;17655:7;17651:23;17647:33;17644:120;;;17683:79;;:::i;:::-;17644:120;17803:1;17828:53;17873:7;17864:6;17853:9;17849:22;17828:53;:::i;:::-;17818:63;;17774:117;17930:2;17956:53;18001:7;17992:6;17981:9;17977:22;17956:53;:::i;:::-;17946:63;;17901:118;18058:2;18084:53;18129:7;18120:6;18109:9;18105:22;18084:53;:::i;:::-;18074:63;;18029:118;18186:2;18212:51;18255:7;18246:6;18235:9;18231:22;18212:51;:::i;:::-;18202:61;;18157:116;17519:761;;;;;;;:::o;18286:474::-;18354:6;18362;18411:2;18399:9;18390:7;18386:23;18382:32;18379:119;;;18417:79;;:::i;:::-;18379:119;18537:1;18562:53;18607:7;18598:6;18587:9;18583:22;18562:53;:::i;:::-;18552:63;;18508:117;18664:2;18690:53;18735:7;18726:6;18715:9;18711:22;18690:53;:::i;:::-;18680:63;;18635:118;18286:474;;;;;:::o;18766:182::-;18906:34;18902:1;18894:6;18890:14;18883:58;18766:182;:::o;18954:366::-;19096:3;19117:67;19181:2;19176:3;19117:67;:::i;:::-;19110:74;;19193:93;19282:3;19193:93;:::i;:::-;19311:2;19306:3;19302:12;19295:19;;18954:366;;;:::o;19326:419::-;19492:4;19530:2;19519:9;19515:18;19507:26;;19579:9;19573:4;19569:20;19565:1;19554:9;19550:17;19543:47;19607:131;19733:4;19607:131;:::i;:::-;19599:139;;19326:419;;;:::o;19751:180::-;19799:77;19796:1;19789:88;19896:4;19893:1;19886:15;19920:4;19917:1;19910:15;19937:320;19981:6;20018:1;20012:4;20008:12;19998:22;;20065:1;20059:4;20055:12;20086:18;20076:81;;20142:4;20134:6;20130:17;20120:27;;20076:81;20204:2;20196:6;20193:14;20173:18;20170:38;20167:84;;;20223:18;;:::i;:::-;20167:84;19988:269;19937:320;;;:::o;20263:232::-;20403:34;20399:1;20391:6;20387:14;20380:58;20472:15;20467:2;20459:6;20455:15;20448:40;20263:232;:::o;20501:366::-;20643:3;20664:67;20728:2;20723:3;20664:67;:::i;:::-;20657:74;;20740:93;20829:3;20740:93;:::i;:::-;20858:2;20853:3;20849:12;20842:19;;20501:366;;;:::o;20873:419::-;21039:4;21077:2;21066:9;21062:18;21054:26;;21126:9;21120:4;21116:20;21112:1;21101:9;21097:17;21090:47;21154:131;21280:4;21154:131;:::i;:::-;21146:139;;20873:419;;;:::o;21298:181::-;21438:33;21434:1;21426:6;21422:14;21415:57;21298:181;:::o;21485:366::-;21627:3;21648:67;21712:2;21707:3;21648:67;:::i;:::-;21641:74;;21724:93;21813:3;21724:93;:::i;:::-;21842:2;21837:3;21833:12;21826:19;;21485:366;;;:::o;21857:419::-;22023:4;22061:2;22050:9;22046:18;22038:26;;22110:9;22104:4;22100:20;22096:1;22085:9;22081:17;22074:47;22138:131;22264:4;22138:131;:::i;:::-;22130:139;;21857:419;;;:::o;22282:180::-;22422:32;22418:1;22410:6;22406:14;22399:56;22282:180;:::o;22468:366::-;22610:3;22631:67;22695:2;22690:3;22631:67;:::i;:::-;22624:74;;22707:93;22796:3;22707:93;:::i;:::-;22825:2;22820:3;22816:12;22809:19;;22468:366;;;:::o;22840:419::-;23006:4;23044:2;23033:9;23029:18;23021:26;;23093:9;23087:4;23083:20;23079:1;23068:9;23064:17;23057:47;23121:131;23247:4;23121:131;:::i;:::-;23113:139;;22840:419;;;:::o;23265:172::-;23405:24;23401:1;23393:6;23389:14;23382:48;23265:172;:::o;23443:366::-;23585:3;23606:67;23670:2;23665:3;23606:67;:::i;:::-;23599:74;;23682:93;23771:3;23682:93;:::i;:::-;23800:2;23795:3;23791:12;23784:19;;23443:366;;;:::o;23815:419::-;23981:4;24019:2;24008:9;24004:18;23996:26;;24068:9;24062:4;24058:20;24054:1;24043:9;24039:17;24032:47;24096:131;24222:4;24096:131;:::i;:::-;24088:139;;23815:419;;;:::o;24240:180::-;24288:77;24285:1;24278:88;24385:4;24382:1;24375:15;24409:4;24406:1;24399:15;24426:305;24466:3;24485:20;24503:1;24485:20;:::i;:::-;24480:25;;24519:20;24537:1;24519:20;:::i;:::-;24514:25;;24673:1;24605:66;24601:74;24598:1;24595:81;24592:107;;;24679:18;;:::i;:::-;24592:107;24723:1;24720;24716:9;24709:16;;24426:305;;;;:::o;24737:181::-;24877:33;24873:1;24865:6;24861:14;24854:57;24737:181;:::o;24924:366::-;25066:3;25087:67;25151:2;25146:3;25087:67;:::i;:::-;25080:74;;25163:93;25252:3;25163:93;:::i;:::-;25281:2;25276:3;25272:12;25265:19;;24924:366;;;:::o;25296:419::-;25462:4;25500:2;25489:9;25485:18;25477:26;;25549:9;25543:4;25539:20;25535:1;25524:9;25520:17;25513:47;25577:131;25703:4;25577:131;:::i;:::-;25569:139;;25296:419;;;:::o;25721:170::-;25861:22;25857:1;25849:6;25845:14;25838:46;25721:170;:::o;25897:366::-;26039:3;26060:67;26124:2;26119:3;26060:67;:::i;:::-;26053:74;;26136:93;26225:3;26136:93;:::i;:::-;26254:2;26249:3;26245:12;26238:19;;25897:366;;;:::o;26269:419::-;26435:4;26473:2;26462:9;26458:18;26450:26;;26522:9;26516:4;26512:20;26508:1;26497:9;26493:17;26486:47;26550:131;26676:4;26550:131;:::i;:::-;26542:139;;26269:419;;;:::o;26694:348::-;26734:7;26757:20;26775:1;26757:20;:::i;:::-;26752:25;;26791:20;26809:1;26791:20;:::i;:::-;26786:25;;26979:1;26911:66;26907:74;26904:1;26901:81;26896:1;26889:9;26882:17;26878:105;26875:131;;;26986:18;;:::i;:::-;26875:131;27034:1;27031;27027:9;27016:20;;26694:348;;;;:::o;27048:166::-;27188:18;27184:1;27176:6;27172:14;27165:42;27048:166;:::o;27220:366::-;27362:3;27383:67;27447:2;27442:3;27383:67;:::i;:::-;27376:74;;27459:93;27548:3;27459:93;:::i;:::-;27577:2;27572:3;27568:12;27561:19;;27220:366;;;:::o;27592:419::-;27758:4;27796:2;27785:9;27781:18;27773:26;;27845:9;27839:4;27835:20;27831:1;27820:9;27816:17;27809:47;27873:131;27999:4;27873:131;:::i;:::-;27865:139;;27592:419;;;:::o;28017:221::-;28157:34;28153:1;28145:6;28141:14;28134:58;28226:4;28221:2;28213:6;28209:15;28202:29;28017:221;:::o;28244:366::-;28386:3;28407:67;28471:2;28466:3;28407:67;:::i;:::-;28400:74;;28483:93;28572:3;28483:93;:::i;:::-;28601:2;28596:3;28592:12;28585:19;;28244:366;;;:::o;28616:419::-;28782:4;28820:2;28809:9;28805:18;28797:26;;28869:9;28863:4;28859:20;28855:1;28844:9;28840:17;28833:47;28897:131;29023:4;28897:131;:::i;:::-;28889:139;;28616:419;;;:::o;29041:244::-;29181:34;29177:1;29169:6;29165:14;29158:58;29250:27;29245:2;29237:6;29233:15;29226:52;29041:244;:::o;29291:366::-;29433:3;29454:67;29518:2;29513:3;29454:67;:::i;:::-;29447:74;;29530:93;29619:3;29530:93;:::i;:::-;29648:2;29643:3;29639:12;29632:19;;29291:366;;;:::o;29663:419::-;29829:4;29867:2;29856:9;29852:18;29844:26;;29916:9;29910:4;29906:20;29902:1;29891:9;29887:17;29880:47;29944:131;30070:4;29944:131;:::i;:::-;29936:139;;29663:419;;;:::o;30088:221::-;30228:34;30224:1;30216:6;30212:14;30205:58;30297:4;30292:2;30284:6;30280:15;30273:29;30088:221;:::o;30315:366::-;30457:3;30478:67;30542:2;30537:3;30478:67;:::i;:::-;30471:74;;30554:93;30643:3;30554:93;:::i;:::-;30672:2;30667:3;30663:12;30656:19;;30315:366;;;:::o;30687:419::-;30853:4;30891:2;30880:9;30876:18;30868:26;;30940:9;30934:4;30930:20;30926:1;30915:9;30911:17;30904:47;30968:131;31094:4;30968:131;:::i;:::-;30960:139;;30687:419;;;:::o;31112:233::-;31151:3;31174:24;31192:5;31174:24;:::i;:::-;31165:33;;31220:66;31213:5;31210:77;31207:103;;;31290:18;;:::i;:::-;31207:103;31337:1;31330:5;31326:13;31319:20;;31112:233;;;:::o;31351:::-;31491:34;31487:1;31479:6;31475:14;31468:58;31560:16;31555:2;31547:6;31543:15;31536:41;31351:233;:::o;31590:366::-;31732:3;31753:67;31817:2;31812:3;31753:67;:::i;:::-;31746:74;;31829:93;31918:3;31829:93;:::i;:::-;31947:2;31942:3;31938:12;31931:19;;31590:366;;;:::o;31962:419::-;32128:4;32166:2;32155:9;32151:18;32143:26;;32215:9;32209:4;32205:20;32201:1;32190:9;32186:17;32179:47;32243:131;32369:4;32243:131;:::i;:::-;32235:139;;31962:419;;;:::o;32387:226::-;32527:34;32523:1;32515:6;32511:14;32504:58;32596:9;32591:2;32583:6;32579:15;32572:34;32387:226;:::o;32619:366::-;32761:3;32782:67;32846:2;32841:3;32782:67;:::i;:::-;32775:74;;32858:93;32947:3;32858:93;:::i;:::-;32976:2;32971:3;32967:12;32960:19;;32619:366;;;:::o;32991:419::-;33157:4;33195:2;33184:9;33180:18;33172:26;;33244:9;33238:4;33234:20;33230:1;33219:9;33215:17;33208:47;33272:131;33398:4;33272:131;:::i;:::-;33264:139;;32991:419;;;:::o;33416:180::-;33464:77;33461:1;33454:88;33561:4;33558:1;33551:15;33585:4;33582:1;33575:15;33602:222;33742:34;33738:1;33730:6;33726:14;33719:58;33811:5;33806:2;33798:6;33794:15;33787:30;33602:222;:::o;33830:366::-;33972:3;33993:67;34057:2;34052:3;33993:67;:::i;:::-;33986:74;;34069:93;34158:3;34069:93;:::i;:::-;34187:2;34182:3;34178:12;34171:19;;33830:366;;;:::o;34202:419::-;34368:4;34406:2;34395:9;34391:18;34383:26;;34455:9;34449:4;34445:20;34441:1;34430:9;34426:17;34419:47;34483:131;34609:4;34483:131;:::i;:::-;34475:139;;34202:419;;;:::o;34627:191::-;34667:4;34687:20;34705:1;34687:20;:::i;:::-;34682:25;;34721:20;34739:1;34721:20;:::i;:::-;34716:25;;34760:1;34757;34754:8;34751:34;;;34765:18;;:::i;:::-;34751:34;34810:1;34807;34803:9;34795:17;;34627:191;;;;:::o;34824:222::-;34964:34;34960:1;34952:6;34948:14;34941:58;35033:5;35028:2;35020:6;35016:15;35009:30;34824:222;:::o;35052:366::-;35194:3;35215:67;35279:2;35274:3;35215:67;:::i;:::-;35208:74;;35291:93;35380:3;35291:93;:::i;:::-;35409:2;35404:3;35400:12;35393:19;;35052:366;;;:::o;35424:419::-;35590:4;35628:2;35617:9;35613:18;35605:26;;35677:9;35671:4;35667:20;35663:1;35652:9;35648:17;35641:47;35705:131;35831:4;35705:131;:::i;:::-;35697:139;;35424:419;;;:::o;35849:230::-;35989:34;35985:1;35977:6;35973:14;35966:58;36058:13;36053:2;36045:6;36041:15;36034:38;35849:230;:::o;36085:366::-;36227:3;36248:67;36312:2;36307:3;36248:67;:::i;:::-;36241:74;;36324:93;36413:3;36324:93;:::i;:::-;36442:2;36437:3;36433:12;36426:19;;36085:366;;;:::o;36457:419::-;36623:4;36661:2;36650:9;36646:18;36638:26;;36710:9;36704:4;36700:20;36696:1;36685:9;36681:17;36674:47;36738:131;36864:4;36738:131;:::i;:::-;36730:139;;36457:419;;;:::o;36882:176::-;37022:28;37018:1;37010:6;37006:14;36999:52;36882:176;:::o;37064:366::-;37206:3;37227:67;37291:2;37286:3;37227:67;:::i;:::-;37220:74;;37303:93;37392:3;37303:93;:::i;:::-;37421:2;37416:3;37412:12;37405:19;;37064:366;;;:::o;37436:419::-;37602:4;37640:2;37629:9;37625:18;37617:26;;37689:9;37683:4;37679:20;37675:1;37664:9;37660:17;37653:47;37717:131;37843:4;37717:131;:::i;:::-;37709:139;;37436:419;;;:::o;37861:180::-;37909:77;37906:1;37899:88;38006:4;38003:1;37996:15;38030:4;38027:1;38020:15;38047:185;38087:1;38104:20;38122:1;38104:20;:::i;:::-;38099:25;;38138:20;38156:1;38138:20;:::i;:::-;38133:25;;38177:1;38167:35;;38182:18;;:::i;:::-;38167:35;38224:1;38221;38217:9;38212:14;;38047:185;;;;:::o;38238:238::-;38378:34;38374:1;38366:6;38362:14;38355:58;38447:21;38442:2;38434:6;38430:15;38423:46;38238:238;:::o;38482:366::-;38624:3;38645:67;38709:2;38704:3;38645:67;:::i;:::-;38638:74;;38721:93;38810:3;38721:93;:::i;:::-;38839:2;38834:3;38830:12;38823:19;;38482:366;;;:::o;38854:419::-;39020:4;39058:2;39047:9;39043:18;39035:26;;39107:9;39101:4;39097:20;39093:1;39082:9;39078:17;39071:47;39135:131;39261:4;39135:131;:::i;:::-;39127:139;;38854:419;;;:::o;39279:85::-;39324:7;39353:5;39342:16;;39279:85;;;:::o;39370:60::-;39398:3;39419:5;39412:12;;39370:60;;;:::o;39436:154::-;39492:9;39525:59;39541:42;39550:32;39576:5;39550:32;:::i;:::-;39541:42;:::i;:::-;39525:59;:::i;:::-;39512:72;;39436:154;;;:::o;39596:143::-;39689:43;39726:5;39689:43;:::i;:::-;39684:3;39677:56;39596:143;;:::o;39745:344::-;39872:4;39910:2;39899:9;39895:18;39887:26;;39923:77;39997:1;39986:9;39982:17;39973:6;39923:77;:::i;:::-;40010:72;40078:2;40067:9;40063:18;40054:6;40010:72;:::i;:::-;39745:344;;;;;:::o;40095:118::-;40182:24;40200:5;40182:24;:::i;:::-;40177:3;40170:37;40095:118;;:::o;40219:112::-;40302:22;40318:5;40302:22;:::i;:::-;40297:3;40290:35;40219:112;;:::o;40337:545::-;40510:4;40548:3;40537:9;40533:19;40525:27;;40562:71;40630:1;40619:9;40615:17;40606:6;40562:71;:::i;:::-;40643:68;40707:2;40696:9;40692:18;40683:6;40643:68;:::i;:::-;40721:72;40789:2;40778:9;40774:18;40765:6;40721:72;:::i;:::-;40803;40871:2;40860:9;40856:18;40847:6;40803:72;:::i;:::-;40337:545;;;;;;;:::o;40888:174::-;41028:26;41024:1;41016:6;41012:14;41005:50;40888:174;:::o;41068:366::-;41210:3;41231:67;41295:2;41290:3;41231:67;:::i;:::-;41224:74;;41307:93;41396:3;41307:93;:::i;:::-;41425:2;41420:3;41416:12;41409:19;;41068:366;;;:::o;41440:419::-;41606:4;41644:2;41633:9;41629:18;41621:26;;41693:9;41687:4;41683:20;41679:1;41668:9;41664:17;41657:47;41721:131;41847:4;41721:131;:::i;:::-;41713:139;;41440:419;;;:::o;41865:174::-;42005:26;42001:1;41993:6;41989:14;41982:50;41865:174;:::o;42045:366::-;42187:3;42208:67;42272:2;42267:3;42208:67;:::i;:::-;42201:74;;42284:93;42373:3;42284:93;:::i;:::-;42402:2;42397:3;42393:12;42386:19;;42045:366;;;:::o;42417:419::-;42583:4;42621:2;42610:9;42606:18;42598:26;;42670:9;42664:4;42660:20;42656:1;42645:9;42641:17;42634:47;42698:131;42824:4;42698:131;:::i;:::-;42690:139;;42417:419;;;:::o;42842:234::-;42982:34;42978:1;42970:6;42966:14;42959:58;43051:17;43046:2;43038:6;43034:15;43027:42;42842:234;:::o;43082:366::-;43224:3;43245:67;43309:2;43304:3;43245:67;:::i;:::-;43238:74;;43321:93;43410:3;43321:93;:::i;:::-;43439:2;43434:3;43430:12;43423:19;;43082:366;;;:::o;43454:419::-;43620:4;43658:2;43647:9;43643:18;43635:26;;43707:9;43701:4;43697:20;43693:1;43682:9;43678:17;43671:47;43735:131;43861:4;43735:131;:::i;:::-;43727:139;;43454:419;;;:::o;43879:148::-;43981:11;44018:3;44003:18;;43879:148;;;;:::o;44033:377::-;44139:3;44167:39;44200:5;44167:39;:::i;:::-;44222:89;44304:6;44299:3;44222:89;:::i;:::-;44215:96;;44320:52;44365:6;44360:3;44353:4;44346:5;44342:16;44320:52;:::i;:::-;44397:6;44392:3;44388:16;44381:23;;44143:267;44033:377;;;;:::o;44416:435::-;44596:3;44618:95;44709:3;44700:6;44618:95;:::i;:::-;44611:102;;44730:95;44821:3;44812:6;44730:95;:::i;:::-;44723:102;;44842:3;44835:10;;44416:435;;;;;:::o;44857:147::-;44958:11;44995:3;44980:18;;44857:147;;;;:::o;45010:114::-;;:::o;45130:398::-;45289:3;45310:83;45391:1;45386:3;45310:83;:::i;:::-;45303:90;;45402:93;45491:3;45402:93;:::i;:::-;45520:1;45515:3;45511:11;45504:18;;45130:398;;;:::o;45534:379::-;45718:3;45740:147;45883:3;45740:147;:::i;:::-;45733:154;;45904:3;45897:10;;45534:379;;;:::o;45919:174::-;46059:26;46055:1;46047:6;46043:14;46036:50;45919:174;:::o;46099:366::-;46241:3;46262:67;46326:2;46321:3;46262:67;:::i;:::-;46255:74;;46338:93;46427:3;46338:93;:::i;:::-;46456:2;46451:3;46447:12;46440:19;;46099:366;;;:::o;46471:419::-;46637:4;46675:2;46664:9;46660:18;46652:26;;46724:9;46718:4;46714:20;46710:1;46699:9;46695:17;46688:47;46752:131;46878:4;46752:131;:::i;:::-;46744:139;;46471:419;;;:::o;46896:225::-;47036:34;47032:1;47024:6;47020:14;47013:58;47105:8;47100:2;47092:6;47088:15;47081:33;46896:225;:::o;47127:366::-;47269:3;47290:67;47354:2;47349:3;47290:67;:::i;:::-;47283:74;;47366:93;47455:3;47366:93;:::i;:::-;47484:2;47479:3;47475:12;47468:19;;47127:366;;;:::o;47499:419::-;47665:4;47703:2;47692:9;47688:18;47680:26;;47752:9;47746:4;47742:20;47738:1;47727:9;47723:17;47716:47;47780:131;47906:4;47780:131;:::i;:::-;47772:139;;47499:419;;;:::o;47924:220::-;48064:34;48060:1;48052:6;48048:14;48041:58;48133:3;48128:2;48120:6;48116:15;48109:28;47924:220;:::o;48150:366::-;48292:3;48313:67;48377:2;48372:3;48313:67;:::i;:::-;48306:74;;48389:93;48478:3;48389:93;:::i;:::-;48507:2;48502:3;48498:12;48491:19;;48150:366;;;:::o;48522:419::-;48688:4;48726:2;48715:9;48711:18;48703:26;;48775:9;48769:4;48765:20;48761:1;48750:9;48746:17;48739:47;48803:131;48929:4;48803:131;:::i;:::-;48795:139;;48522:419;;;:::o;48947:179::-;49087:31;49083:1;49075:6;49071:14;49064:55;48947:179;:::o;49132:366::-;49274:3;49295:67;49359:2;49354:3;49295:67;:::i;:::-;49288:74;;49371:93;49460:3;49371:93;:::i;:::-;49489:2;49484:3;49480:12;49473:19;;49132:366;;;:::o;49504:419::-;49670:4;49708:2;49697:9;49693:18;49685:26;;49757:9;49751:4;49747:20;49743:1;49732:9;49728:17;49721:47;49785:131;49911:4;49785:131;:::i;:::-;49777:139;;49504:419;;;:::o;49929:222::-;50069:34;50065:1;50057:6;50053:14;50046:58;50138:5;50133:2;50125:6;50121:15;50114:30;49929:222;:::o;50157:366::-;50299:3;50320:67;50384:2;50379:3;50320:67;:::i;:::-;50313:74;;50396:93;50485:3;50396:93;:::i;:::-;50514:2;50509:3;50505:12;50498:19;;50157:366;;;:::o;50529:419::-;50695:4;50733:2;50722:9;50718:18;50710:26;;50782:9;50776:4;50772:20;50768:1;50757:9;50753:17;50746:47;50810:131;50936:4;50810:131;:::i;:::-;50802:139;;50529:419;;;:::o;50954:118::-;50991:7;51031:34;51024:5;51020:46;51009:57;;50954:118;;;:::o;51078:273::-;51118:3;51137:20;51155:1;51137:20;:::i;:::-;51132:25;;51171:20;51189:1;51171:20;:::i;:::-;51166:25;;51293:1;51257:34;51253:42;51250:1;51247:49;51244:75;;;51299:18;;:::i;:::-;51244:75;51343:1;51340;51336:9;51329:16;;51078:273;;;;:::o;51357:237::-;51497:34;51493:1;51485:6;51481:14;51474:58;51566:20;51561:2;51553:6;51549:15;51542:45;51357:237;:::o;51600:366::-;51742:3;51763:67;51827:2;51822:3;51763:67;:::i;:::-;51756:74;;51839:93;51928:3;51839:93;:::i;:::-;51957:2;51952:3;51948:12;51941:19;;51600:366;;;:::o;51972:419::-;52138:4;52176:2;52165:9;52161:18;52153:26;;52225:9;52219:4;52215:20;52211:1;52200:9;52196:17;52189:47;52253:131;52379:4;52253:131;:::i;:::-;52245:139;;51972:419;;;:::o;52397:225::-;52537:34;52533:1;52525:6;52521:14;52514:58;52606:8;52601:2;52593:6;52589:15;52582:33;52397:225;:::o;52628:366::-;52770:3;52791:67;52855:2;52850:3;52791:67;:::i;:::-;52784:74;;52867:93;52956:3;52867:93;:::i;:::-;52985:2;52980:3;52976:12;52969:19;;52628:366;;;:::o;53000:419::-;53166:4;53204:2;53193:9;53189:18;53181:26;;53253:9;53247:4;53243:20;53239:1;53228:9;53224:17;53217:47;53281:131;53407:4;53281:131;:::i;:::-;53273:139;;53000:419;;;:::o;53425:224::-;53565:34;53561:1;53553:6;53549:14;53542:58;53634:7;53629:2;53621:6;53617:15;53610:32;53425:224;:::o;53655:366::-;53797:3;53818:67;53882:2;53877:3;53818:67;:::i;:::-;53811:74;;53894:93;53983:3;53894:93;:::i;:::-;54012:2;54007:3;54003:12;53996:19;;53655:366;;;:::o;54027:419::-;54193:4;54231:2;54220:9;54216:18;54208:26;;54280:9;54274:4;54270:20;54266:1;54255:9;54251:17;54244:47;54308:131;54434:4;54308:131;:::i;:::-;54300:139;;54027:419;;;:::o;54452:221::-;54592:34;54588:1;54580:6;54576:14;54569:58;54661:4;54656:2;54648:6;54644:15;54637:29;54452:221;:::o;54679:366::-;54821:3;54842:67;54906:2;54901:3;54842:67;:::i;:::-;54835:74;;54918:93;55007:3;54918:93;:::i;:::-;55036:2;55031:3;55027:12;55020:19;;54679:366;;;:::o;55051:419::-;55217:4;55255:2;55244:9;55240:18;55232:26;;55304:9;55298:4;55294:20;55290:1;55279:9;55275:17;55268:47;55332:131;55458:4;55332:131;:::i;:::-;55324:139;;55051:419;;;:::o;55476:170::-;55616:22;55612:1;55604:6;55600:14;55593:46;55476:170;:::o;55652:366::-;55794:3;55815:67;55879:2;55874:3;55815:67;:::i;:::-;55808:74;;55891:93;55980:3;55891:93;:::i;:::-;56009:2;56004:3;56000:12;55993:19;;55652:366;;;:::o;56024:419::-;56190:4;56228:2;56217:9;56213:18;56205:26;;56277:9;56271:4;56267:20;56263:1;56252:9;56248:17;56241:47;56305:131;56431:4;56305:131;:::i;:::-;56297:139;;56024:419;;;:::o;56449:178::-;56589:30;56585:1;56577:6;56573:14;56566:54;56449:178;:::o;56633:366::-;56775:3;56796:67;56860:2;56855:3;56796:67;:::i;:::-;56789:74;;56872:93;56961:3;56872:93;:::i;:::-;56990:2;56985:3;56981:12;56974:19;;56633:366;;;:::o;57005:419::-;57171:4;57209:2;57198:9;57194:18;57186:26;;57258:9;57252:4;57248:20;57244:1;57233:9;57229:17;57222:47;57286:131;57412:4;57286:131;:::i;:::-;57278:139;;57005:419;;;:::o;57430:229::-;57570:34;57566:1;57558:6;57554:14;57547:58;57639:12;57634:2;57626:6;57622:15;57615:37;57430:229;:::o;57665:366::-;57807:3;57828:67;57892:2;57887:3;57828:67;:::i;:::-;57821:74;;57904:93;57993:3;57904:93;:::i;:::-;58022:2;58017:3;58013:12;58006:19;;57665:366;;;:::o;58037:419::-;58203:4;58241:2;58230:9;58226:18;58218:26;;58290:9;58284:4;58280:20;58276:1;58265:9;58261:17;58254:47;58318:131;58444:4;58318:131;:::i;:::-;58310:139;;58037:419;;;:::o;58462:171::-;58501:3;58524:24;58542:5;58524:24;:::i;:::-;58515:33;;58570:4;58563:5;58560:15;58557:41;;;58578:18;;:::i;:::-;58557:41;58625:1;58618:5;58614:13;58607:20;;58462:171;;;:::o;59676:98::-;59727:6;59761:5;59755:12;59745:22;;59676:98;;;:::o;59780:168::-;59863:11;59897:6;59892:3;59885:19;59937:4;59932:3;59928:14;59913:29;;59780:168;;;;:::o;59954:360::-;60040:3;60068:38;60100:5;60068:38;:::i;:::-;60122:70;60185:6;60180:3;60122:70;:::i;:::-;60115:77;;60201:52;60246:6;60241:3;60234:4;60227:5;60223:16;60201:52;:::i;:::-;60278:29;60300:6;60278:29;:::i;:::-;60273:3;60269:39;60262:46;;60044:270;59954:360;;;;:::o;60320:640::-;60515:4;60553:3;60542:9;60538:19;60530:27;;60567:71;60635:1;60624:9;60620:17;60611:6;60567:71;:::i;:::-;60648:72;60716:2;60705:9;60701:18;60692:6;60648:72;:::i;:::-;60730;60798:2;60787:9;60783:18;60774:6;60730:72;:::i;:::-;60849:9;60843:4;60839:20;60834:2;60823:9;60819:18;60812:48;60877:76;60948:4;60939:6;60877:76;:::i;:::-;60869:84;;60320:640;;;;;;;:::o;60966:141::-;61022:5;61053:6;61047:13;61038:22;;61069:32;61095:5;61069:32;:::i;:::-;60966:141;;;;:::o;61113:349::-;61182:6;61231:2;61219:9;61210:7;61206:23;61202:32;61199:119;;;61237:79;;:::i;:::-;61199:119;61357:1;61382:63;61437:7;61428:6;61417:9;61413:22;61382:63;:::i;:::-;61372:73;;61328:127;61113:349;;;;:::o;61468:176::-;61500:1;61517:20;61535:1;61517:20;:::i;:::-;61512:25;;61551:20;61569:1;61551:20;:::i;:::-;61546:25;;61590:1;61580:35;;61595:18;;:::i;:::-;61580:35;61636:1;61633;61629:9;61624:14;;61468:176;;;;:::o;61650:236::-;61790:34;61786:1;61778:6;61774:14;61767:58;61859:19;61854:2;61846:6;61842:15;61835:44;61650:236;:::o;61892:366::-;62034:3;62055:67;62119:2;62114:3;62055:67;:::i;:::-;62048:74;;62131:93;62220:3;62131:93;:::i;:::-;62249:2;62244:3;62240:12;62233:19;;61892:366;;;:::o;62264:419::-;62430:4;62468:2;62457:9;62453:18;62445:26;;62517:9;62511:4;62507:20;62503:1;62492:9;62488:17;62481:47;62545:131;62671:4;62545:131;:::i;:::-;62537:139;;62264:419;;;:::o

Swarm Source

ipfs://268a25d8423d1a7c7fe6fd2f8c4e5850a3c01f159a5ff04b77a0293dceb56e5a
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.