ETH Price: $3,381.22 (-1.18%)

Oinkers (OINK)
 

Overview

TokenID

4288

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

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

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

Contract Source Code Verified (Exact Match)

Contract Name:
Oinkers

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-06-16
*/

/**
 *Submitted for verification at Etherscan.io on 2023-02-24
*/

/**

            (\____/)
            / @__@ \
           (  (oo)  )
            `-.~~.-'
             /    \
           @/      \_
          (/ /    \ \)
      ___  WW`----'WW

      https://www.oinkersonly.xyz/
      https://twitter.com/OinkersOnly
 */
// SPDX-License-Identifier: MIT

// 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/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/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 v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/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 v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/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: contracts/new.sol




pragma solidity ^0.8.4;








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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

    // Mapping owner address to address data
    mapping(address => AddressData) 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_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

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

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

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

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual 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) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        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 = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

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

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

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

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

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

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

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

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

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

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

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

        address from = prevOwnership.addr;

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

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

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

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

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

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

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

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

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

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

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

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);
    }
}
pragma solidity ^0.8.13;

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



abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry constant operatorFilterRegistry =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

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

    modifier onlyAllowedOperator(address from) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(operatorFilterRegistry).code.length > 0) {
            // Allow spending tokens from addresses with balance
            // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
            // from an EOA.
            if (from == msg.sender) {
                _;
                return;
            }
            if (
                !(
                    operatorFilterRegistry.isOperatorAllowed(address(this), msg.sender)
                        && operatorFilterRegistry.isOperatorAllowed(address(this), from)
                )
            ) {
                revert OperatorNotAllowed(msg.sender);
            }
        }
        _;
    }
}
pragma solidity ^0.8.13;



