ETH Price: $3,401.99 (+1.99%)

Token

The GnarNarwhals Project (GNP)
 

Overview

Max Total Supply

45 GNP

Holders

34

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
29396.eth
Balance
1 GNP
0x06A34b9CAB3CFAa1538F93b6ece717260b75FE2D
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:
TheGnarNarwhalsProject

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-11-04
*/

// SPDX-License-Identifier: MIT

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

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

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

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/access/Ownable.sol

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

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

pragma solidity ^0.8.0;

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

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

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

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

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: TheGnarNarwhalsProject.sol

pragma solidity ^0.8.0;

/// @author Hammad Ghazi
contract TheGnarNarwhalsProject is ERC721Enumerable, Ownable {
    using Counters for Counters.Counter;
    Counters.Counter private _tokenId;

    uint256 public constant MAX_GNP = 10080;
    string baseTokenURI;
    bool public saleOpen = false;
    mapping(uint8 => uint256) public price;
    mapping(address=>bool) public maxClaimed;

    event TheGnarNarwhalsProjectMinted(uint256 totalMinted);

    constructor(string memory baseURI)
        ERC721("The GnarNarwhals Project", "GNP")
    {
        setBaseURI(baseURI);
        price[1] = 250000000000000000;
        price[2] = 171000000000000000;
        price[3] = 142000000000000000;
        price[4] = 71000000000000000;
        price[5] = 42000000000000000;
    }

    //Get token Ids of all tokens owned by _owner
    function walletOfOwner(address _owner)
        external
        view
        returns (uint256[] memory)
    {
        uint256 tokenCount = balanceOf(_owner);

        uint256[] memory tokensId = new uint256[](tokenCount);
        for (uint256 i = 0; i < tokenCount; i++) {
            tokensId[i] = tokenOfOwnerByIndex(_owner, i);
        }

        return tokensId;
    }

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

    function setTierPrice(uint8 _tier, uint256 _newPrice) external onlyOwner {
        require(_tier > 0 && _tier <= 5, "Invalid Tier");
        price[_tier] = _newPrice;
    }

    //Close sale if open, open sale if closed
    function flipSaleState() external onlyOwner {
        saleOpen = !saleOpen;
    }

    function withdrawAll() external onlyOwner {
        uint256 balance = address(this).balance;
        require(balance > 0, "No funds");
        _widthdraw(
            0xc6ddD3E9e2debb5247877Fc16160963682b6d1B3,
            (balance * 275) / 1000
        );
        _widthdraw(
            0xc5cC3108fa5523ECB6a6260251129C2BBCE8d1Ef,
            (balance * 3) / 100
        );
        _widthdraw(
            0x3D44B9763b3e4895c892A5B29DCcc6E1E5b2eC04,
            (balance * 15) / 100
        );
        _widthdraw(
            0x76A837A1464d1Ca2a4f05A1170191a7aAf23C7aB,
            (balance * 15) / 100
        );
        _widthdraw(
            0xD10852FBd8D696e67AD07ECD8b22fcF6cBF53dA8,
            (balance * 75) / 1000
        );
        _widthdraw(
            0x6107EbbAfCf78427Be7639EC478643412cbB00c6,
            (balance * 105) / 1000
        );
        _widthdraw(
            0xf304F50ebc76A915385c0119B11131dbceb94905,
            (balance * 3) / 100
        );
        _widthdraw(
            0xcbbC43795A033BE2A643C2BeEd026C97129e85cD,
            (balance * 1) / 100
        );
        _widthdraw(
            0x9Fc0fB02B1c2429065b5e75E008F4bC220730A13,
            (balance * 5) / 100
        );
        _widthdraw(
            0x131B1b9BFAd7375733d28fcf070cF945Ce9EE4c5,
            (balance * 25) / 1000
        );
        _widthdraw(
            0xdB75d14117e7802E0596baF2C92b90c0F0Ab1aa5,
            (balance * 10) / 100
        );
    }

    function _widthdraw(address _address, uint256 _amount) private {
        (bool success, ) = _address.call{value: _amount}("");
        require(success, "Transfer failed.");
    }

    function getNFTPrice() public view returns (uint256) {
        uint256 currentSupply = totalSupply();

        if (currentSupply > 7000) {
            return price[1]; // 7001 - 10080 0.25 ETH
        } else if (currentSupply > 4500) {
            return price[2]; // 4501 - 7000 0.1710 ETH
        } else if (currentSupply > 2500) {
            return price[3]; // 2501 - 4500 0.1420 ETH
        } else if (currentSupply > 1000) {
            return price[4]; // 1001 - 2500 0.0710 ETH
        } else {
            return price[5]; // 1 - 1000 0.042 ETH
        }
    }

    //mint TheGnarNarwhalsProject
    function mintTheGnarNarwhalsProject(uint256 _count) external payable {
        address sender = msg.sender;
        require(
            totalSupply() + _count <= MAX_GNP,
            "Transaction will exceed maximum supply of The GnarNarwhals Project"
        );

        if (sender != owner()) {
            require(saleOpen, "Sale is not open yet");
            require(!maxClaimed[sender],"27 GNPs has been minted by this address");
            require(
                _count > 0 && _count <= 18,
                "Min 1 & Max 18 GnarNarwhals can be minted per transaction"
            );
            require(
            27 >= balanceOf(sender) + _count,
            "Purchase will exceed max mint amount allowed per address"
            );
            require(
                msg.value >= getNFTPrice() * _count,
                "Ether sent with this transaction is not correct"
            );
              if (balanceOf(sender) + _count == 27) {
            maxClaimed[sender] = true;
            }
        }
        for (uint256 i = 0; i < _count; i++) {
            _mint(sender);
        }
    }

    function _mint(address _to) private {
        _tokenId.increment();
        uint256 tokenId = _tokenId.current();
        _safeMint(_to, tokenId);
        emit TheGnarNarwhalsProjectMinted(tokenId);
    }

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"totalMinted","type":"uint256"}],"name":"TheGnarNarwhalsProjectMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_GNP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNFTPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"maxClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"mintTheGnarNarwhalsProject","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_tier","type":"uint8"},{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setTierPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600d60006101000a81548160ff0219169083151502179055503480156200002c57600080fd5b5060405162005146380380620051468339818101604052810190620000529190620004ad565b6040518060400160405280601881526020017f54686520476e61724e61727768616c732050726f6a65637400000000000000008152506040518060400160405280600381526020017f474e5000000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000d69291906200037f565b508060019080519060200190620000ef9291906200037f565b5050506200011262000106620001dc60201b60201c565b620001e460201b60201c565b6200012381620002aa60201b60201c565b6703782dace9d90000600e6000600160ff1681526020019081526020016000208190555067025f839810978000600e6000600260ff168152602001908152602001600020819055506701f87c3f661b0000600e6000600360ff1681526020019081526020016000208190555066fc3e1fb30d8000600e6000600460ff16815260200190815260200160002081905550669536c708910000600e6000600560ff168152602001908152602001600020819055505062000705565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002ba620001dc60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002e06200035560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000339576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003309062000525565b60405180910390fd5b80600c9080519060200190620003519291906200037f565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8280546200038d90620005ed565b90600052602060002090601f016020900481019282620003b15760008555620003fd565b82601f10620003cc57805160ff1916838001178555620003fd565b82800160010185558215620003fd579182015b82811115620003fc578251825591602001919060010190620003df565b5b5090506200040c919062000410565b5090565b5b808211156200042b57600081600090555060010162000411565b5090565b600062000446620004408462000570565b62000547565b905082815260208101848484011115620004655762000464620006bc565b5b62000472848285620005b7565b509392505050565b600082601f830112620004925762000491620006b7565b5b8151620004a48482602086016200042f565b91505092915050565b600060208284031215620004c657620004c5620006c6565b5b600082015167ffffffffffffffff811115620004e757620004e6620006c1565b5b620004f5848285016200047a565b91505092915050565b60006200050d602083620005a6565b91506200051a82620006dc565b602082019050919050565b600060208201905081810360008301526200054081620004fe565b9050919050565b60006200055362000566565b905062000561828262000623565b919050565b6000604051905090565b600067ffffffffffffffff8211156200058e576200058d62000688565b5b6200059982620006cb565b9050602081019050919050565b600082825260208201905092915050565b60005b83811015620005d7578082015181840152602081019050620005ba565b83811115620005e7576000848401525b50505050565b600060028204905060018216806200060657607f821691505b602082108114156200061d576200061c62000659565b5b50919050565b6200062e82620006cb565b810181811067ffffffffffffffff8211171562000650576200064f62000688565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b614a3180620007156000396000f3fe6080604052600436106101cd5760003560e01c806370a08231116100f7578063b7fafcd711610095578063dde8a08c11610064578063dde8a08c1461068b578063e985e9c5146106b6578063f2fde38b146106f3578063fb107a4f1461071c576101cd565b8063b7fafcd7146105ab578063b88d4fde146105e8578063c72900b014610611578063c87b56dd1461064e576101cd565b80638da5cb5b116100d15780638da5cb5b1461050157806395d89b411461052c57806399288dbb14610557578063a22cb46514610582576101cd565b806370a0823114610496578063715018a6146104d3578063853828b6146104ea576101cd565b806334918dfd1161016f5780634f6ccce71161013e5780634f6ccce7146103d757806355f804b31461041457806359ca63c91461043d5780636352211e14610459576101cd565b806334918dfd1461033157806342842e0e14610348578063438b6300146103715780634a5c6f8c146103ae576101cd565b8063095ea7b3116101ab578063095ea7b31461027757806318160ddd146102a057806323b872dd146102cb5780632f745c59146102f4576101cd565b806301ffc9a7146101d257806306fdde031461020f578063081812fc1461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190613258565b610747565b6040516102069190613980565b60405180910390f35b34801561021b57600080fd5b506102246107c1565b604051610231919061399b565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c91906132fb565b610853565b60405161026e91906138f7565b60405180910390f35b34801561028357600080fd5b5061029e60048036038101906102999190613218565b6108d8565b005b3480156102ac57600080fd5b506102b56109f0565b6040516102c29190613d1d565b60405180910390f35b3480156102d757600080fd5b506102f260048036038101906102ed9190613102565b6109fd565b005b34801561030057600080fd5b5061031b60048036038101906103169190613218565b610a5d565b6040516103289190613d1d565b60405180910390f35b34801561033d57600080fd5b50610346610b02565b005b34801561035457600080fd5b5061036f600480360381019061036a9190613102565b610baa565b005b34801561037d57600080fd5b5061039860048036038101906103939190613095565b610bca565b6040516103a5919061395e565b60405180910390f35b3480156103ba57600080fd5b506103d560048036038101906103d09190613355565b610c78565b005b3480156103e357600080fd5b506103fe60048036038101906103f991906132fb565b610d6c565b60405161040b9190613d1d565b60405180910390f35b34801561042057600080fd5b5061043b600480360381019061043691906132b2565b610ddd565b005b610457600480360381019061045291906132fb565b610e73565b005b34801561046557600080fd5b50610480600480360381019061047b91906132fb565b611183565b60405161048d91906138f7565b60405180910390f35b3480156104a257600080fd5b506104bd60048036038101906104b89190613095565b611235565b6040516104ca9190613d1d565b60405180910390f35b3480156104df57600080fd5b506104e86112ed565b005b3480156104f657600080fd5b506104ff611375565b005b34801561050d57600080fd5b50610516611693565b60405161052391906138f7565b60405180910390f35b34801561053857600080fd5b506105416116bd565b60405161054e919061399b565b60405180910390f35b34801561056357600080fd5b5061056c61174f565b6040516105799190613980565b60405180910390f35b34801561058e57600080fd5b506105a960048036038101906105a491906131d8565b611762565b005b3480156105b757600080fd5b506105d260048036038101906105cd9190613328565b6118e3565b6040516105df9190613d1d565b60405180910390f35b3480156105f457600080fd5b5061060f600480360381019061060a9190613155565b6118fb565b005b34801561061d57600080fd5b5061063860048036038101906106339190613095565b61195d565b6040516106459190613980565b60405180910390f35b34801561065a57600080fd5b50610675600480360381019061067091906132fb565b61197d565b604051610682919061399b565b60405180910390f35b34801561069757600080fd5b506106a0611a24565b6040516106ad9190613d1d565b60405180910390f35b3480156106c257600080fd5b506106dd60048036038101906106d891906130c2565b611a2a565b6040516106ea9190613980565b60405180910390f35b3480156106ff57600080fd5b5061071a60048036038101906107159190613095565b611abe565b005b34801561072857600080fd5b50610731611bb6565b60405161073e9190613d1d565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107ba57506107b982611c8a565b5b9050919050565b6060600080546107d09061401e565b80601f01602080910402602001604051908101604052809291908181526020018280546107fc9061401e565b80156108495780601f1061081e57610100808354040283529160200191610849565b820191906000526020600020905b81548152906001019060200180831161082c57829003601f168201915b5050505050905090565b600061085e82611d6c565b61089d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089490613b7d565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108e382611183565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610954576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094b90613c1d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610973611dd8565b73ffffffffffffffffffffffffffffffffffffffff1614806109a257506109a18161099c611dd8565b611a2a565b5b6109e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d890613afd565b60405180910390fd5b6109eb8383611de0565b505050565b6000600880549050905090565b610a0e610a08611dd8565b82611e99565b610a4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4490613c5d565b60405180910390fd5b610a58838383611f77565b505050565b6000610a6883611235565b8210610aa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa0906139dd565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610b0a611dd8565b73ffffffffffffffffffffffffffffffffffffffff16610b28611693565b73ffffffffffffffffffffffffffffffffffffffff1614610b7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7590613bbd565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b610bc5838383604051806020016040528060008152506118fb565b505050565b60606000610bd783611235565b905060008167ffffffffffffffff811115610bf557610bf46141e6565b5b604051908082528060200260200182016040528015610c235781602001602082028036833780820191505090505b50905060005b82811015610c6d57610c3b8582610a5d565b828281518110610c4e57610c4d6141b7565b5b6020026020010181815250508080610c6590614081565b915050610c29565b508092505050919050565b610c80611dd8565b73ffffffffffffffffffffffffffffffffffffffff16610c9e611693565b73ffffffffffffffffffffffffffffffffffffffff1614610cf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ceb90613bbd565b60405180910390fd5b60008260ff16118015610d0b575060058260ff1611155b610d4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4190613cfd565b60405180910390fd5b80600e60008460ff1660ff168152602001908152602001600020819055505050565b6000610d766109f0565b8210610db7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dae90613c7d565b60405180910390fd5b60088281548110610dcb57610dca6141b7565b5b90600052602060002001549050919050565b610de5611dd8565b73ffffffffffffffffffffffffffffffffffffffff16610e03611693565b73ffffffffffffffffffffffffffffffffffffffff1614610e59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5090613bbd565b60405180910390fd5b80600c9080519060200190610e6f929190612e94565b5050565b600033905061276082610e846109f0565b610e8e9190613e46565b1115610ecf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec690613cbd565b60405180910390fd5b610ed7611693565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461115757600d60009054906101000a900460ff16610f58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4f90613a9d565b60405180910390fd5b600f60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610fe5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fdc906139bd565b60405180910390fd5b600082118015610ff6575060128211155b611035576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102c90613add565b60405180910390fd5b8161103f82611235565b6110499190613e46565b601b101561108c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108390613cdd565b60405180910390fd5b81611095611bb6565b61109f9190613ecd565b3410156110e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d890613b9d565b60405180910390fd5b601b826110ed83611235565b6110f79190613e46565b1415611156576001600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b5b60005b8281101561117e5761116b826121d3565b808061117690614081565b91505061115a565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561122c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122390613b3d565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129d90613b1d565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6112f5611dd8565b73ffffffffffffffffffffffffffffffffffffffff16611313611693565b73ffffffffffffffffffffffffffffffffffffffff1614611369576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136090613bbd565b60405180910390fd5b6113736000612230565b565b61137d611dd8565b73ffffffffffffffffffffffffffffffffffffffff1661139b611693565b73ffffffffffffffffffffffffffffffffffffffff16146113f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e890613bbd565b60405180910390fd5b600047905060008111611439576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143090613c9d565b60405180910390fd5b61147173c6ddd3e9e2debb5247877fc16160963682b6d1b36103e8610113846114629190613ecd565b61146c9190613e9c565b6122f6565b6114a773c5cc3108fa5523ecb6a6260251129c2bbce8d1ef60646003846114989190613ecd565b6114a29190613e9c565b6122f6565b6114dd733d44b9763b3e4895c892a5b29dccc6e1e5b2ec046064600f846114ce9190613ecd565b6114d89190613e9c565b6122f6565b6115137376a837a1464d1ca2a4f05a1170191a7aaf23c7ab6064600f846115049190613ecd565b61150e9190613e9c565b6122f6565b61154a73d10852fbd8d696e67ad07ecd8b22fcf6cbf53da86103e8604b8461153b9190613ecd565b6115459190613e9c565b6122f6565b611581736107ebbafcf78427be7639ec478643412cbb00c66103e86069846115729190613ecd565b61157c9190613e9c565b6122f6565b6115b773f304f50ebc76a915385c0119b11131dbceb9490560646003846115a89190613ecd565b6115b29190613e9c565b6122f6565b6115ed73cbbc43795a033be2a643c2beed026c97129e85cd60646001846115de9190613ecd565b6115e89190613e9c565b6122f6565b611623739fc0fb02b1c2429065b5e75e008f4bc220730a1360646005846116149190613ecd565b61161e9190613e9c565b6122f6565b61165a73131b1b9bfad7375733d28fcf070cf945ce9ee4c56103e860198461164b9190613ecd565b6116559190613e9c565b6122f6565b61169073db75d14117e7802e0596baf2c92b90c0f0ab1aa56064600a846116819190613ecd565b61168b9190613e9c565b6122f6565b50565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546116cc9061401e565b80601f01602080910402602001604051908101604052809291908181526020018280546116f89061401e565b80156117455780601f1061171a57610100808354040283529160200191611745565b820191906000526020600020905b81548152906001019060200180831161172857829003601f168201915b5050505050905090565b600d60009054906101000a900460ff1681565b61176a611dd8565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cf90613a7d565b60405180910390fd5b80600560006117e5611dd8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611892611dd8565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118d79190613980565b60405180910390a35050565b600e6020528060005260406000206000915090505481565b61190c611906611dd8565b83611e99565b61194b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194290613c5d565b60405180910390fd5b611957848484846123a7565b50505050565b600f6020528060005260406000206000915054906101000a900460ff1681565b606061198882611d6c565b6119c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119be90613bfd565b60405180910390fd5b60006119d1612403565b905060008151116119f15760405180602001604052806000815250611a1c565b806119fb84612495565b604051602001611a0c9291906138be565b6040516020818303038152906040525b915050919050565b61276081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611ac6611dd8565b73ffffffffffffffffffffffffffffffffffffffff16611ae4611693565b73ffffffffffffffffffffffffffffffffffffffff1614611b3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3190613bbd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611baa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba190613a1d565b60405180910390fd5b611bb381612230565b50565b600080611bc16109f0565b9050611b58811115611bed57600e6000600160ff16815260200190815260200160002054915050611c87565b611194811115611c1757600e6000600260ff16815260200190815260200160002054915050611c87565b6109c4811115611c4157600e6000600360ff16815260200190815260200160002054915050611c87565b6103e8811115611c6b57600e6000600460ff16815260200190815260200160002054915050611c87565b600e6000600560ff168152602001908152602001600020549150505b90565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611d5557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611d655750611d64826125f6565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611e5383611183565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611ea482611d6c565b611ee3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eda90613abd565b60405180910390fd5b6000611eee83611183565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611f5d57508373ffffffffffffffffffffffffffffffffffffffff16611f4584610853565b73ffffffffffffffffffffffffffffffffffffffff16145b80611f6e5750611f6d8185611a2a565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611f9782611183565b73ffffffffffffffffffffffffffffffffffffffff1614611fed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe490613bdd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561205d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205490613a5d565b60405180910390fd5b612068838383612660565b612073600082611de0565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120c39190613f27565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461211a9190613e46565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6121dd600b612774565b60006121e9600b61278a565b90506121f58282612798565b7ffdaac13c65b0d60eab42d8afcfb521f439bc32b87a0a81ca3a8266e8905fce35816040516122249190613d1d565b60405180910390a15050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008273ffffffffffffffffffffffffffffffffffffffff168260405161231c906138e2565b60006040518083038185875af1925050503d8060008114612359576040519150601f19603f3d011682016040523d82523d6000602084013e61235e565b606091505b50509050806123a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239990613c3d565b60405180910390fd5b505050565b6123b2848484611f77565b6123be848484846127b6565b6123fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f4906139fd565b60405180910390fd5b50505050565b6060600c80546124129061401e565b80601f016020809104026020016040519081016040528092919081815260200182805461243e9061401e565b801561248b5780601f106124605761010080835404028352916020019161248b565b820191906000526020600020905b81548152906001019060200180831161246e57829003601f168201915b5050505050905090565b606060008214156124dd576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506125f1565b600082905060005b6000821461250f5780806124f890614081565b915050600a826125089190613e9c565b91506124e5565b60008167ffffffffffffffff81111561252b5761252a6141e6565b5b6040519080825280601f01601f19166020018201604052801561255d5781602001600182028036833780820191505090505b5090505b600085146125ea576001826125769190613f27565b9150600a8561258591906140ca565b60306125919190613e46565b60f81b8183815181106125a7576125a66141b7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856125e39190613e9c565b9450612561565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61266b83838361294d565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156126ae576126a981612952565b6126ed565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146126ec576126eb838261299b565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127305761272b81612b08565b61276f565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461276e5761276d8282612bd9565b5b5b505050565b6001816000016000828254019250508190555050565b600081600001549050919050565b6127b2828260405180602001604052806000815250612c58565b5050565b60006127d78473ffffffffffffffffffffffffffffffffffffffff16612cb3565b15612940578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612800611dd8565b8786866040518563ffffffff1660e01b81526004016128229493929190613912565b602060405180830381600087803b15801561283c57600080fd5b505af192505050801561286d57506040513d601f19601f8201168201806040525081019061286a9190613285565b60015b6128f0573d806000811461289d576040519150601f19603f3d011682016040523d82523d6000602084013e6128a2565b606091505b506000815114156128e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128df906139fd565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612945565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016129a884611235565b6129b29190613f27565b9050600060076000848152602001908152602001600020549050818114612a97576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612b1c9190613f27565b9050600060096000848152602001908152602001600020549050600060088381548110612b4c57612b4b6141b7565b5b906000526020600020015490508060088381548110612b6e57612b6d6141b7565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612bbd57612bbc614188565b5b6001900381819060005260206000200160009055905550505050565b6000612be483611235565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b612c628383612cc6565b612c6f60008484846127b6565b612cae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ca5906139fd565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2d90613b5d565b60405180910390fd5b612d3f81611d6c565b15612d7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7690613a3d565b60405180910390fd5b612d8b60008383612660565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ddb9190613e46565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054612ea09061401e565b90600052602060002090601f016020900481019282612ec25760008555612f09565b82601f10612edb57805160ff1916838001178555612f09565b82800160010185558215612f09579182015b82811115612f08578251825591602001919060010190612eed565b5b509050612f169190612f1a565b5090565b5b80821115612f33576000816000905550600101612f1b565b5090565b6000612f4a612f4584613d5d565b613d38565b905082815260208101848484011115612f6657612f6561421a565b5b612f71848285613fdc565b509392505050565b6000612f8c612f8784613d8e565b613d38565b905082815260208101848484011115612fa857612fa761421a565b5b612fb3848285613fdc565b509392505050565b600081359050612fca81614988565b92915050565b600081359050612fdf8161499f565b92915050565b600081359050612ff4816149b6565b92915050565b600081519050613009816149b6565b92915050565b600082601f83011261302457613023614215565b5b8135613034848260208601612f37565b91505092915050565b600082601f83011261305257613051614215565b5b8135613062848260208601612f79565b91505092915050565b60008135905061307a816149cd565b92915050565b60008135905061308f816149e4565b92915050565b6000602082840312156130ab576130aa614224565b5b60006130b984828501612fbb565b91505092915050565b600080604083850312156130d9576130d8614224565b5b60006130e785828601612fbb565b92505060206130f885828601612fbb565b9150509250929050565b60008060006060848603121561311b5761311a614224565b5b600061312986828701612fbb565b935050602061313a86828701612fbb565b925050604061314b8682870161306b565b9150509250925092565b6000806000806080858703121561316f5761316e614224565b5b600061317d87828801612fbb565b945050602061318e87828801612fbb565b935050604061319f8782880161306b565b925050606085013567ffffffffffffffff8111156131c0576131bf61421f565b5b6131cc8782880161300f565b91505092959194509250565b600080604083850312156131ef576131ee614224565b5b60006131fd85828601612fbb565b925050602061320e85828601612fd0565b9150509250929050565b6000806040838503121561322f5761322e614224565b5b600061323d85828601612fbb565b925050602061324e8582860161306b565b9150509250929050565b60006020828403121561326e5761326d614224565b5b600061327c84828501612fe5565b91505092915050565b60006020828403121561329b5761329a614224565b5b60006132a984828501612ffa565b91505092915050565b6000602082840312156132c8576132c7614224565b5b600082013567ffffffffffffffff8111156132e6576132e561421f565b5b6132f28482850161303d565b91505092915050565b60006020828403121561331157613310614224565b5b600061331f8482850161306b565b91505092915050565b60006020828403121561333e5761333d614224565b5b600061334c84828501613080565b91505092915050565b6000806040838503121561336c5761336b614224565b5b600061337a85828601613080565b925050602061338b8582860161306b565b9150509250929050565b60006133a183836138a0565b60208301905092915050565b6133b681613f5b565b82525050565b60006133c782613dcf565b6133d18185613dfd565b93506133dc83613dbf565b8060005b8381101561340d5781516133f48882613395565b97506133ff83613df0565b9250506001810190506133e0565b5085935050505092915050565b61342381613f6d565b82525050565b600061343482613dda565b61343e8185613e0e565b935061344e818560208601613feb565b61345781614229565b840191505092915050565b600061346d82613de5565b6134778185613e2a565b9350613487818560208601613feb565b61349081614229565b840191505092915050565b60006134a682613de5565b6134b08185613e3b565b93506134c0818560208601613feb565b80840191505092915050565b60006134d9602783613e2a565b91506134e48261423a565b604082019050919050565b60006134fc602b83613e2a565b915061350782614289565b604082019050919050565b600061351f603283613e2a565b915061352a826142d8565b604082019050919050565b6000613542602683613e2a565b915061354d82614327565b604082019050919050565b6000613565601c83613e2a565b915061357082614376565b602082019050919050565b6000613588602483613e2a565b91506135938261439f565b604082019050919050565b60006135ab601983613e2a565b91506135b6826143ee565b602082019050919050565b60006135ce601483613e2a565b91506135d982614417565b602082019050919050565b60006135f1602c83613e2a565b91506135fc82614440565b604082019050919050565b6000613614603983613e2a565b915061361f8261448f565b604082019050919050565b6000613637603883613e2a565b9150613642826144de565b604082019050919050565b600061365a602a83613e2a565b91506136658261452d565b604082019050919050565b600061367d602983613e2a565b91506136888261457c565b604082019050919050565b60006136a0602083613e2a565b91506136ab826145cb565b602082019050919050565b60006136c3602c83613e2a565b91506136ce826145f4565b604082019050919050565b60006136e6602f83613e2a565b91506136f182614643565b604082019050919050565b6000613709602083613e2a565b915061371482614692565b602082019050919050565b600061372c602983613e2a565b9150613737826146bb565b604082019050919050565b600061374f602f83613e2a565b915061375a8261470a565b604082019050919050565b6000613772602183613e2a565b915061377d82614759565b604082019050919050565b6000613795600083613e1f565b91506137a0826147a8565b600082019050919050565b60006137b8601083613e2a565b91506137c3826147ab565b602082019050919050565b60006137db603183613e2a565b91506137e6826147d4565b604082019050919050565b60006137fe602c83613e2a565b915061380982614823565b604082019050919050565b6000613821600883613e2a565b915061382c82614872565b602082019050919050565b6000613844604283613e2a565b915061384f8261489b565b606082019050919050565b6000613867603883613e2a565b915061387282614910565b604082019050919050565b600061388a600c83613e2a565b91506138958261495f565b602082019050919050565b6138a981613fc5565b82525050565b6138b881613fc5565b82525050565b60006138ca828561349b565b91506138d6828461349b565b91508190509392505050565b60006138ed82613788565b9150819050919050565b600060208201905061390c60008301846133ad565b92915050565b600060808201905061392760008301876133ad565b61393460208301866133ad565b61394160408301856138af565b81810360608301526139538184613429565b905095945050505050565b6000602082019050818103600083015261397881846133bc565b905092915050565b6000602082019050613995600083018461341a565b92915050565b600060208201905081810360008301526139b58184613462565b905092915050565b600060208201905081810360008301526139d6816134cc565b9050919050565b600060208201905081810360008301526139f6816134ef565b9050919050565b60006020820190508181036000830152613a1681613512565b9050919050565b60006020820190508181036000830152613a3681613535565b9050919050565b60006020820190508181036000830152613a5681613558565b9050919050565b60006020820190508181036000830152613a768161357b565b9050919050565b60006020820190508181036000830152613a968161359e565b9050919050565b60006020820190508181036000830152613ab6816135c1565b9050919050565b60006020820190508181036000830152613ad6816135e4565b9050919050565b60006020820190508181036000830152613af681613607565b9050919050565b60006020820190508181036000830152613b168161362a565b9050919050565b60006020820190508181036000830152613b368161364d565b9050919050565b60006020820190508181036000830152613b5681613670565b9050919050565b60006020820190508181036000830152613b7681613693565b9050919050565b60006020820190508181036000830152613b96816136b6565b9050919050565b60006020820190508181036000830152613bb6816136d9565b9050919050565b60006020820190508181036000830152613bd6816136fc565b9050919050565b60006020820190508181036000830152613bf68161371f565b9050919050565b60006020820190508181036000830152613c1681613742565b9050919050565b60006020820190508181036000830152613c3681613765565b9050919050565b60006020820190508181036000830152613c56816137ab565b9050919050565b60006020820190508181036000830152613c76816137ce565b9050919050565b60006020820190508181036000830152613c96816137f1565b9050919050565b60006020820190508181036000830152613cb681613814565b9050919050565b60006020820190508181036000830152613cd681613837565b9050919050565b60006020820190508181036000830152613cf68161385a565b9050919050565b60006020820190508181036000830152613d168161387d565b9050919050565b6000602082019050613d3260008301846138af565b92915050565b6000613d42613d53565b9050613d4e8282614050565b919050565b6000604051905090565b600067ffffffffffffffff821115613d7857613d776141e6565b5b613d8182614229565b9050602081019050919050565b600067ffffffffffffffff821115613da957613da86141e6565b5b613db282614229565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613e5182613fc5565b9150613e5c83613fc5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613e9157613e906140fb565b5b828201905092915050565b6000613ea782613fc5565b9150613eb283613fc5565b925082613ec257613ec161412a565b5b828204905092915050565b6000613ed882613fc5565b9150613ee383613fc5565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613f1c57613f1b6140fb565b5b828202905092915050565b6000613f3282613fc5565b9150613f3d83613fc5565b925082821015613f5057613f4f6140fb565b5b828203905092915050565b6000613f6682613fa5565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614009578082015181840152602081019050613fee565b83811115614018576000848401525b50505050565b6000600282049050600182168061403657607f821691505b6020821081141561404a57614049614159565b5b50919050565b61405982614229565b810181811067ffffffffffffffff82111715614078576140776141e6565b5b80604052505050565b600061408c82613fc5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156140bf576140be6140fb565b5b600182019050919050565b60006140d582613fc5565b91506140e083613fc5565b9250826140f0576140ef61412a565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f323720474e507320686173206265656e206d696e74656420627920746869732060008201527f6164647265737300000000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f53616c65206973206e6f74206f70656e20796574000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4d696e20312026204d617820313820476e61724e61727768616c732063616e2060008201527f6265206d696e74656420706572207472616e73616374696f6e00000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f45746865722073656e7420776974682074686973207472616e73616374696f6e60008201527f206973206e6f7420636f72726563740000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4e6f2066756e6473000000000000000000000000000000000000000000000000600082015250565b7f5472616e73616374696f6e2077696c6c20657863656564206d6178696d756d2060008201527f737570706c79206f662054686520476e61724e61727768616c732050726f6a6560208201527f6374000000000000000000000000000000000000000000000000000000000000604082015250565b7f50757263686173652077696c6c20657863656564206d6178206d696e7420616d60008201527f6f756e7420616c6c6f7765642070657220616464726573730000000000000000602082015250565b7f496e76616c696420546965720000000000000000000000000000000000000000600082015250565b61499181613f5b565b811461499c57600080fd5b50565b6149a881613f6d565b81146149b357600080fd5b50565b6149bf81613f79565b81146149ca57600080fd5b50565b6149d681613fc5565b81146149e157600080fd5b50565b6149ed81613fcf565b81146149f857600080fd5b5056fea264697066735822122037ba1fad9bb1eb4d474a1d99e4857c38de147ba0948fe3fa7bc1735a7b856a8464736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106101cd5760003560e01c806370a08231116100f7578063b7fafcd711610095578063dde8a08c11610064578063dde8a08c1461068b578063e985e9c5146106b6578063f2fde38b146106f3578063fb107a4f1461071c576101cd565b8063b7fafcd7146105ab578063b88d4fde146105e8578063c72900b014610611578063c87b56dd1461064e576101cd565b80638da5cb5b116100d15780638da5cb5b1461050157806395d89b411461052c57806399288dbb14610557578063a22cb46514610582576101cd565b806370a0823114610496578063715018a6146104d3578063853828b6146104ea576101cd565b806334918dfd1161016f5780634f6ccce71161013e5780634f6ccce7146103d757806355f804b31461041457806359ca63c91461043d5780636352211e14610459576101cd565b806334918dfd1461033157806342842e0e14610348578063438b6300146103715780634a5c6f8c146103ae576101cd565b8063095ea7b3116101ab578063095ea7b31461027757806318160ddd146102a057806323b872dd146102cb5780632f745c59146102f4576101cd565b806301ffc9a7146101d257806306fdde031461020f578063081812fc1461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190613258565b610747565b6040516102069190613980565b60405180910390f35b34801561021b57600080fd5b506102246107c1565b604051610231919061399b565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c91906132fb565b610853565b60405161026e91906138f7565b60405180910390f35b34801561028357600080fd5b5061029e60048036038101906102999190613218565b6108d8565b005b3480156102ac57600080fd5b506102b56109f0565b6040516102c29190613d1d565b60405180910390f35b3480156102d757600080fd5b506102f260048036038101906102ed9190613102565b6109fd565b005b34801561030057600080fd5b5061031b60048036038101906103169190613218565b610a5d565b6040516103289190613d1d565b60405180910390f35b34801561033d57600080fd5b50610346610b02565b005b34801561035457600080fd5b5061036f600480360381019061036a9190613102565b610baa565b005b34801561037d57600080fd5b5061039860048036038101906103939190613095565b610bca565b6040516103a5919061395e565b60405180910390f35b3480156103ba57600080fd5b506103d560048036038101906103d09190613355565b610c78565b005b3480156103e357600080fd5b506103fe60048036038101906103f991906132fb565b610d6c565b60405161040b9190613d1d565b60405180910390f35b34801561042057600080fd5b5061043b600480360381019061043691906132b2565b610ddd565b005b610457600480360381019061045291906132fb565b610e73565b005b34801561046557600080fd5b50610480600480360381019061047b91906132fb565b611183565b60405161048d91906138f7565b60405180910390f35b3480156104a257600080fd5b506104bd60048036038101906104b89190613095565b611235565b6040516104ca9190613d1d565b60405180910390f35b3480156104df57600080fd5b506104e86112ed565b005b3480156104f657600080fd5b506104ff611375565b005b34801561050d57600080fd5b50610516611693565b60405161052391906138f7565b60405180910390f35b34801561053857600080fd5b506105416116bd565b60405161054e919061399b565b60405180910390f35b34801561056357600080fd5b5061056c61174f565b6040516105799190613980565b60405180910390f35b34801561058e57600080fd5b506105a960048036038101906105a491906131d8565b611762565b005b3480156105b757600080fd5b506105d260048036038101906105cd9190613328565b6118e3565b6040516105df9190613d1d565b60405180910390f35b3480156105f457600080fd5b5061060f600480360381019061060a9190613155565b6118fb565b005b34801561061d57600080fd5b5061063860048036038101906106339190613095565b61195d565b6040516106459190613980565b60405180910390f35b34801561065a57600080fd5b50610675600480360381019061067091906132fb565b61197d565b604051610682919061399b565b60405180910390f35b34801561069757600080fd5b506106a0611a24565b6040516106ad9190613d1d565b60405180910390f35b3480156106c257600080fd5b506106dd60048036038101906106d891906130c2565b611a2a565b6040516106ea9190613980565b60405180910390f35b3480156106ff57600080fd5b5061071a60048036038101906107159190613095565b611abe565b005b34801561072857600080fd5b50610731611bb6565b60405161073e9190613d1d565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107ba57506107b982611c8a565b5b9050919050565b6060600080546107d09061401e565b80601f01602080910402602001604051908101604052809291908181526020018280546107fc9061401e565b80156108495780601f1061081e57610100808354040283529160200191610849565b820191906000526020600020905b81548152906001019060200180831161082c57829003601f168201915b5050505050905090565b600061085e82611d6c565b61089d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089490613b7d565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108e382611183565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610954576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094b90613c1d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610973611dd8565b73ffffffffffffffffffffffffffffffffffffffff1614806109a257506109a18161099c611dd8565b611a2a565b5b6109e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d890613afd565b60405180910390fd5b6109eb8383611de0565b505050565b6000600880549050905090565b610a0e610a08611dd8565b82611e99565b610a4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4490613c5d565b60405180910390fd5b610a58838383611f77565b505050565b6000610a6883611235565b8210610aa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa0906139dd565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610b0a611dd8565b73ffffffffffffffffffffffffffffffffffffffff16610b28611693565b73ffffffffffffffffffffffffffffffffffffffff1614610b7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7590613bbd565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b610bc5838383604051806020016040528060008152506118fb565b505050565b60606000610bd783611235565b905060008167ffffffffffffffff811115610bf557610bf46141e6565b5b604051908082528060200260200182016040528015610c235781602001602082028036833780820191505090505b50905060005b82811015610c6d57610c3b8582610a5d565b828281518110610c4e57610c4d6141b7565b5b6020026020010181815250508080610c6590614081565b915050610c29565b508092505050919050565b610c80611dd8565b73ffffffffffffffffffffffffffffffffffffffff16610c9e611693565b73ffffffffffffffffffffffffffffffffffffffff1614610cf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ceb90613bbd565b60405180910390fd5b60008260ff16118015610d0b575060058260ff1611155b610d4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4190613cfd565b60405180910390fd5b80600e60008460ff1660ff168152602001908152602001600020819055505050565b6000610d766109f0565b8210610db7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dae90613c7d565b60405180910390fd5b60088281548110610dcb57610dca6141b7565b5b90600052602060002001549050919050565b610de5611dd8565b73ffffffffffffffffffffffffffffffffffffffff16610e03611693565b73ffffffffffffffffffffffffffffffffffffffff1614610e59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5090613bbd565b60405180910390fd5b80600c9080519060200190610e6f929190612e94565b5050565b600033905061276082610e846109f0565b610e8e9190613e46565b1115610ecf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec690613cbd565b60405180910390fd5b610ed7611693565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461115757600d60009054906101000a900460ff16610f58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4f90613a9d565b60405180910390fd5b600f60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610fe5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fdc906139bd565b60405180910390fd5b600082118015610ff6575060128211155b611035576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102c90613add565b60405180910390fd5b8161103f82611235565b6110499190613e46565b601b101561108c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108390613cdd565b60405180910390fd5b81611095611bb6565b61109f9190613ecd565b3410156110e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d890613b9d565b60405180910390fd5b601b826110ed83611235565b6110f79190613e46565b1415611156576001600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b5b60005b8281101561117e5761116b826121d3565b808061117690614081565b91505061115a565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561122c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122390613b3d565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129d90613b1d565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6112f5611dd8565b73ffffffffffffffffffffffffffffffffffffffff16611313611693565b73ffffffffffffffffffffffffffffffffffffffff1614611369576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136090613bbd565b60405180910390fd5b6113736000612230565b565b61137d611dd8565b73ffffffffffffffffffffffffffffffffffffffff1661139b611693565b73ffffffffffffffffffffffffffffffffffffffff16146113f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e890613bbd565b60405180910390fd5b600047905060008111611439576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143090613c9d565b60405180910390fd5b61147173c6ddd3e9e2debb5247877fc16160963682b6d1b36103e8610113846114629190613ecd565b61146c9190613e9c565b6122f6565b6114a773c5cc3108fa5523ecb6a6260251129c2bbce8d1ef60646003846114989190613ecd565b6114a29190613e9c565b6122f6565b6114dd733d44b9763b3e4895c892a5b29dccc6e1e5b2ec046064600f846114ce9190613ecd565b6114d89190613e9c565b6122f6565b6115137376a837a1464d1ca2a4f05a1170191a7aaf23c7ab6064600f846115049190613ecd565b61150e9190613e9c565b6122f6565b61154a73d10852fbd8d696e67ad07ecd8b22fcf6cbf53da86103e8604b8461153b9190613ecd565b6115459190613e9c565b6122f6565b611581736107ebbafcf78427be7639ec478643412cbb00c66103e86069846115729190613ecd565b61157c9190613e9c565b6122f6565b6115b773f304f50ebc76a915385c0119b11131dbceb9490560646003846115a89190613ecd565b6115b29190613e9c565b6122f6565b6115ed73cbbc43795a033be2a643c2beed026c97129e85cd60646001846115de9190613ecd565b6115e89190613e9c565b6122f6565b611623739fc0fb02b1c2429065b5e75e008f4bc220730a1360646005846116149190613ecd565b61161e9190613e9c565b6122f6565b61165a73131b1b9bfad7375733d28fcf070cf945ce9ee4c56103e860198461164b9190613ecd565b6116559190613e9c565b6122f6565b61169073db75d14117e7802e0596baf2c92b90c0f0ab1aa56064600a846116819190613ecd565b61168b9190613e9c565b6122f6565b50565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546116cc9061401e565b80601f01602080910402602001604051908101604052809291908181526020018280546116f89061401e565b80156117455780601f1061171a57610100808354040283529160200191611745565b820191906000526020600020905b81548152906001019060200180831161172857829003601f168201915b5050505050905090565b600d60009054906101000a900460ff1681565b61176a611dd8565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cf90613a7d565b60405180910390fd5b80600560006117e5611dd8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611892611dd8565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118d79190613980565b60405180910390a35050565b600e6020528060005260406000206000915090505481565b61190c611906611dd8565b83611e99565b61194b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194290613c5d565b60405180910390fd5b611957848484846123a7565b50505050565b600f6020528060005260406000206000915054906101000a900460ff1681565b606061198882611d6c565b6119c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119be90613bfd565b60405180910390fd5b60006119d1612403565b905060008151116119f15760405180602001604052806000815250611a1c565b806119fb84612495565b604051602001611a0c9291906138be565b6040516020818303038152906040525b915050919050565b61276081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611ac6611dd8565b73ffffffffffffffffffffffffffffffffffffffff16611ae4611693565b73ffffffffffffffffffffffffffffffffffffffff1614611b3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3190613bbd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611baa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba190613a1d565b60405180910390fd5b611bb381612230565b50565b600080611bc16109f0565b9050611b58811115611bed57600e6000600160ff16815260200190815260200160002054915050611c87565b611194811115611c1757600e6000600260ff16815260200190815260200160002054915050611c87565b6109c4811115611c4157600e6000600360ff16815260200190815260200160002054915050611c87565b6103e8811115611c6b57600e6000600460ff16815260200190815260200160002054915050611c87565b600e6000600560ff168152602001908152602001600020549150505b90565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611d5557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611d655750611d64826125f6565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611e5383611183565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611ea482611d6c565b611ee3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eda90613abd565b60405180910390fd5b6000611eee83611183565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611f5d57508373ffffffffffffffffffffffffffffffffffffffff16611f4584610853565b73ffffffffffffffffffffffffffffffffffffffff16145b80611f6e5750611f6d8185611a2a565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611f9782611183565b73ffffffffffffffffffffffffffffffffffffffff1614611fed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe490613bdd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561205d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205490613a5d565b60405180910390fd5b612068838383612660565b612073600082611de0565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120c39190613f27565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461211a9190613e46565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6121dd600b612774565b60006121e9600b61278a565b90506121f58282612798565b7ffdaac13c65b0d60eab42d8afcfb521f439bc32b87a0a81ca3a8266e8905fce35816040516122249190613d1d565b60405180910390a15050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008273ffffffffffffffffffffffffffffffffffffffff168260405161231c906138e2565b60006040518083038185875af1925050503d8060008114612359576040519150601f19603f3d011682016040523d82523d6000602084013e61235e565b606091505b50509050806123a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239990613c3d565b60405180910390fd5b505050565b6123b2848484611f77565b6123be848484846127b6565b6123fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f4906139fd565b60405180910390fd5b50505050565b6060600c80546124129061401e565b80601f016020809104026020016040519081016040528092919081815260200182805461243e9061401e565b801561248b5780601f106124605761010080835404028352916020019161248b565b820191906000526020600020905b81548152906001019060200180831161246e57829003601f168201915b5050505050905090565b606060008214156124dd576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506125f1565b600082905060005b6000821461250f5780806124f890614081565b915050600a826125089190613e9c565b91506124e5565b60008167ffffffffffffffff81111561252b5761252a6141e6565b5b6040519080825280601f01601f19166020018201604052801561255d5781602001600182028036833780820191505090505b5090505b600085146125ea576001826125769190613f27565b9150600a8561258591906140ca565b60306125919190613e46565b60f81b8183815181106125a7576125a66141b7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856125e39190613e9c565b9450612561565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61266b83838361294d565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156126ae576126a981612952565b6126ed565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146126ec576126eb838261299b565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127305761272b81612b08565b61276f565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461276e5761276d8282612bd9565b5b5b505050565b6001816000016000828254019250508190555050565b600081600001549050919050565b6127b2828260405180602001604052806000815250612c58565b5050565b60006127d78473ffffffffffffffffffffffffffffffffffffffff16612cb3565b15612940578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612800611dd8565b8786866040518563ffffffff1660e01b81526004016128229493929190613912565b602060405180830381600087803b15801561283c57600080fd5b505af192505050801561286d57506040513d601f19601f8201168201806040525081019061286a9190613285565b60015b6128f0573d806000811461289d576040519150601f19603f3d011682016040523d82523d6000602084013e6128a2565b606091505b506000815114156128e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128df906139fd565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612945565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016129a884611235565b6129b29190613f27565b9050600060076000848152602001908152602001600020549050818114612a97576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612b1c9190613f27565b9050600060096000848152602001908152602001600020549050600060088381548110612b4c57612b4b6141b7565b5b906000526020600020015490508060088381548110612b6e57612b6d6141b7565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612bbd57612bbc614188565b5b6001900381819060005260206000200160009055905550505050565b6000612be483611235565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b612c628383612cc6565b612c6f60008484846127b6565b612cae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ca5906139fd565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2d90613b5d565b60405180910390fd5b612d3f81611d6c565b15612d7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7690613a3d565b60405180910390fd5b612d8b60008383612660565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ddb9190613e46565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054612ea09061401e565b90600052602060002090601f016020900481019282612ec25760008555612f09565b82601f10612edb57805160ff1916838001178555612f09565b82800160010185558215612f09579182015b82811115612f08578251825591602001919060010190612eed565b5b509050612f169190612f1a565b5090565b5b80821115612f33576000816000905550600101612f1b565b5090565b6000612f4a612f4584613d5d565b613d38565b905082815260208101848484011115612f6657612f6561421a565b5b612f71848285613fdc565b509392505050565b6000612f8c612f8784613d8e565b613d38565b905082815260208101848484011115612fa857612fa761421a565b5b612fb3848285613fdc565b509392505050565b600081359050612fca81614988565b92915050565b600081359050612fdf8161499f565b92915050565b600081359050612ff4816149b6565b92915050565b600081519050613009816149b6565b92915050565b600082601f83011261302457613023614215565b5b8135613034848260208601612f37565b91505092915050565b600082601f83011261305257613051614215565b5b8135613062848260208601612f79565b91505092915050565b60008135905061307a816149cd565b92915050565b60008135905061308f816149e4565b92915050565b6000602082840312156130ab576130aa614224565b5b60006130b984828501612fbb565b91505092915050565b600080604083850312156130d9576130d8614224565b5b60006130e785828601612fbb565b92505060206130f885828601612fbb565b9150509250929050565b60008060006060848603121561311b5761311a614224565b5b600061312986828701612fbb565b935050602061313a86828701612fbb565b925050604061314b8682870161306b565b9150509250925092565b6000806000806080858703121561316f5761316e614224565b5b600061317d87828801612fbb565b945050602061318e87828801612fbb565b935050604061319f8782880161306b565b925050606085013567ffffffffffffffff8111156131c0576131bf61421f565b5b6131cc8782880161300f565b91505092959194509250565b600080604083850312156131ef576131ee614224565b5b60006131fd85828601612fbb565b925050602061320e85828601612fd0565b9150509250929050565b6000806040838503121561322f5761322e614224565b5b600061323d85828601612fbb565b925050602061324e8582860161306b565b9150509250929050565b60006020828403121561326e5761326d614224565b5b600061327c84828501612fe5565b91505092915050565b60006020828403121561329b5761329a614224565b5b60006132a984828501612ffa565b91505092915050565b6000602082840312156132c8576132c7614224565b5b600082013567ffffffffffffffff8111156132e6576132e561421f565b5b6132f28482850161303d565b91505092915050565b60006020828403121561331157613310614224565b5b600061331f8482850161306b565b91505092915050565b60006020828403121561333e5761333d614224565b5b600061334c84828501613080565b91505092915050565b6000806040838503121561336c5761336b614224565b5b600061337a85828601613080565b925050602061338b8582860161306b565b9150509250929050565b60006133a183836138a0565b60208301905092915050565b6133b681613f5b565b82525050565b60006133c782613dcf565b6133d18185613dfd565b93506133dc83613dbf565b8060005b8381101561340d5781516133f48882613395565b97506133ff83613df0565b9250506001810190506133e0565b5085935050505092915050565b61342381613f6d565b82525050565b600061343482613dda565b61343e8185613e0e565b935061344e818560208601613feb565b61345781614229565b840191505092915050565b600061346d82613de5565b6134778185613e2a565b9350613487818560208601613feb565b61349081614229565b840191505092915050565b60006134a682613de5565b6134b08185613e3b565b93506134c0818560208601613feb565b80840191505092915050565b60006134d9602783613e2a565b91506134e48261423a565b604082019050919050565b60006134fc602b83613e2a565b915061350782614289565b604082019050919050565b600061351f603283613e2a565b915061352a826142d8565b604082019050919050565b6000613542602683613e2a565b915061354d82614327565b604082019050919050565b6000613565601c83613e2a565b915061357082614376565b602082019050919050565b6000613588602483613e2a565b91506135938261439f565b604082019050919050565b60006135ab601983613e2a565b91506135b6826143ee565b602082019050919050565b60006135ce601483613e2a565b91506135d982614417565b602082019050919050565b60006135f1602c83613e2a565b91506135fc82614440565b604082019050919050565b6000613614603983613e2a565b915061361f8261448f565b604082019050919050565b6000613637603883613e2a565b9150613642826144de565b604082019050919050565b600061365a602a83613e2a565b91506136658261452d565b604082019050919050565b600061367d602983613e2a565b91506136888261457c565b604082019050919050565b60006136a0602083613e2a565b91506136ab826145cb565b602082019050919050565b60006136c3602c83613e2a565b91506136ce826145f4565b604082019050919050565b60006136e6602f83613e2a565b91506136f182614643565b604082019050919050565b6000613709602083613e2a565b915061371482614692565b602082019050919050565b600061372c602983613e2a565b9150613737826146bb565b604082019050919050565b600061374f602f83613e2a565b915061375a8261470a565b604082019050919050565b6000613772602183613e2a565b915061377d82614759565b604082019050919050565b6000613795600083613e1f565b91506137a0826147a8565b600082019050919050565b60006137b8601083613e2a565b91506137c3826147ab565b602082019050919050565b60006137db603183613e2a565b91506137e6826147d4565b604082019050919050565b60006137fe602c83613e2a565b915061380982614823565b604082019050919050565b6000613821600883613e2a565b915061382c82614872565b602082019050919050565b6000613844604283613e2a565b915061384f8261489b565b606082019050919050565b6000613867603883613e2a565b915061387282614910565b604082019050919050565b600061388a600c83613e2a565b91506138958261495f565b602082019050919050565b6138a981613fc5565b82525050565b6138b881613fc5565b82525050565b60006138ca828561349b565b91506138d6828461349b565b91508190509392505050565b60006138ed82613788565b9150819050919050565b600060208201905061390c60008301846133ad565b92915050565b600060808201905061392760008301876133ad565b61393460208301866133ad565b61394160408301856138af565b81810360608301526139538184613429565b905095945050505050565b6000602082019050818103600083015261397881846133bc565b905092915050565b6000602082019050613995600083018461341a565b92915050565b600060208201905081810360008301526139b58184613462565b905092915050565b600060208201905081810360008301526139d6816134cc565b9050919050565b600060208201905081810360008301526139f6816134ef565b9050919050565b60006020820190508181036000830152613a1681613512565b9050919050565b60006020820190508181036000830152613a3681613535565b9050919050565b60006020820190508181036000830152613a5681613558565b9050919050565b60006020820190508181036000830152613a768161357b565b9050919050565b60006020820190508181036000830152613a968161359e565b9050919050565b60006020820190508181036000830152613ab6816135c1565b9050919050565b60006020820190508181036000830152613ad6816135e4565b9050919050565b60006020820190508181036000830152613af681613607565b9050919050565b60006020820190508181036000830152613b168161362a565b9050919050565b60006020820190508181036000830152613b368161364d565b9050919050565b60006020820190508181036000830152613b5681613670565b9050919050565b60006020820190508181036000830152613b7681613693565b9050919050565b60006020820190508181036000830152613b96816136b6565b9050919050565b60006020820190508181036000830152613bb6816136d9565b9050919050565b60006020820190508181036000830152613bd6816136fc565b9050919050565b60006020820190508181036000830152613bf68161371f565b9050919050565b60006020820190508181036000830152613c1681613742565b9050919050565b60006020820190508181036000830152613c3681613765565b9050919050565b60006020820190508181036000830152613c56816137ab565b9050919050565b60006020820190508181036000830152613c76816137ce565b9050919050565b60006020820190508181036000830152613c96816137f1565b9050919050565b60006020820190508181036000830152613cb681613814565b9050919050565b60006020820190508181036000830152613cd681613837565b9050919050565b60006020820190508181036000830152613cf68161385a565b9050919050565b60006020820190508181036000830152613d168161387d565b9050919050565b6000602082019050613d3260008301846138af565b92915050565b6000613d42613d53565b9050613d4e8282614050565b919050565b6000604051905090565b600067ffffffffffffffff821115613d7857613d776141e6565b5b613d8182614229565b9050602081019050919050565b600067ffffffffffffffff821115613da957613da86141e6565b5b613db282614229565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613e5182613fc5565b9150613e5c83613fc5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613e9157613e906140fb565b5b828201905092915050565b6000613ea782613fc5565b9150613eb283613fc5565b925082613ec257613ec161412a565b5b828204905092915050565b6000613ed882613fc5565b9150613ee383613fc5565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613f1c57613f1b6140fb565b5b828202905092915050565b6000613f3282613fc5565b9150613f3d83613fc5565b925082821015613f5057613f4f6140fb565b5b828203905092915050565b6000613f6682613fa5565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614009578082015181840152602081019050613fee565b83811115614018576000848401525b50505050565b6000600282049050600182168061403657607f821691505b6020821081141561404a57614049614159565b5b50919050565b61405982614229565b810181811067ffffffffffffffff82111715614078576140776141e6565b5b80604052505050565b600061408c82613fc5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156140bf576140be6140fb565b5b600182019050919050565b60006140d582613fc5565b91506140e083613fc5565b9250826140f0576140ef61412a565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f323720474e507320686173206265656e206d696e74656420627920746869732060008201527f6164647265737300000000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f53616c65206973206e6f74206f70656e20796574000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4d696e20312026204d617820313820476e61724e61727768616c732063616e2060008201527f6265206d696e74656420706572207472616e73616374696f6e00000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f45746865722073656e7420776974682074686973207472616e73616374696f6e60008201527f206973206e6f7420636f72726563740000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4e6f2066756e6473000000000000000000000000000000000000000000000000600082015250565b7f5472616e73616374696f6e2077696c6c20657863656564206d6178696d756d2060008201527f737570706c79206f662054686520476e61724e61727768616c732050726f6a6560208201527f6374000000000000000000000000000000000000000000000000000000000000604082015250565b7f50757263686173652077696c6c20657863656564206d6178206d696e7420616d60008201527f6f756e7420616c6c6f7765642070657220616464726573730000000000000000602082015250565b7f496e76616c696420546965720000000000000000000000000000000000000000600082015250565b61499181613f5b565b811461499c57600080fd5b50565b6149a881613f6d565b81146149b357600080fd5b50565b6149bf81613f79565b81146149ca57600080fd5b50565b6149d681613fc5565b81146149e157600080fd5b50565b6149ed81613fcf565b81146149f857600080fd5b5056fea264697066735822122037ba1fad9bb1eb4d474a1d99e4857c38de147ba0948fe3fa7bc1735a7b856a8464736f6c63430008070033

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

00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : baseURI (string):

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

46376:5436:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39872:300;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27032:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28725:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28248:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40675:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29784:376;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40256:343;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47911:83;;;;;;;;;;;;;:::i;:::-;;30231:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47179:385;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47681:175;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40865:320;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47572:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50335:1136;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26639:326;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26282:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9739:94;;;;;;;;;;;;;:::i;:::-;;48002:1509;;;;;;;;;;;;;:::i;:::-;;9088:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27201:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46600:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29105:327;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46635:38;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30487:365;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46680:40;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27376:468;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46528:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29503:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9988:229;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49708:584;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39872:300;40019:4;40076:35;40061:50;;;:11;:50;;;;:103;;;;40128:36;40152:11;40128:23;:36::i;:::-;40061:103;40041:123;;39872:300;;;:::o;27032:100::-;27086:13;27119:5;27112:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27032:100;:::o;28725:308::-;28846:7;28893:16;28901:7;28893;:16::i;:::-;28871:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;29001:15;:24;29017:7;29001:24;;;;;;;;;;;;;;;;;;;;;28994:31;;28725:308;;;:::o;28248:411::-;28329:13;28345:23;28360:7;28345:14;:23::i;:::-;28329:39;;28393:5;28387:11;;:2;:11;;;;28379:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;28487:5;28471:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;28496:37;28513:5;28520:12;:10;:12::i;:::-;28496:16;:37::i;:::-;28471:62;28449:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;28630:21;28639:2;28643:7;28630:8;:21::i;:::-;28318:341;28248:411;;:::o;40675:113::-;40736:7;40763:10;:17;;;;40756:24;;40675:113;:::o;29784:376::-;29993:41;30012:12;:10;:12::i;:::-;30026:7;29993:18;:41::i;:::-;29971:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;30124:28;30134:4;30140:2;30144:7;30124:9;:28::i;:::-;29784:376;;;:::o;40256:343::-;40398:7;40453:23;40470:5;40453:16;:23::i;:::-;40445:5;:31;40423:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;40565:12;:19;40578:5;40565:19;;;;;;;;;;;;;;;:26;40585:5;40565:26;;;;;;;;;;;;40558:33;;40256:343;;;;:::o;47911:83::-;9319:12;:10;:12::i;:::-;9308:23;;:7;:5;:7::i;:::-;:23;;;9300:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47978:8:::1;;;;;;;;;;;47977:9;47966:8;;:20;;;;;;;;;;;;;;;;;;47911:83::o:0;30231:185::-;30369:39;30386:4;30392:2;30396:7;30369:39;;;;;;;;;;;;:16;:39::i;:::-;30231:185;;;:::o;47179:385::-;47268:16;47302:18;47323:17;47333:6;47323:9;:17::i;:::-;47302:38;;47353:25;47395:10;47381:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47353:53;;47422:9;47417:112;47441:10;47437:1;:14;47417:112;;;47487:30;47507:6;47515:1;47487:19;:30::i;:::-;47473:8;47482:1;47473:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;47453:3;;;;;:::i;:::-;;;;47417:112;;;;47548:8;47541:15;;;;47179:385;;;:::o;47681:175::-;9319:12;:10;:12::i;:::-;9308:23;;:7;:5;:7::i;:::-;:23;;;9300:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47781:1:::1;47773:5;:9;;;:23;;;;;47795:1;47786:5;:10;;;;47773:23;47765:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;47839:9;47824:5;:12;47830:5;47824:12;;;;;;;;;;;;;;;:24;;;;47681:175:::0;;:::o;40865:320::-;40985:7;41040:30;:28;:30::i;:::-;41032:5;:38;41010:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;41160:10;41171:5;41160:17;;;;;;;;:::i;:::-;;;;;;;;;;41153:24;;40865:320;;;:::o;47572:101::-;9319:12;:10;:12::i;:::-;9308:23;;:7;:5;:7::i;:::-;:23;;;9300:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47658:7:::1;47643:12;:22;;;;;;;;;;;;:::i;:::-;;47572:101:::0;:::o;50335:1136::-;50415:14;50432:10;50415:27;;46562:5;50491:6;50475:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:33;;50453:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;50629:7;:5;:7::i;:::-;50619:17;;:6;:17;;;50615:762;;50661:8;;;;;;;;;;;50653:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;50718:10;:18;50729:6;50718:18;;;;;;;;;;;;;;;;;;;;;;;;;50717:19;50709:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;50829:1;50820:6;:10;:26;;;;;50844:2;50834:6;:12;;50820:26;50794:145;;;;;;;;;;;;:::i;:::-;;;;;;;;;51002:6;50982:17;50992:6;50982:9;:17::i;:::-;:26;;;;:::i;:::-;50976:2;:32;;50954:142;;;;;;;;;;;;:::i;:::-;;;;;;;;;51166:6;51150:13;:11;:13::i;:::-;:22;;;;:::i;:::-;51137:9;:35;;51111:144;;;;;;;;;;;;:::i;:::-;;;;;;;;;51306:2;51296:6;51276:17;51286:6;51276:9;:17::i;:::-;:26;;;;:::i;:::-;:32;51272:94;;;51346:4;51325:10;:18;51336:6;51325:18;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;51272:94;50615:762;51392:9;51387:77;51411:6;51407:1;:10;51387:77;;;51439:13;51445:6;51439:5;:13::i;:::-;51419:3;;;;;:::i;:::-;;;;51387:77;;;;50404:1067;50335:1136;:::o;26639:326::-;26756:7;26781:13;26797:7;:16;26805:7;26797:16;;;;;;;;;;;;;;;;;;;;;26781:32;;26863:1;26846:19;;:5;:19;;;;26824:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;26952:5;26945:12;;;26639:326;;;:::o;26282:295::-;26399:7;26463:1;26446:19;;:5;:19;;;;26424:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26553:9;:16;26563:5;26553:16;;;;;;;;;;;;;;;;26546:23;;26282:295;;;:::o;9739:94::-;9319:12;:10;:12::i;:::-;9308:23;;:7;:5;:7::i;:::-;:23;;;9300:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9804:21:::1;9822:1;9804:9;:21::i;:::-;9739:94::o:0;48002:1509::-;9319:12;:10;:12::i;:::-;9308:23;;:7;:5;:7::i;:::-;:23;;;9300:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48055:15:::1;48073:21;48055:39;;48123:1;48113:7;:11;48105:32;;;;;;;;;;;;:::i;:::-;;;;;;;;;48148:115;48173:42;48248:4;48241:3;48231:7;:13;;;;:::i;:::-;48230:22;;;;:::i;:::-;48148:10;:115::i;:::-;48274:112;48299:42;48372:3;48367:1;48357:7;:11;;;;:::i;:::-;48356:19;;;;:::i;:::-;48274:10;:112::i;:::-;48397:113;48422:42;48496:3;48490:2;48480:7;:12;;;;:::i;:::-;48479:20;;;;:::i;:::-;48397:10;:113::i;:::-;48521;48546:42;48620:3;48614:2;48604:7;:12;;;;:::i;:::-;48603:20;;;;:::i;:::-;48521:10;:113::i;:::-;48645:114;48670:42;48744:4;48738:2;48728:7;:12;;;;:::i;:::-;48727:21;;;;:::i;:::-;48645:10;:114::i;:::-;48770:115;48795:42;48870:4;48863:3;48853:7;:13;;;;:::i;:::-;48852:22;;;;:::i;:::-;48770:10;:115::i;:::-;48896:112;48921:42;48994:3;48989:1;48979:7;:11;;;;:::i;:::-;48978:19;;;;:::i;:::-;48896:10;:112::i;:::-;49019;49044:42;49117:3;49112:1;49102:7;:11;;;;:::i;:::-;49101:19;;;;:::i;:::-;49019:10;:112::i;:::-;49142;49167:42;49240:3;49235:1;49225:7;:11;;;;:::i;:::-;49224:19;;;;:::i;:::-;49142:10;:112::i;:::-;49265:114;49290:42;49364:4;49358:2;49348:7;:12;;;;:::i;:::-;49347:21;;;;:::i;:::-;49265:10;:114::i;:::-;49390:113;49415:42;49489:3;49483:2;49473:7;:12;;;;:::i;:::-;49472:20;;;;:::i;:::-;49390:10;:113::i;:::-;48044:1467;48002:1509::o:0;9088:87::-;9134:7;9161:6;;;;;;;;;;;9154:13;;9088:87;:::o;27201:104::-;27257:13;27290:7;27283:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27201:104;:::o;46600:28::-;;;;;;;;;;;;;:::o;29105:327::-;29252:12;:10;:12::i;:::-;29240:24;;:8;:24;;;;29232:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;29352:8;29307:18;:32;29326:12;:10;:12::i;:::-;29307:32;;;;;;;;;;;;;;;:42;29340:8;29307:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;29405:8;29376:48;;29391:12;:10;:12::i;:::-;29376:48;;;29415:8;29376:48;;;;;;:::i;:::-;;;;;;;;29105:327;;:::o;46635:38::-;;;;;;;;;;;;;;;;;:::o;30487:365::-;30676:41;30695:12;:10;:12::i;:::-;30709:7;30676:18;:41::i;:::-;30654:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;30805:39;30819:4;30825:2;30829:7;30838:5;30805:13;:39::i;:::-;30487:365;;;;:::o;46680:40::-;;;;;;;;;;;;;;;;;;;;;;:::o;27376:468::-;27494:13;27547:16;27555:7;27547;:16::i;:::-;27525:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;27651:21;27675:10;:8;:10::i;:::-;27651:34;;27740:1;27722:7;27716:21;:25;:120;;;;;;;;;;;;;;;;;27785:7;27794:18;:7;:16;:18::i;:::-;27768:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;27716:120;27696:140;;;27376:468;;;:::o;46528:39::-;46562:5;46528:39;:::o;29503:214::-;29645:4;29674:18;:25;29693:5;29674:25;;;;;;;;;;;;;;;:35;29700:8;29674:35;;;;;;;;;;;;;;;;;;;;;;;;;29667:42;;29503:214;;;;:::o;9988:229::-;9319:12;:10;:12::i;:::-;9308:23;;:7;:5;:7::i;:::-;:23;;;9300:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10111:1:::1;10091:22;;:8;:22;;;;10069:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;10190:19;10200:8;10190:9;:19::i;:::-;9988:229:::0;:::o;49708:584::-;49752:7;49772:21;49796:13;:11;:13::i;:::-;49772:37;;49842:4;49826:13;:20;49822:463;;;49870:5;:8;49876:1;49870:8;;;;;;;;;;;;;;49863:15;;;;;49822:463;49941:4;49925:13;:20;49921:364;;;49969:5;:8;49975:1;49969:8;;;;;;;;;;;;;;49962:15;;;;;49921:364;50041:4;50025:13;:20;50021:264;;;50069:5;:8;50075:1;50069:8;;;;;;;;;;;;;;50062:15;;;;;50021:264;50141:4;50125:13;:20;50121:164;;;50169:5;:8;50175:1;50169:8;;;;;;;;;;;;;;50162:15;;;;;50121:164;50243:5;:8;50249:1;50243:8;;;;;;;;;;;;;;50236:15;;;49708:584;;:::o;25863:355::-;26010:4;26067:25;26052:40;;;:11;:40;;;;:105;;;;26124:33;26109:48;;;:11;:48;;;;26052:105;:158;;;;26174:36;26198:11;26174:23;:36::i;:::-;26052:158;26032:178;;25863:355;;;:::o;32399:127::-;32464:4;32516:1;32488:30;;:7;:16;32496:7;32488:16;;;;;;;;;;;;;;;;;;;;;:30;;;;32481:37;;32399:127;;;:::o;2061:98::-;2114:7;2141:10;2134:17;;2061:98;:::o;36522:174::-;36624:2;36597:15;:24;36613:7;36597:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;36680:7;36676:2;36642:46;;36651:23;36666:7;36651:14;:23::i;:::-;36642:46;;;;;;;;;;;;36522:174;;:::o;32693:452::-;32822:4;32866:16;32874:7;32866;:16::i;:::-;32844:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;32965:13;32981:23;32996:7;32981:14;:23::i;:::-;32965:39;;33034:5;33023:16;;:7;:16;;;:64;;;;33080:7;33056:31;;:20;33068:7;33056:11;:20::i;:::-;:31;;;33023:64;:113;;;;33104:32;33121:5;33128:7;33104:16;:32::i;:::-;33023:113;33015:122;;;32693:452;;;;:::o;35789:615::-;35962:4;35935:31;;:23;35950:7;35935:14;:23::i;:::-;:31;;;35913:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;36068:1;36054:16;;:2;:16;;;;36046:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;36124:39;36145:4;36151:2;36155:7;36124:20;:39::i;:::-;36228:29;36245:1;36249:7;36228:8;:29::i;:::-;36289:1;36270:9;:15;36280:4;36270:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;36318:1;36301:9;:13;36311:2;36301:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;36349:2;36330:7;:16;36338:7;36330:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;36388:7;36384:2;36369:27;;36378:4;36369:27;;;;;;;;;;;;35789:615;;;:::o;51479:209::-;51526:20;:8;:18;:20::i;:::-;51557:15;51575:18;:8;:16;:18::i;:::-;51557:36;;51604:23;51614:3;51619:7;51604:9;:23::i;:::-;51643:37;51672:7;51643:37;;;;;;:::i;:::-;;;;;;;;51515:173;51479:209;:::o;10225:173::-;10281:16;10300:6;;;;;;;;;;;10281:25;;10326:8;10317:6;;:17;;;;;;;;;;;;;;;;;;10381:8;10350:40;;10371:8;10350:40;;;;;;;;;;;;10270:128;10225:173;:::o;49519:181::-;49594:12;49612:8;:13;;49633:7;49612:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49593:52;;;49664:7;49656:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;49582:118;49519:181;;:::o;31734:352::-;31891:28;31901:4;31907:2;31911:7;31891:9;:28::i;:::-;31952:48;31975:4;31981:2;31985:7;31994:5;31952:22;:48::i;:::-;31930:148;;;;;;;;;;;;:::i;:::-;;;;;;;;;31734:352;;;;:::o;51696:113::-;51756:13;51789:12;51782:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51696:113;:::o;12730:723::-;12786:13;13016:1;13007:5;:10;13003:53;;;13034:10;;;;;;;;;;;;;;;;;;;;;13003:53;13066:12;13081:5;13066:20;;13097:14;13122:78;13137:1;13129:4;:9;13122:78;;13155:8;;;;;:::i;:::-;;;;13186:2;13178:10;;;;;:::i;:::-;;;13122:78;;;13210:19;13242:6;13232:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13210:39;;13260:154;13276:1;13267:5;:10;13260:154;;13304:1;13294:11;;;;;:::i;:::-;;;13371:2;13363:5;:10;;;;:::i;:::-;13350:2;:24;;;;:::i;:::-;13337:39;;13320:6;13327;13320:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;13400:2;13391:11;;;;;:::i;:::-;;;13260:154;;;13438:6;13424:21;;;;;12730:723;;;;:::o;12209:207::-;12339:4;12383:25;12368:40;;;:11;:40;;;;12361:47;;12209:207;;;:::o;41798:589::-;41942:45;41969:4;41975:2;41979:7;41942:26;:45::i;:::-;42020:1;42004:18;;:4;:18;;;42000:187;;;42039:40;42071:7;42039:31;:40::i;:::-;42000:187;;;42109:2;42101:10;;:4;:10;;;42097:90;;42128:47;42161:4;42167:7;42128:32;:47::i;:::-;42097:90;42000:187;42215:1;42201:16;;:2;:16;;;42197:183;;;42234:45;42271:7;42234:36;:45::i;:::-;42197:183;;;42307:4;42301:10;;:2;:10;;;42297:83;;42328:40;42356:2;42360:7;42328:27;:40::i;:::-;42297:83;42197:183;41798:589;;;:::o;970:127::-;1077:1;1059:7;:14;;;:19;;;;;;;;;;;970:127;:::o;848:114::-;913:7;940;:14;;;933:21;;848:114;;;:::o;33487:110::-;33563:26;33573:2;33577:7;33563:26;;;;;;;;;;;;:9;:26::i;:::-;33487:110;;:::o;37261:984::-;37416:4;37437:15;:2;:13;;;:15::i;:::-;37433:805;;;37506:2;37490:36;;;37549:12;:10;:12::i;:::-;37584:4;37611:7;37641:5;37490:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37469:714;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37869:1;37852:6;:13;:18;37848:320;;;37895:108;;;;;;;;;;:::i;:::-;;;;;;;;37848:320;38118:6;38112:13;38103:6;38099:2;38095:15;38088:38;37469:714;37739:45;;;37729:55;;;:6;:55;;;;37722:62;;;;;37433:805;38222:4;38215:11;;37261:984;;;;;;;:::o;38817:126::-;;;;:::o;43110:164::-;43214:10;:17;;;;43187:15;:24;43203:7;43187:24;;;;;;;;;;;:44;;;;43242:10;43258:7;43242:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43110:164;:::o;43901:1002::-;44181:22;44231:1;44206:22;44223:4;44206:16;:22::i;:::-;:26;;;;:::i;:::-;44181:51;;44243:18;44264:17;:26;44282:7;44264:26;;;;;;;;;;;;44243:47;;44411:14;44397:10;:28;44393:328;;44442:19;44464:12;:18;44477:4;44464:18;;;;;;;;;;;;;;;:34;44483:14;44464:34;;;;;;;;;;;;44442:56;;44548:11;44515:12;:18;44528:4;44515:18;;;;;;;;;;;;;;;:30;44534:10;44515:30;;;;;;;;;;;:44;;;;44665:10;44632:17;:30;44650:11;44632:30;;;;;;;;;;;:43;;;;44427:294;44393:328;44817:17;:26;44835:7;44817:26;;;;;;;;;;;44810:33;;;44861:12;:18;44874:4;44861:18;;;;;;;;;;;;;;;:34;44880:14;44861:34;;;;;;;;;;;44854:41;;;43996:907;;43901:1002;;:::o;45198:1079::-;45451:22;45496:1;45476:10;:17;;;;:21;;;;:::i;:::-;45451:46;;45508:18;45529:15;:24;45545:7;45529:24;;;;;;;;;;;;45508:45;;45880:19;45902:10;45913:14;45902:26;;;;;;;;:::i;:::-;;;;;;;;;;45880:48;;45966:11;45941:10;45952;45941:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;46077:10;46046:15;:28;46062:11;46046:28;;;;;;;;;;;:41;;;;46218:15;:24;46234:7;46218:24;;;;;;;;;;;46211:31;;;46253:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;45269:1008;;;45198:1079;:::o;42688:221::-;42773:14;42790:20;42807:2;42790:16;:20::i;:::-;42773:37;;42848:7;42821:12;:16;42834:2;42821:16;;;;;;;;;;;;;;;:24;42838:6;42821:24;;;;;;;;;;;:34;;;;42895:6;42866:17;:26;42884:7;42866:26;;;;;;;;;;;:35;;;;42762:147;42688:221;;:::o;33824:321::-;33954:18;33960:2;33964:7;33954:5;:18::i;:::-;34005:54;34036:1;34040:2;34044:7;34053:5;34005:22;:54::i;:::-;33983:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;33824:321;;;:::o;15283:387::-;15343:4;15551:12;15618:7;15606:20;15598:28;;15661:1;15654:4;:8;15647:15;;;15283:387;;;:::o;34481:382::-;34575:1;34561:16;;:2;:16;;;;34553:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;34634:16;34642:7;34634;:16::i;:::-;34633:17;34625:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;34696:45;34725:1;34729:2;34733:7;34696:20;:45::i;:::-;34771:1;34754:9;:13;34764:2;34754:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34802:2;34783:7;:16;34791:7;34783:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34847:7;34843:2;34822:33;;34839:1;34822:33;;;;;;;;;;;;34481:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:135::-;2321:5;2359:6;2346:20;2337:29;;2375:31;2400:5;2375:31;:::i;:::-;2277:135;;;;:::o;2418:329::-;2477:6;2526:2;2514:9;2505:7;2501:23;2497:32;2494:119;;;2532:79;;:::i;:::-;2494:119;2652:1;2677:53;2722:7;2713:6;2702:9;2698:22;2677:53;:::i;:::-;2667:63;;2623:117;2418:329;;;;:::o;2753:474::-;2821:6;2829;2878:2;2866:9;2857:7;2853:23;2849:32;2846:119;;;2884:79;;:::i;:::-;2846:119;3004:1;3029:53;3074:7;3065:6;3054:9;3050:22;3029:53;:::i;:::-;3019:63;;2975:117;3131:2;3157:53;3202:7;3193:6;3182:9;3178:22;3157:53;:::i;:::-;3147:63;;3102:118;2753:474;;;;;:::o;3233:619::-;3310:6;3318;3326;3375:2;3363:9;3354:7;3350:23;3346:32;3343:119;;;3381:79;;:::i;:::-;3343:119;3501:1;3526:53;3571:7;3562:6;3551:9;3547:22;3526:53;:::i;:::-;3516:63;;3472:117;3628:2;3654:53;3699:7;3690:6;3679:9;3675:22;3654:53;:::i;:::-;3644:63;;3599:118;3756:2;3782:53;3827:7;3818:6;3807:9;3803:22;3782:53;:::i;:::-;3772:63;;3727:118;3233:619;;;;;:::o;3858:943::-;3953:6;3961;3969;3977;4026:3;4014:9;4005:7;4001:23;3997:33;3994:120;;;4033:79;;:::i;:::-;3994:120;4153:1;4178:53;4223:7;4214:6;4203:9;4199:22;4178:53;:::i;:::-;4168:63;;4124:117;4280:2;4306:53;4351:7;4342:6;4331:9;4327:22;4306:53;:::i;:::-;4296:63;;4251:118;4408:2;4434:53;4479:7;4470:6;4459:9;4455:22;4434:53;:::i;:::-;4424:63;;4379:118;4564:2;4553:9;4549:18;4536:32;4595:18;4587:6;4584:30;4581:117;;;4617:79;;:::i;:::-;4581:117;4722:62;4776:7;4767:6;4756:9;4752:22;4722:62;:::i;:::-;4712:72;;4507:287;3858:943;;;;;;;:::o;4807:468::-;4872:6;4880;4929:2;4917:9;4908:7;4904:23;4900:32;4897:119;;;4935:79;;:::i;:::-;4897:119;5055:1;5080:53;5125:7;5116:6;5105:9;5101:22;5080:53;:::i;:::-;5070:63;;5026:117;5182:2;5208:50;5250:7;5241:6;5230:9;5226:22;5208:50;:::i;:::-;5198:60;;5153:115;4807:468;;;;;:::o;5281:474::-;5349:6;5357;5406:2;5394:9;5385:7;5381:23;5377:32;5374:119;;;5412:79;;:::i;:::-;5374:119;5532:1;5557:53;5602:7;5593:6;5582:9;5578:22;5557:53;:::i;:::-;5547:63;;5503:117;5659:2;5685:53;5730:7;5721:6;5710:9;5706:22;5685:53;:::i;:::-;5675:63;;5630:118;5281:474;;;;;:::o;5761:327::-;5819:6;5868:2;5856:9;5847:7;5843:23;5839:32;5836:119;;;5874:79;;:::i;:::-;5836:119;5994:1;6019:52;6063:7;6054:6;6043:9;6039:22;6019:52;:::i;:::-;6009:62;;5965:116;5761:327;;;;:::o;6094:349::-;6163:6;6212:2;6200:9;6191:7;6187:23;6183:32;6180:119;;;6218:79;;:::i;:::-;6180:119;6338:1;6363:63;6418:7;6409:6;6398:9;6394:22;6363:63;:::i;:::-;6353:73;;6309:127;6094:349;;;;:::o;6449:509::-;6518:6;6567:2;6555:9;6546:7;6542:23;6538:32;6535:119;;;6573:79;;:::i;:::-;6535:119;6721:1;6710:9;6706:17;6693:31;6751:18;6743:6;6740:30;6737:117;;;6773:79;;:::i;:::-;6737:117;6878:63;6933:7;6924:6;6913:9;6909:22;6878:63;:::i;:::-;6868:73;;6664:287;6449:509;;;;:::o;6964:329::-;7023:6;7072:2;7060:9;7051:7;7047:23;7043:32;7040:119;;;7078:79;;:::i;:::-;7040:119;7198:1;7223:53;7268:7;7259:6;7248:9;7244:22;7223:53;:::i;:::-;7213:63;;7169:117;6964:329;;;;:::o;7299:325::-;7356:6;7405:2;7393:9;7384:7;7380:23;7376:32;7373:119;;;7411:79;;:::i;:::-;7373:119;7531:1;7556:51;7599:7;7590:6;7579:9;7575:22;7556:51;:::i;:::-;7546:61;;7502:115;7299:325;;;;:::o;7630:470::-;7696:6;7704;7753:2;7741:9;7732:7;7728:23;7724:32;7721:119;;;7759:79;;:::i;:::-;7721:119;7879:1;7904:51;7947:7;7938:6;7927:9;7923:22;7904:51;:::i;:::-;7894:61;;7850:115;8004:2;8030:53;8075:7;8066:6;8055:9;8051:22;8030:53;:::i;:::-;8020:63;;7975:118;7630:470;;;;;:::o;8106:179::-;8175:10;8196:46;8238:3;8230:6;8196:46;:::i;:::-;8274:4;8269:3;8265:14;8251:28;;8106:179;;;;:::o;8291:118::-;8378:24;8396:5;8378:24;:::i;:::-;8373:3;8366:37;8291:118;;:::o;8445:732::-;8564:3;8593:54;8641:5;8593:54;:::i;:::-;8663:86;8742:6;8737:3;8663:86;:::i;:::-;8656:93;;8773:56;8823:5;8773:56;:::i;:::-;8852:7;8883:1;8868:284;8893:6;8890:1;8887:13;8868:284;;;8969:6;8963:13;8996:63;9055:3;9040:13;8996:63;:::i;:::-;8989:70;;9082:60;9135:6;9082:60;:::i;:::-;9072:70;;8928:224;8915:1;8912;8908:9;8903:14;;8868:284;;;8872:14;9168:3;9161:10;;8569:608;;;8445:732;;;;:::o;9183:109::-;9264:21;9279:5;9264:21;:::i;:::-;9259:3;9252:34;9183:109;;:::o;9298:360::-;9384:3;9412:38;9444:5;9412:38;:::i;:::-;9466:70;9529:6;9524:3;9466:70;:::i;:::-;9459:77;;9545:52;9590:6;9585:3;9578:4;9571:5;9567:16;9545:52;:::i;:::-;9622:29;9644:6;9622:29;:::i;:::-;9617:3;9613:39;9606:46;;9388:270;9298:360;;;;:::o;9664:364::-;9752:3;9780:39;9813:5;9780:39;:::i;:::-;9835:71;9899:6;9894:3;9835:71;:::i;:::-;9828:78;;9915:52;9960:6;9955:3;9948:4;9941:5;9937:16;9915:52;:::i;:::-;9992:29;10014:6;9992:29;:::i;:::-;9987:3;9983:39;9976:46;;9756:272;9664:364;;;;:::o;10034:377::-;10140:3;10168:39;10201:5;10168:39;:::i;:::-;10223:89;10305:6;10300:3;10223:89;:::i;:::-;10216:96;;10321:52;10366:6;10361:3;10354:4;10347:5;10343:16;10321:52;:::i;:::-;10398:6;10393:3;10389:16;10382:23;;10144:267;10034:377;;;;:::o;10417:366::-;10559:3;10580:67;10644:2;10639:3;10580:67;:::i;:::-;10573:74;;10656:93;10745:3;10656:93;:::i;:::-;10774:2;10769:3;10765:12;10758:19;;10417:366;;;:::o;10789:::-;10931:3;10952:67;11016:2;11011:3;10952:67;:::i;:::-;10945:74;;11028:93;11117:3;11028:93;:::i;:::-;11146:2;11141:3;11137:12;11130:19;;10789:366;;;:::o;11161:::-;11303:3;11324:67;11388:2;11383:3;11324:67;:::i;:::-;11317:74;;11400:93;11489:3;11400:93;:::i;:::-;11518:2;11513:3;11509:12;11502:19;;11161:366;;;:::o;11533:::-;11675:3;11696:67;11760:2;11755:3;11696:67;:::i;:::-;11689:74;;11772:93;11861:3;11772:93;:::i;:::-;11890:2;11885:3;11881:12;11874:19;;11533:366;;;:::o;11905:::-;12047:3;12068:67;12132:2;12127:3;12068:67;:::i;:::-;12061:74;;12144:93;12233:3;12144:93;:::i;:::-;12262:2;12257:3;12253:12;12246:19;;11905:366;;;:::o;12277:::-;12419:3;12440:67;12504:2;12499:3;12440:67;:::i;:::-;12433:74;;12516:93;12605:3;12516:93;:::i;:::-;12634:2;12629:3;12625:12;12618:19;;12277:366;;;:::o;12649:::-;12791:3;12812:67;12876:2;12871:3;12812:67;:::i;:::-;12805:74;;12888:93;12977:3;12888:93;:::i;:::-;13006:2;13001:3;12997:12;12990:19;;12649:366;;;:::o;13021:::-;13163:3;13184:67;13248:2;13243:3;13184:67;:::i;:::-;13177:74;;13260:93;13349:3;13260:93;:::i;:::-;13378:2;13373:3;13369:12;13362:19;;13021:366;;;:::o;13393:::-;13535:3;13556:67;13620:2;13615:3;13556:67;:::i;:::-;13549:74;;13632:93;13721:3;13632:93;:::i;:::-;13750:2;13745:3;13741:12;13734:19;;13393:366;;;:::o;13765:::-;13907:3;13928:67;13992:2;13987:3;13928:67;:::i;:::-;13921:74;;14004:93;14093:3;14004:93;:::i;:::-;14122:2;14117:3;14113:12;14106:19;;13765:366;;;:::o;14137:::-;14279:3;14300:67;14364:2;14359:3;14300:67;:::i;:::-;14293:74;;14376:93;14465:3;14376:93;:::i;:::-;14494:2;14489:3;14485:12;14478:19;;14137:366;;;:::o;14509:::-;14651:3;14672:67;14736:2;14731:3;14672:67;:::i;:::-;14665:74;;14748:93;14837:3;14748:93;:::i;:::-;14866:2;14861:3;14857:12;14850:19;;14509:366;;;:::o;14881:::-;15023:3;15044:67;15108:2;15103:3;15044:67;:::i;:::-;15037:74;;15120:93;15209:3;15120:93;:::i;:::-;15238:2;15233:3;15229:12;15222:19;;14881:366;;;:::o;15253:::-;15395:3;15416:67;15480:2;15475:3;15416:67;:::i;:::-;15409:74;;15492:93;15581:3;15492:93;:::i;:::-;15610:2;15605:3;15601:12;15594:19;;15253:366;;;:::o;15625:::-;15767:3;15788:67;15852:2;15847:3;15788:67;:::i;:::-;15781:74;;15864:93;15953:3;15864:93;:::i;:::-;15982:2;15977:3;15973:12;15966:19;;15625:366;;;:::o;15997:::-;16139:3;16160:67;16224:2;16219:3;16160:67;:::i;:::-;16153:74;;16236:93;16325:3;16236:93;:::i;:::-;16354:2;16349:3;16345:12;16338:19;;15997:366;;;:::o;16369:::-;16511:3;16532:67;16596:2;16591:3;16532:67;:::i;:::-;16525:74;;16608:93;16697:3;16608:93;:::i;:::-;16726:2;16721:3;16717:12;16710:19;;16369:366;;;:::o;16741:::-;16883:3;16904:67;16968:2;16963:3;16904:67;:::i;:::-;16897:74;;16980:93;17069:3;16980:93;:::i;:::-;17098:2;17093:3;17089:12;17082:19;;16741:366;;;:::o;17113:::-;17255:3;17276:67;17340:2;17335:3;17276:67;:::i;:::-;17269:74;;17352:93;17441:3;17352:93;:::i;:::-;17470:2;17465:3;17461:12;17454:19;;17113:366;;;:::o;17485:::-;17627:3;17648:67;17712:2;17707:3;17648:67;:::i;:::-;17641:74;;17724:93;17813:3;17724:93;:::i;:::-;17842:2;17837:3;17833:12;17826:19;;17485:366;;;:::o;17857:398::-;18016:3;18037:83;18118:1;18113:3;18037:83;:::i;:::-;18030:90;;18129:93;18218:3;18129:93;:::i;:::-;18247:1;18242:3;18238:11;18231:18;;17857:398;;;:::o;18261:366::-;18403:3;18424:67;18488:2;18483:3;18424:67;:::i;:::-;18417:74;;18500:93;18589:3;18500:93;:::i;:::-;18618:2;18613:3;18609:12;18602:19;;18261:366;;;:::o;18633:::-;18775:3;18796:67;18860:2;18855:3;18796:67;:::i;:::-;18789:74;;18872:93;18961:3;18872:93;:::i;:::-;18990:2;18985:3;18981:12;18974:19;;18633:366;;;:::o;19005:::-;19147:3;19168:67;19232:2;19227:3;19168:67;:::i;:::-;19161:74;;19244:93;19333:3;19244:93;:::i;:::-;19362:2;19357:3;19353:12;19346:19;;19005:366;;;:::o;19377:365::-;19519:3;19540:66;19604:1;19599:3;19540:66;:::i;:::-;19533:73;;19615:93;19704:3;19615:93;:::i;:::-;19733:2;19728:3;19724:12;19717:19;;19377:365;;;:::o;19748:366::-;19890:3;19911:67;19975:2;19970:3;19911:67;:::i;:::-;19904:74;;19987:93;20076:3;19987:93;:::i;:::-;20105:2;20100:3;20096:12;20089:19;;19748:366;;;:::o;20120:::-;20262:3;20283:67;20347:2;20342:3;20283:67;:::i;:::-;20276:74;;20359:93;20448:3;20359:93;:::i;:::-;20477:2;20472:3;20468:12;20461:19;;20120:366;;;:::o;20492:::-;20634:3;20655:67;20719:2;20714:3;20655:67;:::i;:::-;20648:74;;20731:93;20820:3;20731:93;:::i;:::-;20849:2;20844:3;20840:12;20833:19;;20492:366;;;:::o;20864:108::-;20941:24;20959:5;20941:24;:::i;:::-;20936:3;20929:37;20864:108;;:::o;20978:118::-;21065:24;21083:5;21065:24;:::i;:::-;21060:3;21053:37;20978:118;;:::o;21102:435::-;21282:3;21304:95;21395:3;21386:6;21304:95;:::i;:::-;21297:102;;21416:95;21507:3;21498:6;21416:95;:::i;:::-;21409:102;;21528:3;21521:10;;21102:435;;;;;:::o;21543:379::-;21727:3;21749:147;21892:3;21749:147;:::i;:::-;21742:154;;21913:3;21906:10;;21543:379;;;:::o;21928:222::-;22021:4;22059:2;22048:9;22044:18;22036:26;;22072:71;22140:1;22129:9;22125:17;22116:6;22072:71;:::i;:::-;21928:222;;;;:::o;22156:640::-;22351:4;22389:3;22378:9;22374:19;22366:27;;22403:71;22471:1;22460:9;22456:17;22447:6;22403:71;:::i;:::-;22484:72;22552:2;22541:9;22537:18;22528:6;22484:72;:::i;:::-;22566;22634:2;22623:9;22619:18;22610:6;22566:72;:::i;:::-;22685:9;22679:4;22675:20;22670:2;22659:9;22655:18;22648:48;22713:76;22784:4;22775:6;22713:76;:::i;:::-;22705:84;;22156:640;;;;;;;:::o;22802:373::-;22945:4;22983:2;22972:9;22968:18;22960:26;;23032:9;23026:4;23022:20;23018:1;23007:9;23003:17;22996:47;23060:108;23163:4;23154:6;23060:108;:::i;:::-;23052:116;;22802:373;;;;:::o;23181:210::-;23268:4;23306:2;23295:9;23291:18;23283:26;;23319:65;23381:1;23370:9;23366:17;23357:6;23319:65;:::i;:::-;23181:210;;;;:::o;23397:313::-;23510:4;23548:2;23537:9;23533:18;23525:26;;23597:9;23591:4;23587:20;23583:1;23572:9;23568:17;23561:47;23625:78;23698:4;23689:6;23625:78;:::i;:::-;23617:86;;23397:313;;;;:::o;23716:419::-;23882:4;23920:2;23909:9;23905:18;23897:26;;23969:9;23963:4;23959:20;23955:1;23944:9;23940:17;23933:47;23997:131;24123:4;23997:131;:::i;:::-;23989:139;;23716:419;;;:::o;24141:::-;24307:4;24345:2;24334:9;24330:18;24322:26;;24394:9;24388:4;24384:20;24380:1;24369:9;24365:17;24358:47;24422:131;24548:4;24422:131;:::i;:::-;24414:139;;24141:419;;;:::o;24566:::-;24732:4;24770:2;24759:9;24755:18;24747:26;;24819:9;24813:4;24809:20;24805:1;24794:9;24790:17;24783:47;24847:131;24973:4;24847:131;:::i;:::-;24839:139;;24566:419;;;:::o;24991:::-;25157:4;25195:2;25184:9;25180:18;25172:26;;25244:9;25238:4;25234:20;25230:1;25219:9;25215:17;25208:47;25272:131;25398:4;25272:131;:::i;:::-;25264:139;;24991:419;;;:::o;25416:::-;25582:4;25620:2;25609:9;25605:18;25597:26;;25669:9;25663:4;25659:20;25655:1;25644:9;25640:17;25633:47;25697:131;25823:4;25697:131;:::i;:::-;25689:139;;25416:419;;;:::o;25841:::-;26007:4;26045:2;26034:9;26030:18;26022:26;;26094:9;26088:4;26084:20;26080:1;26069:9;26065:17;26058:47;26122:131;26248:4;26122:131;:::i;:::-;26114:139;;25841:419;;;:::o;26266:::-;26432:4;26470:2;26459:9;26455:18;26447:26;;26519:9;26513:4;26509:20;26505:1;26494:9;26490:17;26483:47;26547:131;26673:4;26547:131;:::i;:::-;26539:139;;26266:419;;;:::o;26691:::-;26857:4;26895:2;26884:9;26880:18;26872:26;;26944:9;26938:4;26934:20;26930:1;26919:9;26915:17;26908:47;26972:131;27098:4;26972:131;:::i;:::-;26964:139;;26691:419;;;:::o;27116:::-;27282:4;27320:2;27309:9;27305:18;27297:26;;27369:9;27363:4;27359:20;27355:1;27344:9;27340:17;27333:47;27397:131;27523:4;27397:131;:::i;:::-;27389:139;;27116:419;;;:::o;27541:::-;27707:4;27745:2;27734:9;27730:18;27722:26;;27794:9;27788:4;27784:20;27780:1;27769:9;27765:17;27758:47;27822:131;27948:4;27822:131;:::i;:::-;27814:139;;27541:419;;;:::o;27966:::-;28132:4;28170:2;28159:9;28155:18;28147:26;;28219:9;28213:4;28209:20;28205:1;28194:9;28190:17;28183:47;28247:131;28373:4;28247:131;:::i;:::-;28239:139;;27966:419;;;:::o;28391:::-;28557:4;28595:2;28584:9;28580:18;28572:26;;28644:9;28638:4;28634:20;28630:1;28619:9;28615:17;28608:47;28672:131;28798:4;28672:131;:::i;:::-;28664:139;;28391:419;;;:::o;28816:::-;28982:4;29020:2;29009:9;29005:18;28997:26;;29069:9;29063:4;29059:20;29055:1;29044:9;29040:17;29033:47;29097:131;29223:4;29097:131;:::i;:::-;29089:139;;28816:419;;;:::o;29241:::-;29407:4;29445:2;29434:9;29430:18;29422:26;;29494:9;29488:4;29484:20;29480:1;29469:9;29465:17;29458:47;29522:131;29648:4;29522:131;:::i;:::-;29514:139;;29241:419;;;:::o;29666:::-;29832:4;29870:2;29859:9;29855:18;29847:26;;29919:9;29913:4;29909:20;29905:1;29894:9;29890:17;29883:47;29947:131;30073:4;29947:131;:::i;:::-;29939:139;;29666:419;;;:::o;30091:::-;30257:4;30295:2;30284:9;30280:18;30272:26;;30344:9;30338:4;30334:20;30330:1;30319:9;30315:17;30308:47;30372:131;30498:4;30372:131;:::i;:::-;30364:139;;30091:419;;;:::o;30516:::-;30682:4;30720:2;30709:9;30705:18;30697:26;;30769:9;30763:4;30759:20;30755:1;30744:9;30740:17;30733:47;30797:131;30923:4;30797:131;:::i;:::-;30789:139;;30516:419;;;:::o;30941:::-;31107:4;31145:2;31134:9;31130:18;31122:26;;31194:9;31188:4;31184:20;31180:1;31169:9;31165:17;31158:47;31222:131;31348:4;31222:131;:::i;:::-;31214:139;;30941:419;;;:::o;31366:::-;31532:4;31570:2;31559:9;31555:18;31547:26;;31619:9;31613:4;31609:20;31605:1;31594:9;31590:17;31583:47;31647:131;31773:4;31647:131;:::i;:::-;31639:139;;31366:419;;;:::o;31791:::-;31957:4;31995:2;31984:9;31980:18;31972:26;;32044:9;32038:4;32034:20;32030:1;32019:9;32015:17;32008:47;32072:131;32198:4;32072:131;:::i;:::-;32064:139;;31791:419;;;:::o;32216:::-;32382:4;32420:2;32409:9;32405:18;32397:26;;32469:9;32463:4;32459:20;32455:1;32444:9;32440:17;32433:47;32497:131;32623:4;32497:131;:::i;:::-;32489:139;;32216:419;;;:::o;32641:::-;32807:4;32845:2;32834:9;32830:18;32822:26;;32894:9;32888:4;32884:20;32880:1;32869:9;32865:17;32858:47;32922:131;33048:4;32922:131;:::i;:::-;32914:139;;32641:419;;;:::o;33066:::-;33232:4;33270:2;33259:9;33255:18;33247:26;;33319:9;33313:4;33309:20;33305:1;33294:9;33290:17;33283:47;33347:131;33473:4;33347:131;:::i;:::-;33339:139;;33066:419;;;:::o;33491:::-;33657:4;33695:2;33684:9;33680:18;33672:26;;33744:9;33738:4;33734:20;33730:1;33719:9;33715:17;33708:47;33772:131;33898:4;33772:131;:::i;:::-;33764:139;;33491:419;;;:::o;33916:::-;34082:4;34120:2;34109:9;34105:18;34097:26;;34169:9;34163:4;34159:20;34155:1;34144:9;34140:17;34133:47;34197:131;34323:4;34197:131;:::i;:::-;34189:139;;33916:419;;;:::o;34341:::-;34507:4;34545:2;34534:9;34530:18;34522:26;;34594:9;34588:4;34584:20;34580:1;34569:9;34565:17;34558:47;34622:131;34748:4;34622:131;:::i;:::-;34614:139;;34341:419;;;:::o;34766:::-;34932:4;34970:2;34959:9;34955:18;34947:26;;35019:9;35013:4;35009:20;35005:1;34994:9;34990:17;34983:47;35047:131;35173:4;35047:131;:::i;:::-;35039:139;;34766:419;;;:::o;35191:222::-;35284:4;35322:2;35311:9;35307:18;35299:26;;35335:71;35403:1;35392:9;35388:17;35379:6;35335:71;:::i;:::-;35191:222;;;;:::o;35419:129::-;35453:6;35480:20;;:::i;:::-;35470:30;;35509:33;35537:4;35529:6;35509:33;:::i;:::-;35419:129;;;:::o;35554:75::-;35587:6;35620:2;35614:9;35604:19;;35554:75;:::o;35635:307::-;35696:4;35786:18;35778:6;35775:30;35772:56;;;35808:18;;:::i;:::-;35772:56;35846:29;35868:6;35846:29;:::i;:::-;35838:37;;35930:4;35924;35920:15;35912:23;;35635:307;;;:::o;35948:308::-;36010:4;36100:18;36092:6;36089:30;36086:56;;;36122:18;;:::i;:::-;36086:56;36160:29;36182:6;36160:29;:::i;:::-;36152:37;;36244:4;36238;36234:15;36226:23;;35948:308;;;:::o;36262:132::-;36329:4;36352:3;36344:11;;36382:4;36377:3;36373:14;36365:22;;36262:132;;;:::o;36400:114::-;36467:6;36501:5;36495:12;36485:22;;36400:114;;;:::o;36520:98::-;36571:6;36605:5;36599:12;36589:22;;36520:98;;;:::o;36624:99::-;36676:6;36710:5;36704:12;36694:22;;36624:99;;;:::o;36729:113::-;36799:4;36831;36826:3;36822:14;36814:22;;36729:113;;;:::o;36848:184::-;36947:11;36981:6;36976:3;36969:19;37021:4;37016:3;37012:14;36997:29;;36848:184;;;;:::o;37038:168::-;37121:11;37155:6;37150:3;37143:19;37195:4;37190:3;37186:14;37171:29;;37038:168;;;;:::o;37212:147::-;37313:11;37350:3;37335:18;;37212:147;;;;:::o;37365:169::-;37449:11;37483:6;37478:3;37471:19;37523:4;37518:3;37514:14;37499:29;;37365:169;;;;:::o;37540:148::-;37642:11;37679:3;37664:18;;37540:148;;;;:::o;37694:305::-;37734:3;37753:20;37771:1;37753:20;:::i;:::-;37748:25;;37787:20;37805:1;37787:20;:::i;:::-;37782:25;;37941:1;37873:66;37869:74;37866:1;37863:81;37860:107;;;37947:18;;:::i;:::-;37860:107;37991:1;37988;37984:9;37977:16;;37694:305;;;;:::o;38005:185::-;38045:1;38062:20;38080:1;38062:20;:::i;:::-;38057:25;;38096:20;38114:1;38096:20;:::i;:::-;38091:25;;38135:1;38125:35;;38140:18;;:::i;:::-;38125:35;38182:1;38179;38175:9;38170:14;;38005:185;;;;:::o;38196:348::-;38236:7;38259:20;38277:1;38259:20;:::i;:::-;38254:25;;38293:20;38311:1;38293:20;:::i;:::-;38288:25;;38481:1;38413:66;38409:74;38406:1;38403:81;38398:1;38391:9;38384:17;38380:105;38377:131;;;38488:18;;:::i;:::-;38377:131;38536:1;38533;38529:9;38518:20;;38196:348;;;;:::o;38550:191::-;38590:4;38610:20;38628:1;38610:20;:::i;:::-;38605:25;;38644:20;38662:1;38644:20;:::i;:::-;38639:25;;38683:1;38680;38677:8;38674:34;;;38688:18;;:::i;:::-;38674:34;38733:1;38730;38726:9;38718:17;;38550:191;;;;:::o;38747:96::-;38784:7;38813:24;38831:5;38813:24;:::i;:::-;38802:35;;38747:96;;;:::o;38849:90::-;38883:7;38926:5;38919:13;38912:21;38901:32;;38849:90;;;:::o;38945:149::-;38981:7;39021:66;39014:5;39010:78;38999:89;;38945:149;;;:::o;39100:126::-;39137:7;39177:42;39170:5;39166:54;39155:65;;39100:126;;;:::o;39232:77::-;39269:7;39298:5;39287:16;;39232:77;;;:::o;39315:86::-;39350:7;39390:4;39383:5;39379:16;39368:27;;39315:86;;;:::o;39407:154::-;39491:6;39486:3;39481;39468:30;39553:1;39544:6;39539:3;39535:16;39528:27;39407:154;;;:::o;39567:307::-;39635:1;39645:113;39659:6;39656:1;39653:13;39645:113;;;39744:1;39739:3;39735:11;39729:18;39725:1;39720:3;39716:11;39709:39;39681:2;39678:1;39674:10;39669:15;;39645:113;;;39776:6;39773:1;39770:13;39767:101;;;39856:1;39847:6;39842:3;39838:16;39831:27;39767:101;39616:258;39567:307;;;:::o;39880:320::-;39924:6;39961:1;39955:4;39951:12;39941:22;;40008:1;40002:4;39998:12;40029:18;40019:81;;40085:4;40077:6;40073:17;40063:27;;40019:81;40147:2;40139:6;40136:14;40116:18;40113:38;40110:84;;;40166:18;;:::i;:::-;40110:84;39931:269;39880:320;;;:::o;40206:281::-;40289:27;40311:4;40289:27;:::i;:::-;40281:6;40277:40;40419:6;40407:10;40404:22;40383:18;40371:10;40368:34;40365:62;40362:88;;;40430:18;;:::i;:::-;40362:88;40470:10;40466:2;40459:22;40249:238;40206:281;;:::o;40493:233::-;40532:3;40555:24;40573:5;40555:24;:::i;:::-;40546:33;;40601:66;40594:5;40591:77;40588:103;;;40671:18;;:::i;:::-;40588:103;40718:1;40711:5;40707:13;40700:20;;40493:233;;;:::o;40732:176::-;40764:1;40781:20;40799:1;40781:20;:::i;:::-;40776:25;;40815:20;40833:1;40815:20;:::i;:::-;40810:25;;40854:1;40844:35;;40859:18;;:::i;:::-;40844:35;40900:1;40897;40893:9;40888:14;;40732:176;;;;:::o;40914:180::-;40962:77;40959:1;40952:88;41059:4;41056:1;41049:15;41083:4;41080:1;41073:15;41100:180;41148:77;41145:1;41138:88;41245:4;41242:1;41235:15;41269:4;41266:1;41259:15;41286:180;41334:77;41331:1;41324:88;41431:4;41428:1;41421:15;41455:4;41452:1;41445:15;41472:180;41520:77;41517:1;41510:88;41617:4;41614:1;41607:15;41641:4;41638:1;41631:15;41658:180;41706:77;41703:1;41696:88;41803:4;41800:1;41793:15;41827:4;41824:1;41817:15;41844:180;41892:77;41889:1;41882:88;41989:4;41986:1;41979:15;42013:4;42010:1;42003:15;42030:117;42139:1;42136;42129:12;42153:117;42262:1;42259;42252:12;42276:117;42385:1;42382;42375:12;42399:117;42508:1;42505;42498:12;42522:102;42563:6;42614:2;42610:7;42605:2;42598:5;42594:14;42590:28;42580:38;;42522:102;;;:::o;42630:226::-;42770:34;42766:1;42758:6;42754:14;42747:58;42839:9;42834:2;42826:6;42822:15;42815:34;42630:226;:::o;42862:230::-;43002:34;42998:1;42990:6;42986:14;42979:58;43071:13;43066:2;43058:6;43054:15;43047:38;42862:230;:::o;43098:237::-;43238:34;43234:1;43226:6;43222:14;43215:58;43307:20;43302:2;43294:6;43290:15;43283:45;43098:237;:::o;43341:225::-;43481:34;43477:1;43469:6;43465:14;43458:58;43550:8;43545:2;43537:6;43533:15;43526:33;43341:225;:::o;43572:178::-;43712:30;43708:1;43700:6;43696:14;43689:54;43572:178;:::o;43756:223::-;43896:34;43892:1;43884:6;43880:14;43873:58;43965:6;43960:2;43952:6;43948:15;43941:31;43756:223;:::o;43985:175::-;44125:27;44121:1;44113:6;44109:14;44102:51;43985:175;:::o;44166:170::-;44306:22;44302:1;44294:6;44290:14;44283:46;44166:170;:::o;44342:231::-;44482:34;44478:1;44470:6;44466:14;44459:58;44551:14;44546:2;44538:6;44534:15;44527:39;44342:231;:::o;44579:244::-;44719:34;44715:1;44707:6;44703:14;44696:58;44788:27;44783:2;44775:6;44771:15;44764:52;44579:244;:::o;44829:243::-;44969:34;44965:1;44957:6;44953:14;44946:58;45038:26;45033:2;45025:6;45021:15;45014:51;44829:243;:::o;45078:229::-;45218:34;45214:1;45206:6;45202:14;45195:58;45287:12;45282:2;45274:6;45270:15;45263:37;45078:229;:::o;45313:228::-;45453:34;45449:1;45441:6;45437:14;45430:58;45522:11;45517:2;45509:6;45505:15;45498:36;45313:228;:::o;45547:182::-;45687:34;45683:1;45675:6;45671:14;45664:58;45547:182;:::o;45735:231::-;45875:34;45871:1;45863:6;45859:14;45852:58;45944:14;45939:2;45931:6;45927:15;45920:39;45735:231;:::o;45972:234::-;46112:34;46108:1;46100:6;46096:14;46089:58;46181:17;46176:2;46168:6;46164:15;46157:42;45972:234;:::o;46212:182::-;46352:34;46348:1;46340:6;46336:14;46329:58;46212:182;:::o;46400:228::-;46540:34;46536:1;46528:6;46524:14;46517:58;46609:11;46604:2;46596:6;46592:15;46585:36;46400:228;:::o;46634:234::-;46774:34;46770:1;46762:6;46758:14;46751:58;46843:17;46838:2;46830:6;46826:15;46819:42;46634:234;:::o;46874:220::-;47014:34;47010:1;47002:6;46998:14;46991:58;47083:3;47078:2;47070:6;47066:15;47059:28;46874:220;:::o;47100:114::-;;:::o;47220:166::-;47360:18;47356:1;47348:6;47344:14;47337:42;47220:166;:::o;47392:236::-;47532:34;47528:1;47520:6;47516:14;47509:58;47601:19;47596:2;47588:6;47584:15;47577:44;47392:236;:::o;47634:231::-;47774:34;47770:1;47762:6;47758:14;47751:58;47843:14;47838:2;47830:6;47826:15;47819:39;47634:231;:::o;47871:158::-;48011:10;48007:1;47999:6;47995:14;47988:34;47871:158;:::o;48035:290::-;48175:34;48171:1;48163:6;48159:14;48152:58;48244:34;48239:2;48231:6;48227:15;48220:59;48313:4;48308:2;48300:6;48296:15;48289:29;48035:290;:::o;48331:243::-;48471:34;48467:1;48459:6;48455:14;48448:58;48540:26;48535:2;48527:6;48523:15;48516:51;48331:243;:::o;48580:162::-;48720:14;48716:1;48708:6;48704:14;48697:38;48580:162;:::o;48748:122::-;48821:24;48839:5;48821:24;:::i;:::-;48814:5;48811:35;48801:63;;48860:1;48857;48850:12;48801:63;48748:122;:::o;48876:116::-;48946:21;48961:5;48946:21;:::i;:::-;48939:5;48936:32;48926:60;;48982:1;48979;48972:12;48926:60;48876:116;:::o;48998:120::-;49070:23;49087:5;49070:23;:::i;:::-;49063:5;49060:34;49050:62;;49108:1;49105;49098:12;49050:62;48998:120;:::o;49124:122::-;49197:24;49215:5;49197:24;:::i;:::-;49190:5;49187:35;49177:63;;49236:1;49233;49226:12;49177:63;49124:122;:::o;49252:118::-;49323:22;49339:5;49323:22;:::i;:::-;49316:5;49313:33;49303:61;;49360:1;49357;49350:12;49303:61;49252:118;:::o

Swarm Source

ipfs://37ba1fad9bb1eb4d474a1d99e4857c38de147ba0948fe3fa7bc1735a7b856a84
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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