abstract contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}
    pragma solidity ^0.8.7;
    
    contract Oinkers is ERC721A, DefaultOperatorFilterer , Ownable {
    using Strings for uint256;


  string private uriPrefix ;
  string private uriSuffix = ".json";
  string public hiddenURL;

  uint256 public cost = 0.003 ether;
 

    uint16 public maxSupply = 5555;
    uint8 public maxMintAmountPerTx = 20;
    uint8 public maxFreeMintAmountPerWallet = 1;
                                                             
 
  bool public paused = true;
  bool public reveal =false;

   mapping (address => uint8) public NFTPerPublicAddress;


  constructor() ERC721A("Oinkers", "OINK") {
  }


  
 
  function publicMint(uint8 _mintAmount) external payable  {
     uint16 totalSupply = uint16(totalSupply());
     uint8 nft = NFTPerPublicAddress[msg.sender];
    require(totalSupply + _mintAmount <= maxSupply, "Exceeds max supply.");
    require(_mintAmount + nft <= maxMintAmountPerTx, "Exceeds max per transaction.");

    require(!paused, "The contract is paused!");
    
      if(nft >= maxFreeMintAmountPerWallet)
        {
        require(msg.value >= cost * _mintAmount, "Insufficient funds!");
        }
    else {
         uint8 costAmount = _mintAmount + nft;
        if(costAmount > maxFreeMintAmountPerWallet)
       {
        costAmount = costAmount - maxFreeMintAmountPerWallet;
        require(msg.value >= cost * costAmount, "Insufficient funds!");
       }
    }
    _safeMint(msg.sender , _mintAmount);
    NFTPerPublicAddress[msg.sender] = _mintAmount + nft;
     
     delete totalSupply;
     delete _mintAmount;
  }
  
  function Treasury(uint16 _mintAmount, address _receiver) external onlyOwner {
     uint16 totalSupply = uint16(totalSupply());
    require(totalSupply + _mintAmount <= maxSupply, "Exceeds max supply.");
     _safeMint(_receiver , _mintAmount);
     delete _mintAmount;
     delete _receiver;
     delete totalSupply;
  }

  function  SendNFT(uint8 _amountPerAddress, address[] calldata addresses) external onlyOwner {
     uint16 totalSupply = uint16(totalSupply());
     uint totalAmount =   _amountPerAddress * addresses.length;
    require(totalSupply + totalAmount <= maxSupply, "Exceeds max supply.");
     for (uint256 i = 0; i < addresses.length; i++) {
            _safeMint(addresses[i], _amountPerAddress);
        }

     delete _amountPerAddress;
     delete totalSupply;
  }

 

  function setMaxSupply(uint16 _maxSupply) external onlyOwner {
      maxSupply = _maxSupply;
  }



   
  function tokenURI(uint256 _tokenId)
    public
    view
    virtual
    override
    returns (string memory)
  {
    require(
      _exists(_tokenId),
      "ERC721Metadata: URI query for nonexistent token"
    );
    
  
if ( reveal == false)
{
    return hiddenURL;
}
    

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


 function setFreeMaxLimit(uint8 _limit) external onlyOwner{
    maxFreeMintAmountPerWallet = _limit;
   delete _limit;

}

    
  

  function setUriPrefix(string memory _uriPrefix) external onlyOwner {
    uriPrefix = _uriPrefix;
  }
   function setHiddenUri(string memory _uriPrefix) external onlyOwner {
    hiddenURL = _uriPrefix;
  }


  function togglePaused() external onlyOwner {
    paused = !paused;
   
  }

  function setCost(uint _cost) external onlyOwner{
      cost = _cost;

  }

 function setRevealed() external onlyOwner{
     reveal = !reveal;
 }

  function setMaxMintPerTx(uint8 _maxtx) external onlyOwner{
      maxMintAmountPerTx = _maxtx;

  }

 

  function withdraw() external onlyOwner {
  uint _balance = address(this).balance;
     payable(msg.sender).transfer(_balance ); 
       
  }


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

    function transferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) {
        super.transferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) {
        super.safeTransferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data)
        public
        override
        onlyAllowedOperator(from)
    {
        super.safeTransferFrom(from, to, tokenId, data);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"NFTPerPublicAddress","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_amountPerAddress","type":"uint8"},{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"SendNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_mintAmount","type":"uint16"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"Treasury","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":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenURL","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"maxFreeMintAmountPerWallet","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerTx","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_mintAmount","type":"uint8"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_limit","type":"uint8"}],"name":"setFreeMaxLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setHiddenUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_maxtx","type":"uint8"}],"name":"setMaxMintPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_maxSupply","type":"uint16"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"togglePaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600a90816200004a91906200071a565b50660aa87bee538000600c556115b3600d60006101000a81548161ffff021916908361ffff1602179055506014600d60026101000a81548160ff021916908360ff1602179055506001600d60036101000a81548160ff021916908360ff1602179055506001600d60046101000a81548160ff0219169083151502179055506000600d60056101000a81548160ff021916908315150217905550348015620000f057600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600781526020017f4f696e6b657273000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4f494e4b0000000000000000000000000000000000000000000000000000000081525081600290816200018591906200071a565b5080600390816200019791906200071a565b50620001a8620003cd60201b60201c565b600081905550505060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115620003a55780156200026b576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b81526004016200023192919062000846565b600060405180830381600087803b1580156200024c57600080fd5b505af115801562000261573d6000803e3d6000fd5b50505050620003a4565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000325576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b8152600401620002eb92919062000846565b600060405180830381600087803b1580156200030657600080fd5b505af11580156200031b573d6000803e3d6000fd5b50505050620003a3565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b81526004016200036e919062000873565b600060405180830381600087803b1580156200038957600080fd5b505af11580156200039e573d6000803e3d6000fd5b505050505b5b5b5050620003c7620003bb620003d260201b60201c565b620003da60201b60201c565b62000890565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200052257607f821691505b602082108103620005385762000537620004da565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620005a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000563565b620005ae868362000563565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620005fb620005f5620005ef84620005c6565b620005d0565b620005c6565b9050919050565b6000819050919050565b6200061783620005da565b6200062f620006268262000602565b84845462000570565b825550505050565b600090565b6200064662000637565b620006538184846200060c565b505050565b5b818110156200067b576200066f6000826200063c565b60018101905062000659565b5050565b601f821115620006ca5762000694816200053e565b6200069f8462000553565b81016020851015620006af578190505b620006c7620006be8562000553565b83018262000658565b50505b505050565b600082821c905092915050565b6000620006ef60001984600802620006cf565b1980831691505092915050565b60006200070a8383620006dc565b9150826002028217905092915050565b6200072582620004a0565b67ffffffffffffffff811115620007415762000740620004ab565b5b6200074d825462000509565b6200075a8282856200067f565b600060209050601f8311600181146200079257600084156200077d578287015190505b620007898582620006fc565b865550620007f9565b601f198416620007a2866200053e565b60005b82811015620007cc57848901518255600182019150602085019450602081019050620007a5565b86831015620007ec5784890151620007e8601f891682620006dc565b8355505b6001600288020188555050505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200082e8262000801565b9050919050565b620008408162000821565b82525050565b60006040820190506200085d600083018562000835565b6200086c602083018462000835565b9392505050565b60006020820190506200088a600083018462000835565b92915050565b61496e80620008a06000396000f3fe6080604052600436106102195760003560e01c806370a0823111610123578063b88d4fde116100ab578063e94053c71161006f578063e94053c71461075f578063e985e9c51461079c578063eef440af146107d9578063f2fde38b14610804578063f8bf51721461082d57610219565b8063b88d4fde1461067c578063b8a9d115146106a5578063bb438fea146106ce578063c87b56dd146106f7578063d5abeb011461073457610219565b80638da5cb5b116100f25780638da5cb5b146105a757806394354fd0146105d257806395d89b41146105fd578063a22cb46514610628578063a475b5dd1461065157610219565b806370a082311461050e578063715018a61461054b5780637ec4a65914610562578063858e83b51461058b57610219565b806323b872dd116101a657806342842e0e1161017557806342842e0e1461042b57806344a0d68a146104545780635c975abb1461047d578063622e4e78146104a85780636352211e146104d157610219565b806323b872dd146103bd57806336566f06146103e65780633bd64968146103fd5780633ccfd60b1461041457610219565b8063081812fc116101ed578063081812fc146102d8578063095ea7b3146103155780631067fcc71461033e57806313faede61461036757806318160ddd1461039257610219565b8062a4f1f21461021e57806301ffc9a71461024757806306421c2f1461028457806306fdde03146102ad575b600080fd5b34801561022a57600080fd5b50610245600480360381019061024091906135e3565b610858565b005b34801561025357600080fd5b5061026e60048036038101906102699190613668565b6108f6565b60405161027b91906136b0565b60405180910390f35b34801561029057600080fd5b506102ab60048036038101906102a69190613705565b6109d8565b005b3480156102b957600080fd5b506102c2610a74565b6040516102cf91906137c2565b60405180910390f35b3480156102e457600080fd5b506102ff60048036038101906102fa919061381a565b610b06565b60405161030c9190613888565b60405180910390f35b34801561032157600080fd5b5061033c600480360381019061033791906138cf565b610b82565b005b34801561034a57600080fd5b5061036560048036038101906103609190613a44565b610c8c565b005b34801561037357600080fd5b5061037c610d1b565b6040516103899190613a9c565b60405180910390f35b34801561039e57600080fd5b506103a7610d21565b6040516103b49190613a9c565b60405180910390f35b3480156103c957600080fd5b506103e460048036038101906103df9190613ab7565b610d38565b005b3480156103f257600080fd5b506103fb610f1a565b005b34801561040957600080fd5b50610412610fc2565b005b34801561042057600080fd5b5061042961106a565b005b34801561043757600080fd5b50610452600480360381019061044d9190613ab7565b611135565b005b34801561046057600080fd5b5061047b6004803603810190610476919061381a565b611317565b005b34801561048957600080fd5b5061049261139d565b60405161049f91906136b0565b60405180910390f35b3480156104b457600080fd5b506104cf60048036038101906104ca91906135e3565b6113b0565b005b3480156104dd57600080fd5b506104f860048036038101906104f3919061381a565b61144a565b6040516105059190613888565b60405180910390f35b34801561051a57600080fd5b5061053560048036038101906105309190613b0a565b611460565b6040516105429190613a9c565b60405180910390f35b34801561055757600080fd5b5061056061152f565b005b34801561056e57600080fd5b5061058960048036038101906105849190613a44565b6115b7565b005b6105a560048036038101906105a091906135e3565b611646565b005b3480156105b357600080fd5b506105bc611950565b6040516105c99190613888565b60405180910390f35b3480156105de57600080fd5b506105e761197a565b6040516105f49190613b46565b60405180910390f35b34801561060957600080fd5b5061061261198d565b60405161061f91906137c2565b60405180910390f35b34801561063457600080fd5b5061064f600480360381019061064a9190613b8d565b611a1f565b005b34801561065d57600080fd5b50610666611b96565b60405161067391906136b0565b60405180910390f35b34801561068857600080fd5b506106a3600480360381019061069e9190613c6e565b611ba9565b005b3480156106b157600080fd5b506106cc60048036038101906106c79190613d51565b611d8e565b005b3480156106da57600080fd5b506106f560048036038101906106f09190613db1565b611ef7565b005b34801561070357600080fd5b5061071e6004803603810190610719919061381a565b612004565b60405161072b91906137c2565b60405180910390f35b34801561074057600080fd5b5061074961215c565b6040516107569190613e00565b60405180910390f35b34801561076b57600080fd5b5061078660048036038101906107819190613b0a565b612170565b6040516107939190613b46565b60405180910390f35b3480156107a857600080fd5b506107c360048036038101906107be9190613e1b565b612190565b6040516107d091906136b0565b60405180910390f35b3480156107e557600080fd5b506107ee612224565b6040516107fb91906137c2565b60405180910390f35b34801561081057600080fd5b5061082b60048036038101906108269190613b0a565b6122b2565b005b34801561083957600080fd5b506108426123a9565b60405161084f9190613b46565b60405180910390f35b6108606123bc565b73ffffffffffffffffffffffffffffffffffffffff1661087e611950565b73ffffffffffffffffffffffffffffffffffffffff16146108d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108cb90613ea7565b60405180910390fd5b80600d60036101000a81548160ff021916908360ff1602179055506000905050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109c157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109d157506109d0826123c4565b5b9050919050565b6109e06123bc565b73ffffffffffffffffffffffffffffffffffffffff166109fe611950565b73ffffffffffffffffffffffffffffffffffffffff1614610a54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4b90613ea7565b60405180910390fd5b80600d60006101000a81548161ffff021916908361ffff16021790555050565b606060028054610a8390613ef6565b80601f0160208091040260200160405190810160405280929190818152602001828054610aaf90613ef6565b8015610afc5780601f10610ad157610100808354040283529160200191610afc565b820191906000526020600020905b815481529060010190602001808311610adf57829003601f168201915b5050505050905090565b6000610b118261242e565b610b47576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b8d8261144a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610bf4576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c136123bc565b73ffffffffffffffffffffffffffffffffffffffff1614158015610c455750610c4381610c3e6123bc565b612190565b155b15610c7c576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c8783838361247c565b505050565b610c946123bc565b73ffffffffffffffffffffffffffffffffffffffff16610cb2611950565b73ffffffffffffffffffffffffffffffffffffffff1614610d08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cff90613ea7565b60405180910390fd5b80600b9081610d1791906140d3565b5050565b600c5481565b6000610d2b61252e565b6001546000540303905090565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610f08573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610daa57610da5848484612533565b610f14565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610df39291906141a5565b602060405180830381865afa158015610e10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3491906141e3565b8015610ec657506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610e849291906141a5565b602060405180830381865afa158015610ea1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec591906141e3565b5b610f0757336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610efe9190613888565b60405180910390fd5b5b610f13848484612533565b5b50505050565b610f226123bc565b73ffffffffffffffffffffffffffffffffffffffff16610f40611950565b73ffffffffffffffffffffffffffffffffffffffff1614610f96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8d90613ea7565b60405180910390fd5b600d60049054906101000a900460ff1615600d60046101000a81548160ff021916908315150217905550565b610fca6123bc565b73ffffffffffffffffffffffffffffffffffffffff16610fe8611950565b73ffffffffffffffffffffffffffffffffffffffff161461103e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103590613ea7565b60405180910390fd5b600d60059054906101000a900460ff1615600d60056101000a81548160ff021916908315150217905550565b6110726123bc565b73ffffffffffffffffffffffffffffffffffffffff16611090611950565b73ffffffffffffffffffffffffffffffffffffffff16146110e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110dd90613ea7565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611131573d6000803e3d6000fd5b5050565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611305573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036111a7576111a2848484612543565b611311565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016111f09291906141a5565b602060405180830381865afa15801561120d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061123191906141e3565b80156112c357506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016112819291906141a5565b602060405180830381865afa15801561129e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c291906141e3565b5b61130457336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016112fb9190613888565b60405180910390fd5b5b611310848484612543565b5b50505050565b61131f6123bc565b73ffffffffffffffffffffffffffffffffffffffff1661133d611950565b73ffffffffffffffffffffffffffffffffffffffff1614611393576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138a90613ea7565b60405180910390fd5b80600c8190555050565b600d60049054906101000a900460ff1681565b6113b86123bc565b73ffffffffffffffffffffffffffffffffffffffff166113d6611950565b73ffffffffffffffffffffffffffffffffffffffff161461142c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142390613ea7565b60405180910390fd5b80600d60026101000a81548160ff021916908360ff16021790555050565b600061145582612563565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036114c7576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6115376123bc565b73ffffffffffffffffffffffffffffffffffffffff16611555611950565b73ffffffffffffffffffffffffffffffffffffffff16146115ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a290613ea7565b60405180910390fd5b6115b560006127f2565b565b6115bf6123bc565b73ffffffffffffffffffffffffffffffffffffffff166115dd611950565b73ffffffffffffffffffffffffffffffffffffffff1614611633576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162a90613ea7565b60405180910390fd5b806009908161164291906140d3565b5050565b6000611650610d21565b90506000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050600d60009054906101000a900461ffff1661ffff168360ff16836116c7919061423f565b61ffff16111561170c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611703906142c1565b60405180910390fd5b600d60029054906101000a900460ff1660ff16818461172b91906142e1565b60ff16111561176f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176690614362565b60405180910390fd5b600d60049054906101000a900460ff16156117bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b6906143ce565b60405180910390fd5b600d60039054906101000a900460ff1660ff168160ff1610611833578260ff16600c546117ec91906143ee565b34101561182e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118259061447c565b60405180910390fd5b6118d3565b6000818461184191906142e1565b9050600d60039054906101000a900460ff1660ff168160ff1611156118d157600d60039054906101000a900460ff168161187b919061449c565b90508060ff16600c5461188e91906143ee565b3410156118d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c79061447c565b60405180910390fd5b5b505b6118e0338460ff166128b8565b80836118ec91906142e1565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055506000915060009250505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600d60029054906101000a900460ff1681565b60606003805461199c90613ef6565b80601f01602080910402602001604051908101604052809291908181526020018280546119c890613ef6565b8015611a155780601f106119ea57610100808354040283529160200191611a15565b820191906000526020600020905b8154815290600101906020018083116119f857829003601f168201915b5050505050905090565b611a276123bc565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a8b576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611a986123bc565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611b456123bc565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b8a91906136b0565b60405180910390a35050565b600d60059054906101000a900460ff1681565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611d7a573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611c1c57611c17858585856128d6565b611d87565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611c659291906141a5565b602060405180830381865afa158015611c82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ca691906141e3565b8015611d3857506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611cf69291906141a5565b602060405180830381865afa158015611d13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d3791906141e3565b5b611d7957336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611d709190613888565b60405180910390fd5b5b611d86858585856128d6565b5b5050505050565b611d966123bc565b73ffffffffffffffffffffffffffffffffffffffff16611db4611950565b73ffffffffffffffffffffffffffffffffffffffff1614611e0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0190613ea7565b60405180910390fd5b6000611e14610d21565b90506000838390508560ff16611e2a91906143ee565b9050600d60009054906101000a900461ffff1661ffff16818361ffff16611e5191906144d1565b1115611e92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e89906142c1565b60405180910390fd5b60005b84849050811015611ee757611ed4858583818110611eb657611eb5614505565b5b9050602002016020810190611ecb9190613b0a565b8760ff166128b8565b8080611edf90614534565b915050611e95565b5060009450600091505050505050565b611eff6123bc565b73ffffffffffffffffffffffffffffffffffffffff16611f1d611950565b73ffffffffffffffffffffffffffffffffffffffff1614611f73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6a90613ea7565b60405180910390fd5b6000611f7d610d21565b9050600d60009054906101000a900461ffff1661ffff168382611fa0919061423f565b61ffff161115611fe5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fdc906142c1565b60405180910390fd5b611ff3828461ffff166128b8565b600092506000915060009050505050565b606061200f8261242e565b61204e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612045906145ee565b60405180910390fd5b60001515600d60059054906101000a900460ff161515036120fb57600b805461207690613ef6565b80601f01602080910402602001604051908101604052809291908181526020018280546120a290613ef6565b80156120ef5780601f106120c4576101008083540402835291602001916120ef565b820191906000526020600020905b8154815290600101906020018083116120d257829003601f168201915b50505050509050612157565b6000612105612952565b905060008151116121255760405180602001604052806000815250612153565b8061212f846129e4565b600a604051602001612143939291906146cd565b6040516020818303038152906040525b9150505b919050565b600d60009054906101000a900461ffff1681565b600e6020528060005260406000206000915054906101000a900460ff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b805461223190613ef6565b80601f016020809104026020016040519081016040528092919081815260200182805461225d90613ef6565b80156122aa5780601f1061227f576101008083540402835291602001916122aa565b820191906000526020600020905b81548152906001019060200180831161228d57829003601f168201915b505050505081565b6122ba6123bc565b73ffffffffffffffffffffffffffffffffffffffff166122d8611950565b73ffffffffffffffffffffffffffffffffffffffff161461232e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232590613ea7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361239d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239490614770565b60405180910390fd5b6123a6816127f2565b50565b600d60039054906101000a900460ff1681565b600033905090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008161243961252e565b11158015612448575060005482105b8015612475575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b61253e838383612b44565b505050565b61255e83838360405180602001604052806000815250611ba9565b505050565b61256b613553565b60008290508061257961252e565b11158015612588575060005481105b156127bb576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516127b957600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461269d5780925050506127ed565b5b6001156127b857818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146127b35780925050506127ed565b61269e565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6128d2828260405180602001604052806000815250612ff8565b5050565b6128e1848484612b44565b6129008373ffffffffffffffffffffffffffffffffffffffff1661300a565b801561291557506129138484848461302d565b155b1561294c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b60606009805461296190613ef6565b80601f016020809104026020016040519081016040528092919081815260200182805461298d90613ef6565b80156129da5780601f106129af576101008083540402835291602001916129da565b820191906000526020600020905b8154815290600101906020018083116129bd57829003601f168201915b5050505050905090565b606060008203612a2b576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612b3f565b600082905060005b60008214612a5d578080612a4690614534565b915050600a82612a5691906147bf565b9150612a33565b60008167ffffffffffffffff811115612a7957612a78613919565b5b6040519080825280601f01601f191660200182016040528015612aab5781602001600182028036833780820191505090505b5090505b60008514612b3857600182612ac491906147f0565b9150600a85612ad39190614824565b6030612adf91906144d1565b60f81b818381518110612af557612af4614505565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612b3191906147bf565b9450612aaf565b8093505050505b919050565b6000612b4f82612563565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612bba576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16612bdb6123bc565b73ffffffffffffffffffffffffffffffffffffffff161480612c0a5750612c0985612c046123bc565b612190565b5b80612c4f5750612c186123bc565b73ffffffffffffffffffffffffffffffffffffffff16612c3784610b06565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612c88576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612cee576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612cfb858585600161317d565b612d076000848761247c565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612f86576000548214612f8557878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612ff18585856001613183565b5050505050565b6130058383836001613189565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026130536123bc565b8786866040518563ffffffff1660e01b815260040161307594939291906148aa565b6020604051808303816000875af19250505080156130b157506040513d601f19601f820116820180604052508101906130ae919061490b565b60015b61312a573d80600081146130e1576040519150601f19603f3d011682016040523d82523d6000602084013e6130e6565b606091505b506000815103613122576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036131f5576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000840361322f576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61323c600086838761317d565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561340657506134058773ffffffffffffffffffffffffffffffffffffffff1661300a565b5b156134cb575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461347b600088848060010195508861302d565b6134b1576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80820361340c5782600054146134c657600080fd5b613536565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082036134cc575b81600081905550505061354c6000868387613183565b5050505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b600060ff82169050919050565b6135c0816135aa565b81146135cb57600080fd5b50565b6000813590506135dd816135b7565b92915050565b6000602082840312156135f9576135f86135a0565b5b6000613607848285016135ce565b91505092915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61364581613610565b811461365057600080fd5b50565b6000813590506136628161363c565b92915050565b60006020828403121561367e5761367d6135a0565b5b600061368c84828501613653565b91505092915050565b60008115159050919050565b6136aa81613695565b82525050565b60006020820190506136c560008301846136a1565b92915050565b600061ffff82169050919050565b6136e2816136cb565b81146136ed57600080fd5b50565b6000813590506136ff816136d9565b92915050565b60006020828403121561371b5761371a6135a0565b5b6000613729848285016136f0565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561376c578082015181840152602081019050613751565b60008484015250505050565b6000601f19601f8301169050919050565b600061379482613732565b61379e818561373d565b93506137ae81856020860161374e565b6137b781613778565b840191505092915050565b600060208201905081810360008301526137dc8184613789565b905092915050565b6000819050919050565b6137f7816137e4565b811461380257600080fd5b50565b600081359050613814816137ee565b92915050565b6000602082840312156138305761382f6135a0565b5b600061383e84828501613805565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061387282613847565b9050919050565b61388281613867565b82525050565b600060208201905061389d6000830184613879565b92915050565b6138ac81613867565b81146138b757600080fd5b50565b6000813590506138c9816138a3565b92915050565b600080604083850312156138e6576138e56135a0565b5b60006138f4858286016138ba565b925050602061390585828601613805565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61395182613778565b810181811067ffffffffffffffff821117156139705761396f613919565b5b80604052505050565b6000613983613596565b905061398f8282613948565b919050565b600067ffffffffffffffff8211156139af576139ae613919565b5b6139b882613778565b9050602081019050919050565b82818337600083830152505050565b60006139e76139e284613994565b613979565b905082815260208101848484011115613a0357613a02613914565b5b613a0e8482856139c5565b509392505050565b600082601f830112613a2b57613a2a61390f565b5b8135613a3b8482602086016139d4565b91505092915050565b600060208284031215613a5a57613a596135a0565b5b600082013567ffffffffffffffff811115613a7857613a776135a5565b5b613a8484828501613a16565b91505092915050565b613a96816137e4565b82525050565b6000602082019050613ab16000830184613a8d565b92915050565b600080600060608486031215613ad057613acf6135a0565b5b6000613ade868287016138ba565b9350506020613aef868287016138ba565b9250506040613b0086828701613805565b9150509250925092565b600060208284031215613b2057613b1f6135a0565b5b6000613b2e848285016138ba565b91505092915050565b613b40816135aa565b82525050565b6000602082019050613b5b6000830184613b37565b92915050565b613b6a81613695565b8114613b7557600080fd5b50565b600081359050613b8781613b61565b92915050565b60008060408385031215613ba457613ba36135a0565b5b6000613bb2858286016138ba565b9250506020613bc385828601613b78565b9150509250929050565b600067ffffffffffffffff821115613be857613be7613919565b5b613bf182613778565b9050602081019050919050565b6000613c11613c0c84613bcd565b613979565b905082815260208101848484011115613c2d57613c2c613914565b5b613c388482856139c5565b509392505050565b600082601f830112613c5557613c5461390f565b5b8135613c65848260208601613bfe565b91505092915050565b60008060008060808587031215613c8857613c876135a0565b5b6000613c96878288016138ba565b9450506020613ca7878288016138ba565b9350506040613cb887828801613805565b925050606085013567ffffffffffffffff811115613cd957613cd86135a5565b5b613ce587828801613c40565b91505092959194509250565b600080fd5b600080fd5b60008083601f840112613d1157613d1061390f565b5b8235905067ffffffffffffffff811115613d2e57613d2d613cf1565b5b602083019150836020820283011115613d4a57613d49613cf6565b5b9250929050565b600080600060408486031215613d6a57613d696135a0565b5b6000613d78868287016135ce565b935050602084013567ffffffffffffffff811115613d9957613d986135a5565b5b613da586828701613cfb565b92509250509250925092565b60008060408385031215613dc857613dc76135a0565b5b6000613dd6858286016136f0565b9250506020613de7858286016138ba565b9150509250929050565b613dfa816136cb565b82525050565b6000602082019050613e156000830184613df1565b92915050565b60008060408385031215613e3257613e316135a0565b5b6000613e40858286016138ba565b9250506020613e51858286016138ba565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613e9160208361373d565b9150613e9c82613e5b565b602082019050919050565b60006020820190508181036000830152613ec081613e84565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613f0e57607f821691505b602082108103613f2157613f20613ec7565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613f897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613f4c565b613f938683613f4c565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613fd0613fcb613fc6846137e4565b613fab565b6137e4565b9050919050565b6000819050919050565b613fea83613fb5565b613ffe613ff682613fd7565b848454613f59565b825550505050565b600090565b614013614006565b61401e818484613fe1565b505050565b5b818110156140425761403760008261400b565b600181019050614024565b5050565b601f8211156140875761405881613f27565b61406184613f3c565b81016020851015614070578190505b61408461407c85613f3c565b830182614023565b50505b505050565b600082821c905092915050565b60006140aa6000198460080261408c565b1980831691505092915050565b60006140c38383614099565b9150826002028217905092915050565b6140dc82613732565b67ffffffffffffffff8111156140f5576140f4613919565b5b6140ff8254613ef6565b61410a828285614046565b600060209050601f83116001811461413d576000841561412b578287015190505b61413585826140b7565b86555061419d565b601f19841661414b86613f27565b60005b828110156141735784890151825560018201915060208501945060208101905061414e565b86831015614190578489015161418c601f891682614099565b8355505b6001600288020188555050505b505050505050565b60006040820190506141ba6000830185613879565b6141c76020830184613879565b9392505050565b6000815190506141dd81613b61565b92915050565b6000602082840312156141f9576141f86135a0565b5b6000614207848285016141ce565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061424a826136cb565b9150614255836136cb565b9250828201905061ffff81111561426f5761426e614210565b5b92915050565b7f45786365656473206d617820737570706c792e00000000000000000000000000600082015250565b60006142ab60138361373d565b91506142b682614275565b602082019050919050565b600060208201905081810360008301526142da8161429e565b9050919050565b60006142ec826135aa565b91506142f7836135aa565b9250828201905060ff8111156143105761430f614210565b5b92915050565b7f45786365656473206d617820706572207472616e73616374696f6e2e00000000600082015250565b600061434c601c8361373d565b915061435782614316565b602082019050919050565b6000602082019050818103600083015261437b8161433f565b9050919050565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b60006143b860178361373d565b91506143c382614382565b602082019050919050565b600060208201905081810360008301526143e7816143ab565b9050919050565b60006143f9826137e4565b9150614404836137e4565b9250828202614412816137e4565b9150828204841483151761442957614428614210565b5b5092915050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b600061446660138361373d565b915061447182614430565b602082019050919050565b6000602082019050818103600083015261449581614459565b9050919050565b60006144a7826135aa565b91506144b2836135aa565b9250828203905060ff8111156144cb576144ca614210565b5b92915050565b60006144dc826137e4565b91506144e7836137e4565b92508282019050808211156144ff576144fe614210565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061453f826137e4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361457157614570614210565b5b600182019050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006145d8602f8361373d565b91506145e38261457c565b604082019050919050565b60006020820190508181036000830152614607816145cb565b9050919050565b600081905092915050565b600061462482613732565b61462e818561460e565b935061463e81856020860161374e565b80840191505092915050565b6000815461465781613ef6565b614661818661460e565b9450600182166000811461467c5760018114614691576146c4565b60ff19831686528115158202860193506146c4565b61469a85613f27565b60005b838110156146bc5781548189015260018201915060208101905061469d565b838801955050505b50505092915050565b60006146d98286614619565b91506146e58285614619565b91506146f1828461464a565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061475a60268361373d565b9150614765826146fe565b604082019050919050565b600060208201905081810360008301526147898161474d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006147ca826137e4565b91506147d5836137e4565b9250826147e5576147e4614790565b5b828204905092915050565b60006147fb826137e4565b9150614806836137e4565b925082820390508181111561481e5761481d614210565b5b92915050565b600061482f826137e4565b915061483a836137e4565b92508261484a57614849614790565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b600061487c82614855565b6148868185614860565b935061489681856020860161374e565b61489f81613778565b840191505092915050565b60006080820190506148bf6000830187613879565b6148cc6020830186613879565b6148d96040830185613a8d565b81810360608301526148eb8184614871565b905095945050505050565b6000815190506149058161363c565b92915050565b600060208284031215614921576149206135a0565b5b600061492f848285016148f6565b9150509291505056fea264697066735822122014bbd75e93611ceeb99055f6a52f36fac33f06ed09c825fceae23f48881cecd564736f6c63430008120033

Deployed Bytecode

0x6080604052600436106102195760003560e01c806370a0823111610123578063b88d4fde116100ab578063e94053c71161006f578063e94053c71461075f578063e985e9c51461079c578063eef440af146107d9578063f2fde38b14610804578063f8bf51721461082d57610219565b8063b88d4fde1461067c578063b8a9d115146106a5578063bb438fea146106ce578063c87b56dd146106f7578063d5abeb011461073457610219565b80638da5cb5b116100f25780638da5cb5b146105a757806394354fd0146105d257806395d89b41146105fd578063a22cb46514610628578063a475b5dd1461065157610219565b806370a082311461050e578063715018a61461054b5780637ec4a65914610562578063858e83b51461058b57610219565b806323b872dd116101a657806342842e0e1161017557806342842e0e1461042b57806344a0d68a146104545780635c975abb1461047d578063622e4e78146104a85780636352211e146104d157610219565b806323b872dd146103bd57806336566f06146103e65780633bd64968146103fd5780633ccfd60b1461041457610219565b8063081812fc116101ed578063081812fc146102d8578063095ea7b3146103155780631067fcc71461033e57806313faede61461036757806318160ddd1461039257610219565b8062a4f1f21461021e57806301ffc9a71461024757806306421c2f1461028457806306fdde03146102ad575b600080fd5b34801561022a57600080fd5b50610245600480360381019061024091906135e3565b610858565b005b34801561025357600080fd5b5061026e60048036038101906102699190613668565b6108f6565b60405161027b91906136b0565b60405180910390f35b34801561029057600080fd5b506102ab60048036038101906102a69190613705565b6109d8565b005b3480156102b957600080fd5b506102c2610a74565b6040516102cf91906137c2565b60405180910390f35b3480156102e457600080fd5b506102ff60048036038101906102fa919061381a565b610b06565b60405161030c9190613888565b60405180910390f35b34801561032157600080fd5b5061033c600480360381019061033791906138cf565b610b82565b005b34801561034a57600080fd5b5061036560048036038101906103609190613a44565b610c8c565b005b34801561037357600080fd5b5061037c610d1b565b6040516103899190613a9c565b60405180910390f35b34801561039e57600080fd5b506103a7610d21565b6040516103b49190613a9c565b60405180910390f35b3480156103c957600080fd5b506103e460048036038101906103df9190613ab7565b610d38565b005b3480156103f257600080fd5b506103fb610f1a565b005b34801561040957600080fd5b50610412610fc2565b005b34801561042057600080fd5b5061042961106a565b005b34801561043757600080fd5b50610452600480360381019061044d9190613ab7565b611135565b005b34801561046057600080fd5b5061047b6004803603810190610476919061381a565b611317565b005b34801561048957600080fd5b5061049261139d565b60405161049f91906136b0565b60405180910390f35b3480156104b457600080fd5b506104cf60048036038101906104ca91906135e3565b6113b0565b005b3480156104dd57600080fd5b506104f860048036038101906104f3919061381a565b61144a565b6040516105059190613888565b60405180910390f35b34801561051a57600080fd5b5061053560048036038101906105309190613b0a565b611460565b6040516105429190613a9c565b60405180910390f35b34801561055757600080fd5b5061056061152f565b005b34801561056e57600080fd5b5061058960048036038101906105849190613a44565b6115b7565b005b6105a560048036038101906105a091906135e3565b611646565b005b3480156105b357600080fd5b506105bc611950565b6040516105c99190613888565b60405180910390f35b3480156105de57600080fd5b506105e761197a565b6040516105f49190613b46565b60405180910390f35b34801561060957600080fd5b5061061261198d565b60405161061f91906137c2565b60405180910390f35b34801561063457600080fd5b5061064f600480360381019061064a9190613b8d565b611a1f565b005b34801561065d57600080fd5b50610666611b96565b60405161067391906136b0565b60405180910390f35b34801561068857600080fd5b506106a3600480360381019061069e9190613c6e565b611ba9565b005b3480156106b157600080fd5b506106cc60048036038101906106c79190613d51565b611d8e565b005b3480156106da57600080fd5b506106f560048036038101906106f09190613db1565b611ef7565b005b34801561070357600080fd5b5061071e6004803603810190610719919061381a565b612004565b60405161072b91906137c2565b60405180910390f35b34801561074057600080fd5b5061074961215c565b6040516107569190613e00565b60405180910390f35b34801561076b57600080fd5b5061078660048036038101906107819190613b0a565b612170565b6040516107939190613b46565b60405180910390f35b3480156107a857600080fd5b506107c360048036038101906107be9190613e1b565b612190565b6040516107d091906136b0565b60405180910390f35b3480156107e557600080fd5b506107ee612224565b6040516107fb91906137c2565b60405180910390f35b34801561081057600080fd5b5061082b60048036038101906108269190613b0a565b6122b2565b005b34801561083957600080fd5b506108426123a9565b60405161084f9190613b46565b60405180910390f35b6108606123bc565b73ffffffffffffffffffffffffffffffffffffffff1661087e611950565b73ffffffffffffffffffffffffffffffffffffffff16146108d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108cb90613ea7565b60405180910390fd5b80600d60036101000a81548160ff021916908360ff1602179055506000905050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109c157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109d157506109d0826123c4565b5b9050919050565b6109e06123bc565b73ffffffffffffffffffffffffffffffffffffffff166109fe611950565b73ffffffffffffffffffffffffffffffffffffffff1614610a54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4b90613ea7565b60405180910390fd5b80600d60006101000a81548161ffff021916908361ffff16021790555050565b606060028054610a8390613ef6565b80601f0160208091040260200160405190810160405280929190818152602001828054610aaf90613ef6565b8015610afc5780601f10610ad157610100808354040283529160200191610afc565b820191906000526020600020905b815481529060010190602001808311610adf57829003601f168201915b5050505050905090565b6000610b118261242e565b610b47576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b8d8261144a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610bf4576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c136123bc565b73ffffffffffffffffffffffffffffffffffffffff1614158015610c455750610c4381610c3e6123bc565b612190565b155b15610c7c576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c8783838361247c565b505050565b610c946123bc565b73ffffffffffffffffffffffffffffffffffffffff16610cb2611950565b73ffffffffffffffffffffffffffffffffffffffff1614610d08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cff90613ea7565b60405180910390fd5b80600b9081610d1791906140d3565b5050565b600c5481565b6000610d2b61252e565b6001546000540303905090565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610f08573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610daa57610da5848484612533565b610f14565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610df39291906141a5565b602060405180830381865afa158015610e10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3491906141e3565b8015610ec657506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610e849291906141a5565b602060405180830381865afa158015610ea1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec591906141e3565b5b610f0757336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610efe9190613888565b60405180910390fd5b5b610f13848484612533565b5b50505050565b610f226123bc565b73ffffffffffffffffffffffffffffffffffffffff16610f40611950565b73ffffffffffffffffffffffffffffffffffffffff1614610f96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8d90613ea7565b60405180910390fd5b600d60049054906101000a900460ff1615600d60046101000a81548160ff021916908315150217905550565b610fca6123bc565b73ffffffffffffffffffffffffffffffffffffffff16610fe8611950565b73ffffffffffffffffffffffffffffffffffffffff161461103e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103590613ea7565b60405180910390fd5b600d60059054906101000a900460ff1615600d60056101000a81548160ff021916908315150217905550565b6110726123bc565b73ffffffffffffffffffffffffffffffffffffffff16611090611950565b73ffffffffffffffffffffffffffffffffffffffff16146110e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110dd90613ea7565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611131573d6000803e3d6000fd5b5050565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611305573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036111a7576111a2848484612543565b611311565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016111f09291906141a5565b602060405180830381865afa15801561120d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061123191906141e3565b80156112c357506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016112819291906141a5565b602060405180830381865afa15801561129e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c291906141e3565b5b61130457336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016112fb9190613888565b60405180910390fd5b5b611310848484612543565b5b50505050565b61131f6123bc565b73ffffffffffffffffffffffffffffffffffffffff1661133d611950565b73ffffffffffffffffffffffffffffffffffffffff1614611393576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138a90613ea7565b60405180910390fd5b80600c8190555050565b600d60049054906101000a900460ff1681565b6113b86123bc565b73ffffffffffffffffffffffffffffffffffffffff166113d6611950565b73ffffffffffffffffffffffffffffffffffffffff161461142c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142390613ea7565b60405180910390fd5b80600d60026101000a81548160ff021916908360ff16021790555050565b600061145582612563565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036114c7576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6115376123bc565b73ffffffffffffffffffffffffffffffffffffffff16611555611950565b73ffffffffffffffffffffffffffffffffffffffff16146115ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a290613ea7565b60405180910390fd5b6115b560006127f2565b565b6115bf6123bc565b73ffffffffffffffffffffffffffffffffffffffff166115dd611950565b73ffffffffffffffffffffffffffffffffffffffff1614611633576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162a90613ea7565b60405180910390fd5b806009908161164291906140d3565b5050565b6000611650610d21565b90506000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050600d60009054906101000a900461ffff1661ffff168360ff16836116c7919061423f565b61ffff16111561170c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611703906142c1565b60405180910390fd5b600d60029054906101000a900460ff1660ff16818461172b91906142e1565b60ff16111561176f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176690614362565b60405180910390fd5b600d60049054906101000a900460ff16156117bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b6906143ce565b60405180910390fd5b600d60039054906101000a900460ff1660ff168160ff1610611833578260ff16600c546117ec91906143ee565b34101561182e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118259061447c565b60405180910390fd5b6118d3565b6000818461184191906142e1565b9050600d60039054906101000a900460ff1660ff168160ff1611156118d157600d60039054906101000a900460ff168161187b919061449c565b90508060ff16600c5461188e91906143ee565b3410156118d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c79061447c565b60405180910390fd5b5b505b6118e0338460ff166128b8565b80836118ec91906142e1565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055506000915060009250505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600d60029054906101000a900460ff1681565b60606003805461199c90613ef6565b80601f01602080910402602001604051908101604052809291908181526020018280546119c890613ef6565b8015611a155780601f106119ea57610100808354040283529160200191611a15565b820191906000526020600020905b8154815290600101906020018083116119f857829003601f168201915b5050505050905090565b611a276123bc565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a8b576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611a986123bc565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611b456123bc565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b8a91906136b0565b60405180910390a35050565b600d60059054906101000a900460ff1681565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611d7a573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611c1c57611c17858585856128d6565b611d87565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611c659291906141a5565b602060405180830381865afa158015611c82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ca691906141e3565b8015611d3857506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611cf69291906141a5565b602060405180830381865afa158015611d13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d3791906141e3565b5b611d7957336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611d709190613888565b60405180910390fd5b5b611d86858585856128d6565b5b5050505050565b611d966123bc565b73ffffffffffffffffffffffffffffffffffffffff16611db4611950565b73ffffffffffffffffffffffffffffffffffffffff1614611e0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0190613ea7565b60405180910390fd5b6000611e14610d21565b90506000838390508560ff16611e2a91906143ee565b9050600d60009054906101000a900461ffff1661ffff16818361ffff16611e5191906144d1565b1115611e92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e89906142c1565b60405180910390fd5b60005b84849050811015611ee757611ed4858583818110611eb657611eb5614505565b5b9050602002016020810190611ecb9190613b0a565b8760ff166128b8565b8080611edf90614534565b915050611e95565b5060009450600091505050505050565b611eff6123bc565b73ffffffffffffffffffffffffffffffffffffffff16611f1d611950565b73ffffffffffffffffffffffffffffffffffffffff1614611f73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6a90613ea7565b60405180910390fd5b6000611f7d610d21565b9050600d60009054906101000a900461ffff1661ffff168382611fa0919061423f565b61ffff161115611fe5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fdc906142c1565b60405180910390fd5b611ff3828461ffff166128b8565b600092506000915060009050505050565b606061200f8261242e565b61204e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612045906145ee565b60405180910390fd5b60001515600d60059054906101000a900460ff161515036120fb57600b805461207690613ef6565b80601f01602080910402602001604051908101604052809291908181526020018280546120a290613ef6565b80156120ef5780601f106120c4576101008083540402835291602001916120ef565b820191906000526020600020905b8154815290600101906020018083116120d257829003601f168201915b50505050509050612157565b6000612105612952565b905060008151116121255760405180602001604052806000815250612153565b8061212f846129e4565b600a604051602001612143939291906146cd565b6040516020818303038152906040525b9150505b919050565b600d60009054906101000a900461ffff1681565b600e6020528060005260406000206000915054906101000a900460ff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b805461223190613ef6565b80601f016020809104026020016040519081016040528092919081815260200182805461225d90613ef6565b80156122aa5780601f1061227f576101008083540402835291602001916122aa565b820191906000526020600020905b81548152906001019060200180831161228d57829003601f168201915b505050505081565b6122ba6123bc565b73ffffffffffffffffffffffffffffffffffffffff166122d8611950565b73ffffffffffffffffffffffffffffffffffffffff161461232e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232590613ea7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361239d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239490614770565b60405180910390fd5b6123a6816127f2565b50565b600d60039054906101000a900460ff1681565b600033905090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008161243961252e565b11158015612448575060005482105b8015612475575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b61253e838383612b44565b505050565b61255e83838360405180602001604052806000815250611ba9565b505050565b61256b613553565b60008290508061257961252e565b11158015612588575060005481105b156127bb576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516127b957600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461269d5780925050506127ed565b5b6001156127b857818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146127b35780925050506127ed565b61269e565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6128d2828260405180602001604052806000815250612ff8565b5050565b6128e1848484612b44565b6129008373ffffffffffffffffffffffffffffffffffffffff1661300a565b801561291557506129138484848461302d565b155b1561294c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b60606009805461296190613ef6565b80601f016020809104026020016040519081016040528092919081815260200182805461298d90613ef6565b80156129da5780601f106129af576101008083540402835291602001916129da565b820191906000526020600020905b8154815290600101906020018083116129bd57829003601f168201915b5050505050905090565b606060008203612a2b576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612b3f565b600082905060005b60008214612a5d578080612a4690614534565b915050600a82612a5691906147bf565b9150612a33565b60008167ffffffffffffffff811115612a7957612a78613919565b5b6040519080825280601f01601f191660200182016040528015612aab5781602001600182028036833780820191505090505b5090505b60008514612b3857600182612ac491906147f0565b9150600a85612ad39190614824565b6030612adf91906144d1565b60f81b818381518110612af557612af4614505565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612b3191906147bf565b9450612aaf565b8093505050505b919050565b6000612b4f82612563565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612bba576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16612bdb6123bc565b73ffffffffffffffffffffffffffffffffffffffff161480612c0a5750612c0985612c046123bc565b612190565b5b80612c4f5750612c186123bc565b73ffffffffffffffffffffffffffffffffffffffff16612c3784610b06565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612c88576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612cee576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612cfb858585600161317d565b612d076000848761247c565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612f86576000548214612f8557878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612ff18585856001613183565b5050505050565b6130058383836001613189565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026130536123bc565b8786866040518563ffffffff1660e01b815260040161307594939291906148aa565b6020604051808303816000875af19250505080156130b157506040513d601f19601f820116820180604052508101906130ae919061490b565b60015b61312a573d80600081146130e1576040519150601f19603f3d011682016040523d82523d6000602084013e6130e6565b606091505b506000815103613122576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036131f5576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000840361322f576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61323c600086838761317d565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561340657506134058773ffffffffffffffffffffffffffffffffffffffff1661300a565b5b156134cb575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461347b600088848060010195508861302d565b6134b1576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80820361340c5782600054146134c657600080fd5b613536565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082036134cc575b81600081905550505061354c6000868387613183565b5050505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b600060ff82169050919050565b6135c0816135aa565b81146135cb57600080fd5b50565b6000813590506135dd816135b7565b92915050565b6000602082840312156135f9576135f86135a0565b5b6000613607848285016135ce565b91505092915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61364581613610565b811461365057600080fd5b50565b6000813590506136628161363c565b92915050565b60006020828403121561367e5761367d6135a0565b5b600061368c84828501613653565b91505092915050565b60008115159050919050565b6136aa81613695565b82525050565b60006020820190506136c560008301846136a1565b92915050565b600061ffff82169050919050565b6136e2816136cb565b81146136ed57600080fd5b50565b6000813590506136ff816136d9565b92915050565b60006020828403121561371b5761371a6135a0565b5b6000613729848285016136f0565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561376c578082015181840152602081019050613751565b60008484015250505050565b6000601f19601f8301169050919050565b600061379482613732565b61379e818561373d565b93506137ae81856020860161374e565b6137b781613778565b840191505092915050565b600060208201905081810360008301526137dc8184613789565b905092915050565b6000819050919050565b6137f7816137e4565b811461380257600080fd5b50565b600081359050613814816137ee565b92915050565b6000602082840312156138305761382f6135a0565b5b600061383e84828501613805565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061387282613847565b9050919050565b61388281613867565b82525050565b600060208201905061389d6000830184613879565b92915050565b6138ac81613867565b81146138b757600080fd5b50565b6000813590506138c9816138a3565b92915050565b600080604083850312156138e6576138e56135a0565b5b60006138f4858286016138ba565b925050602061390585828601613805565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61395182613778565b810181811067ffffffffffffffff821117156139705761396f613919565b5b80604052505050565b6000613983613596565b905061398f8282613948565b919050565b600067ffffffffffffffff8211156139af576139ae613919565b5b6139b882613778565b9050602081019050919050565b82818337600083830152505050565b60006139e76139e284613994565b613979565b905082815260208101848484011115613a0357613a02613914565b5b613a0e8482856139c5565b509392505050565b600082601f830112613a2b57613a2a61390f565b5b8135613a3b8482602086016139d4565b91505092915050565b600060208284031215613a5a57613a596135a0565b5b600082013567ffffffffffffffff811115613a7857613a776135a5565b5b613a8484828501613a16565b91505092915050565b613a96816137e4565b82525050565b6000602082019050613ab16000830184613a8d565b92915050565b600080600060608486031215613ad057613acf6135a0565b5b6000613ade868287016138ba565b9350506020613aef868287016138ba565b9250506040613b0086828701613805565b9150509250925092565b600060208284031215613b2057613b1f6135a0565b5b6000613b2e848285016138ba565b91505092915050565b613b40816135aa565b82525050565b6000602082019050613b5b6000830184613b37565b92915050565b613b6a81613695565b8114613b7557600080fd5b50565b600081359050613b8781613b61565b92915050565b60008060408385031215613ba457613ba36135a0565b5b6000613bb2858286016138ba565b9250506020613bc385828601613b78565b9150509250929050565b600067ffffffffffffffff821115613be857613be7613919565b5b613bf182613778565b9050602081019050919050565b6000613c11613c0c84613bcd565b613979565b905082815260208101848484011115613c2d57613c2c613914565b5b613c388482856139c5565b509392505050565b600082601f830112613c5557613c5461390f565b5b8135613c65848260208601613bfe565b91505092915050565b60008060008060808587031215613c8857613c876135a0565b5b6000613c96878288016138ba565b9450506020613ca7878288016138ba565b9350506040613cb887828801613805565b925050606085013567ffffffffffffffff811115613cd957613cd86135a5565b5b613ce587828801613c40565b91505092959194509250565b600080fd5b600080fd5b60008083601f840112613d1157613d1061390f565b5b8235905067ffffffffffffffff811115613d2e57613d2d613cf1565b5b602083019150836020820283011115613d4a57613d49613cf6565b5b9250929050565b600080600060408486031215613d6a57613d696135a0565b5b6000613d78868287016135ce565b935050602084013567ffffffffffffffff811115613d9957613d986135a5565b5b613da586828701613cfb565b92509250509250925092565b60008060408385031215613dc857613dc76135a0565b5b6000613dd6858286016136f0565b9250506020613de7858286016138ba565b9150509250929050565b613dfa816136cb565b82525050565b6000602082019050613e156000830184613df1565b92915050565b60008060408385031215613e3257613e316135a0565b5b6000613e40858286016138ba565b9250506020613e51858286016138ba565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613e9160208361373d565b9150613e9c82613e5b565b602082019050919050565b60006020820190508181036000830152613ec081613e84565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613f0e57607f821691505b602082108103613f2157613f20613ec7565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613f897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613f4c565b613f938683613f4c565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613fd0613fcb613fc6846137e4565b613fab565b6137e4565b9050919050565b6000819050919050565b613fea83613fb5565b613ffe613ff682613fd7565b848454613f59565b825550505050565b600090565b614013614006565b61401e818484613fe1565b505050565b5b818110156140425761403760008261400b565b600181019050614024565b5050565b601f8211156140875761405881613f27565b61406184613f3c565b81016020851015614070578190505b61408461407c85613f3c565b830182614023565b50505b505050565b600082821c905092915050565b60006140aa6000198460080261408c565b1980831691505092915050565b60006140c38383614099565b9150826002028217905092915050565b6140dc82613732565b67ffffffffffffffff8111156140f5576140f4613919565b5b6140ff8254613ef6565b61410a828285614046565b600060209050601f83116001811461413d576000841561412b578287015190505b61413585826140b7565b86555061419d565b601f19841661414b86613f27565b60005b828110156141735784890151825560018201915060208501945060208101905061414e565b86831015614190578489015161418c601f891682614099565b8355505b6001600288020188555050505b505050505050565b60006040820190506141ba6000830185613879565b6141c76020830184613879565b9392505050565b6000815190506141dd81613b61565b92915050565b6000602082840312156141f9576141f86135a0565b5b6000614207848285016141ce565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061424a826136cb565b9150614255836136cb565b9250828201905061ffff81111561426f5761426e614210565b5b92915050565b7f45786365656473206d617820737570706c792e00000000000000000000000000600082015250565b60006142ab60138361373d565b91506142b682614275565b602082019050919050565b600060208201905081810360008301526142da8161429e565b9050919050565b60006142ec826135aa565b91506142f7836135aa565b9250828201905060ff8111156143105761430f614210565b5b92915050565b7f45786365656473206d617820706572207472616e73616374696f6e2e00000000600082015250565b600061434c601c8361373d565b915061435782614316565b602082019050919050565b6000602082019050818103600083015261437b8161433f565b9050919050565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b60006143b860178361373d565b91506143c382614382565b602082019050919050565b600060208201905081810360008301526143e7816143ab565b9050919050565b60006143f9826137e4565b9150614404836137e4565b9250828202614412816137e4565b9150828204841483151761442957614428614210565b5b5092915050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b600061446660138361373d565b915061447182614430565b602082019050919050565b6000602082019050818103600083015261449581614459565b9050919050565b60006144a7826135aa565b91506144b2836135aa565b9250828203905060ff8111156144cb576144ca614210565b5b92915050565b60006144dc826137e4565b91506144e7836137e4565b92508282019050808211156144ff576144fe614210565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061453f826137e4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361457157614570614210565b5b600182019050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006145d8602f8361373d565b91506145e38261457c565b604082019050919050565b60006020820190508181036000830152614607816145cb565b9050919050565b600081905092915050565b600061462482613732565b61462e818561460e565b935061463e81856020860161374e565b80840191505092915050565b6000815461465781613ef6565b614661818661460e565b9450600182166000811461467c5760018114614691576146c4565b60ff19831686528115158202860193506146c4565b61469a85613f27565b60005b838110156146bc5781548189015260018201915060208101905061469d565b838801955050505b50505092915050565b60006146d98286614619565b91506146e58285614619565b91506146f1828461464a565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061475a60268361373d565b9150614765826146fe565b604082019050919050565b600060208201905081810360008301526147898161474d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006147ca826137e4565b91506147d5836137e4565b9250826147e5576147e4614790565b5b828204905092915050565b60006147fb826137e4565b9150614806836137e4565b925082820390508181111561481e5761481d614210565b5b92915050565b600061482f826137e4565b915061483a836137e4565b92508261484a57614849614790565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b600061487c82614855565b6148868185614860565b935061489681856020860161374e565b61489f81613778565b840191505092915050565b60006080820190506148bf6000830187613879565b6148cc6020830186613879565b6148d96040830185613a8d565b81810360608301526148eb8184614871565b905095945050505050565b6000815190506149058161363c565b92915050565b600060208284031215614921576149206135a0565b5b600061492f848285016148f6565b9150509291505056fea264697066735822122014bbd75e93611ceeb99055f6a52f36fac33f06ed09c825fceae23f48881cecd564736f6c63430008120033

Deployed Bytecode Sourcemap

48892:4580:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51923:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24781:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51308:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27894:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29397:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28960:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52172:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49095:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24030:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52891:163;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52282:77;;;;;;;;;;;;;:::i;:::-;;52446:70;;;;;;;;;;;;;:::i;:::-;;52634:144;;;;;;;;;;;;;:::i;:::-;;53062:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52365:76;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49334:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52522:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27702:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25150:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43603:103;;;;;;;;;;;;;:::i;:::-;;52065:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49521:962;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42951:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49177:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28063:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29673:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49364:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53241:228;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50824:473;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50491:327;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51420:490;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49140:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49397:53;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30031:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49065:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43861:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49220:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51923:124;43182:12;:10;:12::i;:::-;43171:23;;:7;:5;:7::i;:::-;:23;;;43163:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;52016:6:::1;51987:26;;:35;;;;;;;;;;;;;;;;;;52028:13;;;51923:124:::0;:::o;24781:305::-;24883:4;24935:25;24920:40;;;:11;:40;;;;:105;;;;24992:33;24977:48;;;:11;:48;;;;24920:105;:158;;;;25042:36;25066:11;25042:23;:36::i;:::-;24920:158;24900:178;;24781:305;;;:::o;51308:97::-;43182:12;:10;:12::i;:::-;43171:23;;:7;:5;:7::i;:::-;:23;;;43163:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;51389:10:::1;51377:9;;:22;;;;;;;;;;;;;;;;;;51308:97:::0;:::o;27894:100::-;27948:13;27981:5;27974:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27894:100;:::o;29397:204::-;29465:7;29490:16;29498:7;29490;:16::i;:::-;29485:64;;29515:34;;;;;;;;;;;;;;29485:64;29569:15;:24;29585:7;29569:24;;;;;;;;;;;;;;;;;;;;;29562:31;;29397:204;;;:::o;28960:371::-;29033:13;29049:24;29065:7;29049:15;:24::i;:::-;29033:40;;29094:5;29088:11;;:2;:11;;;29084:48;;29108:24;;;;;;;;;;;;;;29084:48;29165:5;29149:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;29175:37;29192:5;29199:12;:10;:12::i;:::-;29175:16;:37::i;:::-;29174:38;29149:63;29145:138;;;29236:35;;;;;;;;;;;;;;29145:138;29295:28;29304:2;29308:7;29317:5;29295:8;:28::i;:::-;29022:309;28960:371;;:::o;52172:102::-;43182:12;:10;:12::i;:::-;43171:23;;:7;:5;:7::i;:::-;:23;;;43163:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;52258:10:::1;52246:9;:22;;;;;;:::i;:::-;;52172:102:::0;:::o;49095:33::-;;;;:::o;24030:303::-;24074:7;24299:15;:13;:15::i;:::-;24284:12;;24268:13;;:28;:46;24261:53;;24030:303;:::o;52891:163::-;52992:4;47913:1;46727:42;47867:43;;;:47;47863:699;;;48154:10;48146:18;;:4;:18;;;48142:85;;53009:37:::1;53028:4;53034:2;53038:7;53009:18;:37::i;:::-;48205:7:::0;;48142:85;46727:42;48287:40;;;48336:4;48343:10;48287:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:157;;;;;46727:42;48383:40;;;48432:4;48439;48383:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48287:157;48241:310;;48524:10;48505:30;;;;;;;;;;;:::i;:::-;;;;;;;;48241:310;47863:699;53009:37:::1;53028:4;53034:2;53038:7;53009:18;:37::i;:::-;52891:163:::0;;;;;:::o;52282:77::-;43182:12;:10;:12::i;:::-;43171:23;;:7;:5;:7::i;:::-;:23;;;43163:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;52342:6:::1;;;;;;;;;;;52341:7;52332:6;;:16;;;;;;;;;;;;;;;;;;52282:77::o:0;52446:70::-;43182:12;:10;:12::i;:::-;43171:23;;:7;:5;:7::i;:::-;:23;;;43163:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;52505:6:::1;;;;;;;;;;;52504:7;52495:6;;:16;;;;;;;;;;;;;;;;;;52446:70::o:0;52634:144::-;43182:12;:10;:12::i;:::-;43171:23;;:7;:5;:7::i;:::-;:23;;;43163:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;52678:13:::1;52694:21;52678:37;;52731:10;52723:28;;:39;52752:8;52723:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;52673:105;52634:144::o:0;53062:171::-;53167:4;47913:1;46727:42;47867:43;;;:47;47863:699;;;48154:10;48146:18;;:4;:18;;;48142:85;;53184:41:::1;53207:4;53213:2;53217:7;53184:22;:41::i;:::-;48205:7:::0;;48142:85;46727:42;48287:40;;;48336:4;48343:10;48287:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:157;;;;;46727:42;48383:40;;;48432:4;48439;48383:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48287:157;48241:310;;48524:10;48505:30;;;;;;;;;;;:::i;:::-;;;;;;;;48241:310;47863:699;53184:41:::1;53207:4;53213:2;53217:7;53184:22;:41::i;:::-;53062:171:::0;;;;;:::o;52365:76::-;43182:12;:10;:12::i;:::-;43171:23;;:7;:5;:7::i;:::-;:23;;;43163:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;52428:5:::1;52421:4;:12;;;;52365:76:::0;:::o;49334:25::-;;;;;;;;;;;;;:::o;52522:101::-;43182:12;:10;:12::i;:::-;43171:23;;:7;:5;:7::i;:::-;:23;;;43163:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;52609:6:::1;52588:18;;:27;;;;;;;;;;;;;;;;;;52522:101:::0;:::o;27702:125::-;27766:7;27793:21;27806:7;27793:12;:21::i;:::-;:26;;;27786:33;;27702:125;;;:::o;25150:206::-;25214:7;25255:1;25238:19;;:5;:19;;;25234:60;;25266:28;;;;;;;;;;;;;;25234:60;25320:12;:19;25333:5;25320:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;25312:36;;25305:43;;25150:206;;;:::o;43603:103::-;43182:12;:10;:12::i;:::-;43171:23;;:7;:5;:7::i;:::-;:23;;;43163:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;43668:30:::1;43695:1;43668:18;:30::i;:::-;43603:103::o:0;52065:102::-;43182:12;:10;:12::i;:::-;43171:23;;:7;:5;:7::i;:::-;:23;;;43163:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;52151:10:::1;52139:9;:22;;;;;;:::i;:::-;;52065:102:::0;:::o;49521:962::-;49586:18;49614:13;:11;:13::i;:::-;49586:42;;49636:9;49648:19;:31;49668:10;49648:31;;;;;;;;;;;;;;;;;;;;;;;;;49636:43;;49723:9;;;;;;;;;;;49694:38;;49708:11;49694:25;;:11;:25;;;;:::i;:::-;:38;;;;49686:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;49792:18;;;;;;;;;;;49771:39;;49785:3;49771:11;:17;;;;:::i;:::-;:39;;;;49763:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;49861:6;;;;;;;;;;;49860:7;49852:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;49920:26;;;;;;;;;;;49913:33;;:3;:33;;;49910:409;;49996:11;49989:18;;:4;;:18;;;;:::i;:::-;49976:9;:31;;49968:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;49910:409;;;50066:16;50099:3;50085:11;:17;;;;:::i;:::-;50066:36;;50129:26;;;;;;;;;;;50116:39;;:10;:39;;;50113:199;;;50202:26;;;;;;;;;;;50189:10;:39;;;;:::i;:::-;50176:52;;50267:10;50260:17;;:4;;:17;;;;:::i;:::-;50247:9;:30;;50239:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;50113:199;50054:265;49910:409;50325:35;50335:10;50348:11;50325:35;;:9;:35::i;:::-;50415:3;50401:11;:17;;;;:::i;:::-;50367:19;:31;50387:10;50367:31;;;;;;;;;;;;;;;;:51;;;;;;;;;;;;;;;;;;50433:18;;;50459;;;49578:905;;49521:962;:::o;42951:87::-;42997:7;43024:6;;;;;;;;;;;43017:13;;42951:87;:::o;49177:36::-;;;;;;;;;;;;;:::o;28063:104::-;28119:13;28152:7;28145:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28063:104;:::o;29673:287::-;29784:12;:10;:12::i;:::-;29772:24;;:8;:24;;;29768:54;;29805:17;;;;;;;;;;;;;;29768:54;29880:8;29835:18;:32;29854:12;:10;:12::i;:::-;29835:32;;;;;;;;;;;;;;;:42;29868:8;29835:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;29933:8;29904:48;;29919:12;:10;:12::i;:::-;29904:48;;;29943:8;29904:48;;;;;;:::i;:::-;;;;;;;;29673:287;;:::o;49364:25::-;;;;;;;;;;;;;:::o;53241:228::-;53392:4;47913:1;46727:42;47867:43;;;:47;47863:699;;;48154:10;48146:18;;:4;:18;;;48142:85;;53414:47:::1;53437:4;53443:2;53447:7;53456:4;53414:22;:47::i;:::-;48205:7:::0;;48142:85;46727:42;48287:40;;;48336:4;48343:10;48287:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:157;;;;;46727:42;48383:40;;;48432:4;48439;48383:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48287:157;48241:310;;48524:10;48505:30;;;;;;;;;;;:::i;:::-;;;;;;;;48241:310;47863:699;53414:47:::1;53437:4;53443:2;53447:7;53456:4;53414:22;:47::i;:::-;53241:228:::0;;;;;;:::o;50824:473::-;43182:12;:10;:12::i;:::-;43171:23;;:7;:5;:7::i;:::-;:23;;;43163:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;50924:18:::1;50952:13;:11;:13::i;:::-;50924:42;;50974:16;51015:9;;:16;;50995:17;:36;;;;;;:::i;:::-;50974:57;;51075:9;;;;;;;;;;;51046:38;;51060:11;51046;:25;;;;;;:::i;:::-;:38;;51038:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;51121:9;51116:116;51140:9;;:16;;51136:1;:20;51116:116;;;51178:42;51188:9;;51198:1;51188:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;51202:17;51178:42;;:9;:42::i;:::-;51158:3;;;;;:::i;:::-;;;;51116:116;;;;51241:24;;;51273:18;;;50916:381;;50824:473:::0;;;:::o;50491:327::-;43182:12;:10;:12::i;:::-;43171:23;;:7;:5;:7::i;:::-;:23;;;43163:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;50575:18:::1;50603:13;:11;:13::i;:::-;50575:42;;50661:9;;;;;;;;;;;50632:38;;50646:11;50632;:25;;;;:::i;:::-;:38;;;;50624:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;50702:34;50712:9;50724:11;50702:34;;:9;:34::i;:::-;50744:18;;;50770:16;;;50794:18;;;50567:251;50491:327:::0;;:::o;51420:490::-;51519:13;51560:17;51568:8;51560:7;:17::i;:::-;51544:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;51670:5;51660:15;;:6;;;;;;;;;;;:15;;;51655:50;;51692:9;51685:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51655:50;51719:28;51750:10;:8;:10::i;:::-;51719:41;;51805:1;51780:14;51774:28;:32;:130;;;;;;;;;;;;;;;;;51842:14;51858:19;:8;:17;:19::i;:::-;51879:9;51825:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51774:130;51767:137;;;51420:490;;;;:::o;49140:30::-;;;;;;;;;;;;;:::o;49397:53::-;;;;;;;;;;;;;;;;;;;;;;:::o;30031:164::-;30128:4;30152:18;:25;30171:5;30152:25;;;;;;;;;;;;;;;:35;30178:8;30152:35;;;;;;;;;;;;;;;;;;;;;;;;;30145:42;;30031:164;;;;:::o;49065:23::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43861:201::-;43182:12;:10;:12::i;:::-;43171:23;;:7;:5;:7::i;:::-;:23;;;43163:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;43970:1:::1;43950:22;;:8;:22;;::::0;43942:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;44026:28;44045:8;44026:18;:28::i;:::-;43861:201:::0;:::o;49220:43::-;;;;;;;;;;;;;:::o;3176:98::-;3229:7;3256:10;3249:17;;3176:98;:::o;14706:157::-;14791:4;14830:25;14815:40;;;:11;:40;;;;14808:47;;14706:157;;;:::o;31383:187::-;31440:4;31483:7;31464:15;:13;:15::i;:::-;:26;;:53;;;;;31504:13;;31494:7;:23;31464:53;:98;;;;;31535:11;:20;31547:7;31535:20;;;;;;;;;;;:27;;;;;;;;;;;;31534:28;31464:98;31457:105;;31383:187;;;:::o;39553:196::-;39695:2;39668:15;:24;39684:7;39668:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;39733:7;39729:2;39713:28;;39722:5;39713:28;;;;;;;;;;;;39553:196;;;:::o;23804:92::-;23860:7;23804:92;:::o;30262:170::-;30396:28;30406:4;30412:2;30416:7;30396:9;:28::i;:::-;30262:170;;;:::o;30503:185::-;30641:39;30658:4;30664:2;30668:7;30641:39;;;;;;;;;;;;:16;:39::i;:::-;30503:185;;;:::o;26531:1109::-;26593:21;;:::i;:::-;26627:12;26642:7;26627:22;;26710:4;26691:15;:13;:15::i;:::-;:23;;:47;;;;;26725:13;;26718:4;:20;26691:47;26687:886;;;26759:31;26793:11;:17;26805:4;26793:17;;;;;;;;;;;26759:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26834:9;:16;;;26829:729;;26905:1;26879:28;;:9;:14;;;:28;;;26875:101;;26943:9;26936:16;;;;;;26875:101;27278:261;27285:4;27278:261;;;27318:6;;;;;;;;27363:11;:17;27375:4;27363:17;;;;;;;;;;;27351:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27437:1;27411:28;;:9;:14;;;:28;;;27407:109;;27479:9;27472:16;;;;;;27407:109;27278:261;;;26829:729;26740:833;26687:886;27601:31;;;;;;;;;;;;;;26531:1109;;;;:::o;44222:191::-;44296:16;44315:6;;;;;;;;;;;44296:25;;44341:8;44332:6;;:17;;;;;;;;;;;;;;;;;;44396:8;44365:40;;44386:8;44365:40;;;;;;;;;;;;44285:128;44222:191;:::o;31578:104::-;31647:27;31657:2;31661:8;31647:27;;;;;;;;;;;;:9;:27::i;:::-;31578:104;;:::o;30759:369::-;30926:28;30936:4;30942:2;30946:7;30926:9;:28::i;:::-;30969:15;:2;:13;;;:15::i;:::-;:76;;;;;30989:56;31020:4;31026:2;31030:7;31039:5;30989:30;:56::i;:::-;30988:57;30969:76;30965:156;;;31069:40;;;;;;;;;;;;;;30965:156;30759:369;;;;:::o;52786:97::-;52839:13;52868:9;52861:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52786:97;:::o;738:723::-;794:13;1024:1;1015:5;:10;1011:53;;1042:10;;;;;;;;;;;;;;;;;;;;;1011:53;1074:12;1089:5;1074:20;;1105:14;1130:78;1145:1;1137:4;:9;1130:78;;1163:8;;;;;:::i;:::-;;;;1194:2;1186:10;;;;;:::i;:::-;;;1130:78;;;1218:19;1250:6;1240:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1218:39;;1268:154;1284:1;1275:5;:10;1268:154;;1312:1;1302:11;;;;;:::i;:::-;;;1379:2;1371:5;:10;;;;:::i;:::-;1358:2;:24;;;;:::i;:::-;1345:39;;1328:6;1335;1328:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1408:2;1399:11;;;;;:::i;:::-;;;1268:154;;;1446:6;1432:21;;;;;738:723;;;;:::o;34496:2130::-;34611:35;34649:21;34662:7;34649:12;:21::i;:::-;34611:59;;34709:4;34687:26;;:13;:18;;;:26;;;34683:67;;34722:28;;;;;;;;;;;;;;34683:67;34763:22;34805:4;34789:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;34826:36;34843:4;34849:12;:10;:12::i;:::-;34826:16;:36::i;:::-;34789:73;:126;;;;34903:12;:10;:12::i;:::-;34879:36;;:20;34891:7;34879:11;:20::i;:::-;:36;;;34789:126;34763:153;;34934:17;34929:66;;34960:35;;;;;;;;;;;;;;34929:66;35024:1;35010:16;;:2;:16;;;35006:52;;35035:23;;;;;;;;;;;;;;35006:52;35071:43;35093:4;35099:2;35103:7;35112:1;35071:21;:43::i;:::-;35179:35;35196:1;35200:7;35209:4;35179:8;:35::i;:::-;35540:1;35510:12;:18;35523:4;35510:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35584:1;35556:12;:16;35569:2;35556:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35602:31;35636:11;:20;35648:7;35636:20;;;;;;;;;;;35602:54;;35687:2;35671:8;:13;;;:18;;;;;;;;;;;;;;;;;;35737:15;35704:8;:23;;;:49;;;;;;;;;;;;;;;;;;36005:19;36037:1;36027:7;:11;36005:33;;36053:31;36087:11;:24;36099:11;36087:24;;;;;;;;;;;36053:58;;36155:1;36130:27;;:8;:13;;;;;;;;;;;;:27;;;36126:384;;36340:13;;36325:11;:28;36321:174;;36394:4;36378:8;:13;;;:20;;;;;;;;;;;;;;;;;;36447:13;:28;;;36421:8;:23;;;:54;;;;;;;;;;;;;;;;;;36321:174;36126:384;35485:1036;;;36557:7;36553:2;36538:27;;36547:4;36538:27;;;;;;;;;;;;36576:42;36597:4;36603:2;36607:7;36616:1;36576:20;:42::i;:::-;34600:2026;;34496:2130;;;:::o;32045:163::-;32168:32;32174:2;32178:8;32188:5;32195:4;32168:5;:32::i;:::-;32045:163;;;:::o;4623:326::-;4683:4;4940:1;4918:7;:19;;;:23;4911:30;;4623:326;;;:::o;40241:667::-;40404:4;40441:2;40425:36;;;40462:12;:10;:12::i;:::-;40476:4;40482:7;40491:5;40425:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40421:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40676:1;40659:6;:13;:18;40655:235;;40705:40;;;;;;;;;;;;;;40655:235;40848:6;40842:13;40833:6;40829:2;40825:15;40818:38;40421:480;40554:45;;;40544:55;;;:6;:55;;;;40537:62;;;40241:667;;;;;;:::o;41556:159::-;;;;;:::o;42374:158::-;;;;;:::o;32467:1775::-;32606:20;32629:13;;32606:36;;32671:1;32657:16;;:2;:16;;;32653:48;;32682:19;;;;;;;;;;;;;;32653:48;32728:1;32716:8;:13;32712:44;;32738:18;;;;;;;;;;;;;;32712:44;32769:61;32799:1;32803:2;32807:12;32821:8;32769:21;:61::i;:::-;33142:8;33107:12;:16;33120:2;33107:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33206:8;33166:12;:16;33179:2;33166:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33265:2;33232:11;:25;33244:12;33232:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;33332:15;33282:11;:25;33294:12;33282:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;33365:20;33388:12;33365:35;;33415:11;33444:8;33429:12;:23;33415:37;;33473:4;:23;;;;;33481:15;:2;:13;;;:15::i;:::-;33473:23;33469:641;;;33517:314;33573:12;33569:2;33548:38;;33565:1;33548:38;;;;;;;;;;;;33614:69;33653:1;33657:2;33661:14;;;;;;33677:5;33614:30;:69::i;:::-;33609:174;;33719:40;;;;;;;;;;;;;;33609:174;33826:3;33810:12;:19;33517:314;;33912:12;33895:13;;:29;33891:43;;33926:8;;;33891:43;33469:641;;;33975:120;34031:14;;;;;;34027:2;34006:40;;34023:1;34006:40;;;;;;;;;;;;34090:3;34074:12;:19;33975:120;;33469:641;34140:12;34124:13;:28;;;;33082:1082;;34174:60;34203:1;34207:2;34211:12;34225:8;34174:20;:60::i;:::-;32595:1647;32467:1775;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::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:86;369:7;409:4;402:5;398:16;387:27;;334:86;;;:::o;426:118::-;497:22;513:5;497:22;:::i;:::-;490:5;487:33;477:61;;534:1;531;524:12;477:61;426:118;:::o;550:135::-;594:5;632:6;619:20;610:29;;648:31;673:5;648:31;:::i;:::-;550:135;;;;:::o;691:325::-;748:6;797:2;785:9;776:7;772:23;768:32;765:119;;;803:79;;:::i;:::-;765:119;923:1;948:51;991:7;982:6;971:9;967:22;948:51;:::i;:::-;938:61;;894:115;691:325;;;;:::o;1022:149::-;1058:7;1098:66;1091:5;1087:78;1076:89;;1022:149;;;:::o;1177:120::-;1249:23;1266:5;1249:23;:::i;:::-;1242:5;1239:34;1229:62;;1287:1;1284;1277:12;1229:62;1177:120;:::o;1303:137::-;1348:5;1386:6;1373:20;1364:29;;1402:32;1428:5;1402:32;:::i;:::-;1303:137;;;;:::o;1446:327::-;1504:6;1553:2;1541:9;1532:7;1528:23;1524:32;1521:119;;;1559:79;;:::i;:::-;1521:119;1679:1;1704:52;1748:7;1739:6;1728:9;1724:22;1704:52;:::i;:::-;1694:62;;1650:116;1446:327;;;;:::o;1779:90::-;1813:7;1856:5;1849:13;1842:21;1831:32;;1779:90;;;:::o;1875:109::-;1956:21;1971:5;1956:21;:::i;:::-;1951:3;1944:34;1875:109;;:::o;1990:210::-;2077:4;2115:2;2104:9;2100:18;2092:26;;2128:65;2190:1;2179:9;2175:17;2166:6;2128:65;:::i;:::-;1990:210;;;;:::o;2206:89::-;2242:7;2282:6;2275:5;2271:18;2260:29;;2206:89;;;:::o;2301:120::-;2373:23;2390:5;2373:23;:::i;:::-;2366:5;2363:34;2353:62;;2411:1;2408;2401:12;2353:62;2301:120;:::o;2427:137::-;2472:5;2510:6;2497:20;2488:29;;2526:32;2552:5;2526:32;:::i;:::-;2427:137;;;;:::o;2570:327::-;2628:6;2677:2;2665:9;2656:7;2652:23;2648:32;2645:119;;;2683:79;;:::i;:::-;2645:119;2803:1;2828:52;2872:7;2863:6;2852:9;2848:22;2828:52;:::i;:::-;2818:62;;2774:116;2570:327;;;;:::o;2903:99::-;2955:6;2989:5;2983:12;2973:22;;2903:99;;;:::o;3008:169::-;3092:11;3126:6;3121:3;3114:19;3166:4;3161:3;3157:14;3142:29;;3008:169;;;;:::o;3183:246::-;3264:1;3274:113;3288:6;3285:1;3282:13;3274:113;;;3373:1;3368:3;3364:11;3358:18;3354:1;3349:3;3345:11;3338:39;3310:2;3307:1;3303:10;3298:15;;3274:113;;;3421:1;3412:6;3407:3;3403:16;3396:27;3245:184;3183:246;;;:::o;3435:102::-;3476:6;3527:2;3523:7;3518:2;3511:5;3507:14;3503:28;3493:38;;3435:102;;;:::o;3543:377::-;3631:3;3659:39;3692:5;3659:39;:::i;:::-;3714:71;3778:6;3773:3;3714:71;:::i;:::-;3707:78;;3794:65;3852:6;3847:3;3840:4;3833:5;3829:16;3794:65;:::i;:::-;3884:29;3906:6;3884:29;:::i;:::-;3879:3;3875:39;3868:46;;3635:285;3543:377;;;;:::o;3926:313::-;4039:4;4077:2;4066:9;4062:18;4054:26;;4126:9;4120:4;4116:20;4112:1;4101:9;4097:17;4090:47;4154:78;4227:4;4218:6;4154:78;:::i;:::-;4146:86;;3926:313;;;;:::o;4245:77::-;4282:7;4311:5;4300:16;;4245:77;;;:::o;4328:122::-;4401:24;4419:5;4401:24;:::i;:::-;4394:5;4391:35;4381:63;;4440:1;4437;4430:12;4381:63;4328:122;:::o;4456:139::-;4502:5;4540:6;4527:20;4518:29;;4556:33;4583:5;4556:33;:::i;:::-;4456:139;;;;:::o;4601:329::-;4660:6;4709:2;4697:9;4688:7;4684:23;4680:32;4677:119;;;4715:79;;:::i;:::-;4677:119;4835:1;4860:53;4905:7;4896:6;4885:9;4881:22;4860:53;:::i;:::-;4850:63;;4806:117;4601:329;;;;:::o;4936:126::-;4973:7;5013:42;5006:5;5002:54;4991:65;;4936:126;;;:::o;5068:96::-;5105:7;5134:24;5152:5;5134:24;:::i;:::-;5123:35;;5068:96;;;:::o;5170:118::-;5257:24;5275:5;5257:24;:::i;:::-;5252:3;5245:37;5170:118;;:::o;5294:222::-;5387:4;5425:2;5414:9;5410:18;5402:26;;5438:71;5506:1;5495:9;5491:17;5482:6;5438:71;:::i;:::-;5294:222;;;;:::o;5522:122::-;5595:24;5613:5;5595:24;:::i;:::-;5588:5;5585:35;5575:63;;5634:1;5631;5624:12;5575:63;5522:122;:::o;5650:139::-;5696:5;5734:6;5721:20;5712:29;;5750:33;5777:5;5750:33;:::i;:::-;5650:139;;;;:::o;5795:474::-;5863:6;5871;5920:2;5908:9;5899:7;5895:23;5891:32;5888:119;;;5926:79;;:::i;:::-;5888:119;6046:1;6071:53;6116:7;6107:6;6096:9;6092:22;6071:53;:::i;:::-;6061:63;;6017:117;6173:2;6199:53;6244:7;6235:6;6224:9;6220:22;6199:53;:::i;:::-;6189:63;;6144:118;5795:474;;;;;:::o;6275:117::-;6384:1;6381;6374:12;6398:117;6507:1;6504;6497:12;6521:180;6569:77;6566:1;6559:88;6666:4;6663:1;6656:15;6690:4;6687:1;6680:15;6707:281;6790:27;6812:4;6790:27;:::i;:::-;6782:6;6778:40;6920:6;6908:10;6905:22;6884:18;6872:10;6869:34;6866:62;6863:88;;;6931:18;;:::i;:::-;6863:88;6971:10;6967:2;6960:22;6750:238;6707:281;;:::o;6994:129::-;7028:6;7055:20;;:::i;:::-;7045:30;;7084:33;7112:4;7104:6;7084:33;:::i;:::-;6994:129;;;:::o;7129:308::-;7191:4;7281:18;7273:6;7270:30;7267:56;;;7303:18;;:::i;:::-;7267:56;7341:29;7363:6;7341:29;:::i;:::-;7333:37;;7425:4;7419;7415:15;7407:23;;7129:308;;;:::o;7443:146::-;7540:6;7535:3;7530;7517:30;7581:1;7572:6;7567:3;7563:16;7556:27;7443:146;;;:::o;7595:425::-;7673:5;7698:66;7714:49;7756:6;7714:49;:::i;:::-;7698:66;:::i;:::-;7689:75;;7787:6;7780:5;7773:21;7825:4;7818:5;7814:16;7863:3;7854:6;7849:3;7845:16;7842:25;7839:112;;;7870:79;;:::i;:::-;7839:112;7960:54;8007:6;8002:3;7997;7960:54;:::i;:::-;7679:341;7595:425;;;;;:::o;8040:340::-;8096:5;8145:3;8138:4;8130:6;8126:17;8122:27;8112:122;;8153:79;;:::i;:::-;8112:122;8270:6;8257:20;8295:79;8370:3;8362:6;8355:4;8347:6;8343:17;8295:79;:::i;:::-;8286:88;;8102:278;8040:340;;;;:::o;8386:509::-;8455:6;8504:2;8492:9;8483:7;8479:23;8475:32;8472:119;;;8510:79;;:::i;:::-;8472:119;8658:1;8647:9;8643:17;8630:31;8688:18;8680:6;8677:30;8674:117;;;8710:79;;:::i;:::-;8674:117;8815:63;8870:7;8861:6;8850:9;8846:22;8815:63;:::i;:::-;8805:73;;8601:287;8386:509;;;;:::o;8901:118::-;8988:24;9006:5;8988:24;:::i;:::-;8983:3;8976:37;8901:118;;:::o;9025:222::-;9118:4;9156:2;9145:9;9141:18;9133:26;;9169:71;9237:1;9226:9;9222:17;9213:6;9169:71;:::i;:::-;9025:222;;;;:::o;9253:619::-;9330:6;9338;9346;9395:2;9383:9;9374:7;9370:23;9366:32;9363:119;;;9401:79;;:::i;:::-;9363:119;9521:1;9546:53;9591:7;9582:6;9571:9;9567:22;9546:53;:::i;:::-;9536:63;;9492:117;9648:2;9674:53;9719:7;9710:6;9699:9;9695:22;9674:53;:::i;:::-;9664:63;;9619:118;9776:2;9802:53;9847:7;9838:6;9827:9;9823:22;9802:53;:::i;:::-;9792:63;;9747:118;9253:619;;;;;:::o;9878:329::-;9937:6;9986:2;9974:9;9965:7;9961:23;9957:32;9954:119;;;9992:79;;:::i;:::-;9954:119;10112:1;10137:53;10182:7;10173:6;10162:9;10158:22;10137:53;:::i;:::-;10127:63;;10083:117;9878:329;;;;:::o;10213:112::-;10296:22;10312:5;10296:22;:::i;:::-;10291:3;10284:35;10213:112;;:::o;10331:214::-;10420:4;10458:2;10447:9;10443:18;10435:26;;10471:67;10535:1;10524:9;10520:17;10511:6;10471:67;:::i;:::-;10331:214;;;;:::o;10551:116::-;10621:21;10636:5;10621:21;:::i;:::-;10614:5;10611:32;10601:60;;10657:1;10654;10647:12;10601:60;10551:116;:::o;10673:133::-;10716:5;10754:6;10741:20;10732:29;;10770:30;10794:5;10770:30;:::i;:::-;10673:133;;;;:::o;10812:468::-;10877:6;10885;10934:2;10922:9;10913:7;10909:23;10905:32;10902:119;;;10940:79;;:::i;:::-;10902:119;11060:1;11085:53;11130:7;11121:6;11110:9;11106:22;11085:53;:::i;:::-;11075:63;;11031:117;11187:2;11213:50;11255:7;11246:6;11235:9;11231:22;11213:50;:::i;:::-;11203:60;;11158:115;10812:468;;;;;:::o;11286:307::-;11347:4;11437:18;11429:6;11426:30;11423:56;;;11459:18;;:::i;:::-;11423:56;11497:29;11519:6;11497:29;:::i;:::-;11489:37;;11581:4;11575;11571:15;11563:23;;11286:307;;;:::o;11599:423::-;11676:5;11701:65;11717:48;11758:6;11717:48;:::i;:::-;11701:65;:::i;:::-;11692:74;;11789:6;11782:5;11775:21;11827:4;11820:5;11816:16;11865:3;11856:6;11851:3;11847:16;11844:25;11841:112;;;11872:79;;:::i;:::-;11841:112;11962:54;12009:6;12004:3;11999;11962:54;:::i;:::-;11682:340;11599:423;;;;;:::o;12041:338::-;12096:5;12145:3;12138:4;12130:6;12126:17;12122:27;12112:122;;12153:79;;:::i;:::-;12112:122;12270:6;12257:20;12295:78;12369:3;12361:6;12354:4;12346:6;12342:17;12295:78;:::i;:::-;12286:87;;12102:277;12041:338;;;;:::o;12385:943::-;12480:6;12488;12496;12504;12553:3;12541:9;12532:7;12528:23;12524:33;12521:120;;;12560:79;;:::i;:::-;12521:120;12680:1;12705:53;12750:7;12741:6;12730:9;12726:22;12705:53;:::i;:::-;12695:63;;12651:117;12807:2;12833:53;12878:7;12869:6;12858:9;12854:22;12833:53;:::i;:::-;12823:63;;12778:118;12935:2;12961:53;13006:7;12997:6;12986:9;12982:22;12961:53;:::i;:::-;12951:63;;12906:118;13091:2;13080:9;13076:18;13063:32;13122:18;13114:6;13111:30;13108:117;;;13144:79;;:::i;:::-;13108:117;13249:62;13303:7;13294:6;13283:9;13279:22;13249:62;:::i;:::-;13239:72;;13034:287;12385:943;;;;;;;:::o;13334:117::-;13443:1;13440;13433:12;13457:117;13566:1;13563;13556:12;13597:568;13670:8;13680:6;13730:3;13723:4;13715:6;13711:17;13707:27;13697:122;;13738:79;;:::i;:::-;13697:122;13851:6;13838:20;13828:30;;13881:18;13873:6;13870:30;13867:117;;;13903:79;;:::i;:::-;13867:117;14017:4;14009:6;14005:17;13993:29;;14071:3;14063:4;14055:6;14051:17;14041:8;14037:32;14034:41;14031:128;;;14078:79;;:::i;:::-;14031:128;13597:568;;;;;:::o;14171:700::-;14264:6;14272;14280;14329:2;14317:9;14308:7;14304:23;14300:32;14297:119;;;14335:79;;:::i;:::-;14297:119;14455:1;14480:51;14523:7;14514:6;14503:9;14499:22;14480:51;:::i;:::-;14470:61;;14426:115;14608:2;14597:9;14593:18;14580:32;14639:18;14631:6;14628:30;14625:117;;;14661:79;;:::i;:::-;14625:117;14774:80;14846:7;14837:6;14826:9;14822:22;14774:80;:::i;:::-;14756:98;;;;14551:313;14171:700;;;;;:::o;14877:472::-;14944:6;14952;15001:2;14989:9;14980:7;14976:23;14972:32;14969:119;;;15007:79;;:::i;:::-;14969:119;15127:1;15152:52;15196:7;15187:6;15176:9;15172:22;15152:52;:::i;:::-;15142:62;;15098:116;15253:2;15279:53;15324:7;15315:6;15304:9;15300:22;15279:53;:::i;:::-;15269:63;;15224:118;14877:472;;;;;:::o;15355:115::-;15440:23;15457:5;15440:23;:::i;:::-;15435:3;15428:36;15355:115;;:::o;15476:218::-;15567:4;15605:2;15594:9;15590:18;15582:26;;15618:69;15684:1;15673:9;15669:17;15660:6;15618:69;:::i;:::-;15476:218;;;;:::o;15700:474::-;15768:6;15776;15825:2;15813:9;15804:7;15800:23;15796:32;15793:119;;;15831:79;;:::i;:::-;15793:119;15951:1;15976:53;16021:7;16012:6;16001:9;15997:22;15976:53;:::i;:::-;15966:63;;15922:117;16078:2;16104:53;16149:7;16140:6;16129:9;16125:22;16104:53;:::i;:::-;16094:63;;16049:118;15700:474;;;;;:::o;16180:182::-;16320:34;16316:1;16308:6;16304:14;16297:58;16180:182;:::o;16368:366::-;16510:3;16531:67;16595:2;16590:3;16531:67;:::i;:::-;16524:74;;16607:93;16696:3;16607:93;:::i;:::-;16725:2;16720:3;16716:12;16709:19;;16368:366;;;:::o;16740:419::-;16906:4;16944:2;16933:9;16929:18;16921:26;;16993:9;16987:4;16983:20;16979:1;16968:9;16964:17;16957:47;17021:131;17147:4;17021:131;:::i;:::-;17013:139;;16740:419;;;:::o;17165:180::-;17213:77;17210:1;17203:88;17310:4;17307:1;17300:15;17334:4;17331:1;17324:15;17351:320;17395:6;17432:1;17426:4;17422:12;17412:22;;17479:1;17473:4;17469:12;17500:18;17490:81;;17556:4;17548:6;17544:17;17534:27;;17490:81;17618:2;17610:6;17607:14;17587:18;17584:38;17581:84;;17637:18;;:::i;:::-;17581:84;17402:269;17351:320;;;:::o;17677:141::-;17726:4;17749:3;17741:11;;17772:3;17769:1;17762:14;17806:4;17803:1;17793:18;17785:26;;17677:141;;;:::o;17824:93::-;17861:6;17908:2;17903;17896:5;17892:14;17888:23;17878:33;;17824:93;;;:::o;17923:107::-;17967:8;18017:5;18011:4;18007:16;17986:37;;17923:107;;;;:::o;18036:393::-;18105:6;18155:1;18143:10;18139:18;18178:97;18208:66;18197:9;18178:97;:::i;:::-;18296:39;18326:8;18315:9;18296:39;:::i;:::-;18284:51;;18368:4;18364:9;18357:5;18353:21;18344:30;;18417:4;18407:8;18403:19;18396:5;18393:30;18383:40;;18112:317;;18036:393;;;;;:::o;18435:60::-;18463:3;18484:5;18477:12;;18435:60;;;:::o;18501:142::-;18551:9;18584:53;18602:34;18611:24;18629:5;18611:24;:::i;:::-;18602:34;:::i;:::-;18584:53;:::i;:::-;18571:66;;18501:142;;;:::o;18649:75::-;18692:3;18713:5;18706:12;;18649:75;;;:::o;18730:269::-;18840:39;18871:7;18840:39;:::i;:::-;18901:91;18950:41;18974:16;18950:41;:::i;:::-;18942:6;18935:4;18929:11;18901:91;:::i;:::-;18895:4;18888:105;18806:193;18730:269;;;:::o;19005:73::-;19050:3;19005:73;:::o;19084:189::-;19161:32;;:::i;:::-;19202:65;19260:6;19252;19246:4;19202:65;:::i;:::-;19137:136;19084:189;;:::o;19279:186::-;19339:120;19356:3;19349:5;19346:14;19339:120;;;19410:39;19447:1;19440:5;19410:39;:::i;:::-;19383:1;19376:5;19372:13;19363:22;;19339:120;;;19279:186;;:::o;19471:543::-;19572:2;19567:3;19564:11;19561:446;;;19606:38;19638:5;19606:38;:::i;:::-;19690:29;19708:10;19690:29;:::i;:::-;19680:8;19676:44;19873:2;19861:10;19858:18;19855:49;;;19894:8;19879:23;;19855:49;19917:80;19973:22;19991:3;19973:22;:::i;:::-;19963:8;19959:37;19946:11;19917:80;:::i;:::-;19576:431;;19561:446;19471:543;;;:::o;20020:117::-;20074:8;20124:5;20118:4;20114:16;20093:37;;20020:117;;;;:::o;20143:169::-;20187:6;20220:51;20268:1;20264:6;20256:5;20253:1;20249:13;20220:51;:::i;:::-;20216:56;20301:4;20295;20291:15;20281:25;;20194:118;20143:169;;;;:::o;20317:295::-;20393:4;20539:29;20564:3;20558:4;20539:29;:::i;:::-;20531:37;;20601:3;20598:1;20594:11;20588:4;20585:21;20577:29;;20317:295;;;;:::o;20617:1395::-;20734:37;20767:3;20734:37;:::i;:::-;20836:18;20828:6;20825:30;20822:56;;;20858:18;;:::i;:::-;20822:56;20902:38;20934:4;20928:11;20902:38;:::i;:::-;20987:67;21047:6;21039;21033:4;20987:67;:::i;:::-;21081:1;21105:4;21092:17;;21137:2;21129:6;21126:14;21154:1;21149:618;;;;21811:1;21828:6;21825:77;;;21877:9;21872:3;21868:19;21862:26;21853:35;;21825:77;21928:67;21988:6;21981:5;21928:67;:::i;:::-;21922:4;21915:81;21784:222;21119:887;;21149:618;21201:4;21197:9;21189:6;21185:22;21235:37;21267:4;21235:37;:::i;:::-;21294:1;21308:208;21322:7;21319:1;21316:14;21308:208;;;21401:9;21396:3;21392:19;21386:26;21378:6;21371:42;21452:1;21444:6;21440:14;21430:24;;21499:2;21488:9;21484:18;21471:31;;21345:4;21342:1;21338:12;21333:17;;21308:208;;;21544:6;21535:7;21532:19;21529:179;;;21602:9;21597:3;21593:19;21587:26;21645:48;21687:4;21679:6;21675:17;21664:9;21645:48;:::i;:::-;21637:6;21630:64;21552:156;21529:179;21754:1;21750;21742:6;21738:14;21734:22;21728:4;21721:36;21156:611;;;21119:887;;20709:1303;;;20617:1395;;:::o;22018:332::-;22139:4;22177:2;22166:9;22162:18;22154:26;;22190:71;22258:1;22247:9;22243:17;22234:6;22190:71;:::i;:::-;22271:72;22339:2;22328:9;22324:18;22315:6;22271:72;:::i;:::-;22018:332;;;;;:::o;22356:137::-;22410:5;22441:6;22435:13;22426:22;;22457:30;22481:5;22457:30;:::i;:::-;22356:137;;;;:::o;22499:345::-;22566:6;22615:2;22603:9;22594:7;22590:23;22586:32;22583:119;;;22621:79;;:::i;:::-;22583:119;22741:1;22766:61;22819:7;22810:6;22799:9;22795:22;22766:61;:::i;:::-;22756:71;;22712:125;22499:345;;;;:::o;22850:180::-;22898:77;22895:1;22888:88;22995:4;22992:1;22985:15;23019:4;23016:1;23009:15;23036:193;23075:3;23094:19;23111:1;23094:19;:::i;:::-;23089:24;;23127:19;23144:1;23127:19;:::i;:::-;23122:24;;23169:1;23166;23162:9;23155:16;;23192:6;23187:3;23184:15;23181:41;;;23202:18;;:::i;:::-;23181:41;23036:193;;;;:::o;23235:169::-;23375:21;23371:1;23363:6;23359:14;23352:45;23235:169;:::o;23410:366::-;23552:3;23573:67;23637:2;23632:3;23573:67;:::i;:::-;23566:74;;23649:93;23738:3;23649:93;:::i;:::-;23767:2;23762:3;23758:12;23751:19;;23410:366;;;:::o;23782:419::-;23948:4;23986:2;23975:9;23971:18;23963:26;;24035:9;24029:4;24025:20;24021:1;24010:9;24006:17;23999:47;24063:131;24189:4;24063:131;:::i;:::-;24055:139;;23782:419;;;:::o;24207:188::-;24245:3;24264:18;24280:1;24264:18;:::i;:::-;24259:23;;24296:18;24312:1;24296:18;:::i;:::-;24291:23;;24337:1;24334;24330:9;24323:16;;24360:4;24355:3;24352:13;24349:39;;;24368:18;;:::i;:::-;24349:39;24207:188;;;;:::o;24401:178::-;24541:30;24537:1;24529:6;24525:14;24518:54;24401:178;:::o;24585:366::-;24727:3;24748:67;24812:2;24807:3;24748:67;:::i;:::-;24741:74;;24824:93;24913:3;24824:93;:::i;:::-;24942:2;24937:3;24933:12;24926:19;;24585:366;;;:::o;24957:419::-;25123:4;25161:2;25150:9;25146:18;25138:26;;25210:9;25204:4;25200:20;25196:1;25185:9;25181:17;25174:47;25238:131;25364:4;25238:131;:::i;:::-;25230:139;;24957:419;;;:::o;25382:173::-;25522:25;25518:1;25510:6;25506:14;25499:49;25382:173;:::o;25561:366::-;25703:3;25724:67;25788:2;25783:3;25724:67;:::i;:::-;25717:74;;25800:93;25889:3;25800:93;:::i;:::-;25918:2;25913:3;25909:12;25902:19;;25561:366;;;:::o;25933:419::-;26099:4;26137:2;26126:9;26122:18;26114:26;;26186:9;26180:4;26176:20;26172:1;26161:9;26157:17;26150:47;26214:131;26340:4;26214:131;:::i;:::-;26206:139;;25933:419;;;:::o;26358:410::-;26398:7;26421:20;26439:1;26421:20;:::i;:::-;26416:25;;26455:20;26473:1;26455:20;:::i;:::-;26450:25;;26510:1;26507;26503:9;26532:30;26550:11;26532:30;:::i;:::-;26521:41;;26711:1;26702:7;26698:15;26695:1;26692:22;26672:1;26665:9;26645:83;26622:139;;26741:18;;:::i;:::-;26622:139;26406:362;26358:410;;;;:::o;26774:169::-;26914:21;26910:1;26902:6;26898:14;26891:45;26774:169;:::o;26949:366::-;27091:3;27112:67;27176:2;27171:3;27112:67;:::i;:::-;27105:74;;27188:93;27277:3;27188:93;:::i;:::-;27306:2;27301:3;27297:12;27290:19;;26949:366;;;:::o;27321:419::-;27487:4;27525:2;27514:9;27510:18;27502:26;;27574:9;27568:4;27564:20;27560:1;27549:9;27545:17;27538:47;27602:131;27728:4;27602:131;:::i;:::-;27594:139;;27321:419;;;:::o;27746:191::-;27784:4;27804:18;27820:1;27804:18;:::i;:::-;27799:23;;27836:18;27852:1;27836:18;:::i;:::-;27831:23;;27878:1;27875;27871:9;27863:17;;27902:4;27896;27893:14;27890:40;;;27910:18;;:::i;:::-;27890:40;27746:191;;;;:::o;27943:::-;27983:3;28002:20;28020:1;28002:20;:::i;:::-;27997:25;;28036:20;28054:1;28036:20;:::i;:::-;28031:25;;28079:1;28076;28072:9;28065:16;;28100:3;28097:1;28094:10;28091:36;;;28107:18;;:::i;:::-;28091:36;27943:191;;;;:::o;28140:180::-;28188:77;28185:1;28178:88;28285:4;28282:1;28275:15;28309:4;28306:1;28299:15;28326:233;28365:3;28388:24;28406:5;28388:24;:::i;:::-;28379:33;;28434:66;28427:5;28424:77;28421:103;;28504:18;;:::i;:::-;28421:103;28551:1;28544:5;28540:13;28533:20;;28326:233;;;:::o;28565:234::-;28705:34;28701:1;28693:6;28689:14;28682:58;28774:17;28769:2;28761:6;28757:15;28750:42;28565:234;:::o;28805:366::-;28947:3;28968:67;29032:2;29027:3;28968:67;:::i;:::-;28961:74;;29044:93;29133:3;29044:93;:::i;:::-;29162:2;29157:3;29153:12;29146:19;;28805:366;;;:::o;29177:419::-;29343:4;29381:2;29370:9;29366:18;29358:26;;29430:9;29424:4;29420:20;29416:1;29405:9;29401:17;29394:47;29458:131;29584:4;29458:131;:::i;:::-;29450:139;;29177:419;;;:::o;29602:148::-;29704:11;29741:3;29726:18;;29602:148;;;;:::o;29756:390::-;29862:3;29890:39;29923:5;29890:39;:::i;:::-;29945:89;30027:6;30022:3;29945:89;:::i;:::-;29938:96;;30043:65;30101:6;30096:3;30089:4;30082:5;30078:16;30043:65;:::i;:::-;30133:6;30128:3;30124:16;30117:23;;29866:280;29756:390;;;;:::o;30176:874::-;30279:3;30316:5;30310:12;30345:36;30371:9;30345:36;:::i;:::-;30397:89;30479:6;30474:3;30397:89;:::i;:::-;30390:96;;30517:1;30506:9;30502:17;30533:1;30528:166;;;;30708:1;30703:341;;;;30495:549;;30528:166;30612:4;30608:9;30597;30593:25;30588:3;30581:38;30674:6;30667:14;30660:22;30652:6;30648:35;30643:3;30639:45;30632:52;;30528:166;;30703:341;30770:38;30802:5;30770:38;:::i;:::-;30830:1;30844:154;30858:6;30855:1;30852:13;30844:154;;;30932:7;30926:14;30922:1;30917:3;30913:11;30906:35;30982:1;30973:7;30969:15;30958:26;;30880:4;30877:1;30873:12;30868:17;;30844:154;;;31027:6;31022:3;31018:16;31011:23;;30710:334;;30495:549;;30283:767;;30176:874;;;;:::o;31056:589::-;31281:3;31303:95;31394:3;31385:6;31303:95;:::i;:::-;31296:102;;31415:95;31506:3;31497:6;31415:95;:::i;:::-;31408:102;;31527:92;31615:3;31606:6;31527:92;:::i;:::-;31520:99;;31636:3;31629:10;;31056:589;;;;;;:::o;31651:225::-;31791:34;31787:1;31779:6;31775:14;31768:58;31860:8;31855:2;31847:6;31843:15;31836:33;31651:225;:::o;31882:366::-;32024:3;32045:67;32109:2;32104:3;32045:67;:::i;:::-;32038:74;;32121:93;32210:3;32121:93;:::i;:::-;32239:2;32234:3;32230:12;32223:19;;31882:366;;;:::o;32254:419::-;32420:4;32458:2;32447:9;32443:18;32435:26;;32507:9;32501:4;32497:20;32493:1;32482:9;32478:17;32471:47;32535:131;32661:4;32535:131;:::i;:::-;32527:139;;32254:419;;;:::o;32679:180::-;32727:77;32724:1;32717:88;32824:4;32821:1;32814:15;32848:4;32845:1;32838:15;32865:185;32905:1;32922:20;32940:1;32922:20;:::i;:::-;32917:25;;32956:20;32974:1;32956:20;:::i;:::-;32951:25;;32995:1;32985:35;;33000:18;;:::i;:::-;32985:35;33042:1;33039;33035:9;33030:14;;32865:185;;;;:::o;33056:194::-;33096:4;33116:20;33134:1;33116:20;:::i;:::-;33111:25;;33150:20;33168:1;33150:20;:::i;:::-;33145:25;;33194:1;33191;33187:9;33179:17;;33218:1;33212:4;33209:11;33206:37;;;33223:18;;:::i;:::-;33206:37;33056:194;;;;:::o;33256:176::-;33288:1;33305:20;33323:1;33305:20;:::i;:::-;33300:25;;33339:20;33357:1;33339:20;:::i;:::-;33334:25;;33378:1;33368:35;;33383:18;;:::i;:::-;33368:35;33424:1;33421;33417:9;33412:14;;33256:176;;;;:::o;33438:98::-;33489:6;33523:5;33517:12;33507:22;;33438:98;;;:::o;33542:168::-;33625:11;33659:6;33654:3;33647:19;33699:4;33694:3;33690:14;33675:29;;33542:168;;;;:::o;33716:373::-;33802:3;33830:38;33862:5;33830:38;:::i;:::-;33884:70;33947:6;33942:3;33884:70;:::i;:::-;33877:77;;33963:65;34021:6;34016:3;34009:4;34002:5;33998:16;33963:65;:::i;:::-;34053:29;34075:6;34053:29;:::i;:::-;34048:3;34044:39;34037:46;;33806:283;33716:373;;;;:::o;34095:640::-;34290:4;34328:3;34317:9;34313:19;34305:27;;34342:71;34410:1;34399:9;34395:17;34386:6;34342:71;:::i;:::-;34423:72;34491:2;34480:9;34476:18;34467:6;34423:72;:::i;:::-;34505;34573:2;34562:9;34558:18;34549:6;34505:72;:::i;:::-;34624:9;34618:4;34614:20;34609:2;34598:9;34594:18;34587:48;34652:76;34723:4;34714:6;34652:76;:::i;:::-;34644:84;;34095:640;;;;;;;:::o;34741:141::-;34797:5;34828:6;34822:13;34813:22;;34844:32;34870:5;34844:32;:::i;:::-;34741:141;;;;:::o;34888:349::-;34957:6;35006:2;34994:9;34985:7;34981:23;34977:32;34974:119;;;35012:79;;:::i;:::-;34974:119;35132:1;35157:63;35212:7;35203:6;35192:9;35188:22;35157:63;:::i;:::-;35147:73;;35103:127;34888:349;;;;:::o

Swarm Source

ipfs://14bbd75e93611ceeb99055f6a52f36fac33f06ed09c825fceae23f48881cecd5
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

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