ETH Price: $3,448.35 (+1.46%)

Token

CozyYety (YETY)
 

Overview

Max Total Supply

203 YETY

Holders

129

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
ngbshpend.eth
Balance
1 YETY
0xd23b06012790E2D8E01a7607127588b609C27f0C
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:
CozyYety

Compiler Version
v0.8.4+commit.c7e474f2

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-02
*/

// SPDX-License-Identifier: MIT
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;
    }
}

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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 {}
}

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

pragma solidity ^0.8.0;

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s;
        uint8 v;
        assembly {
            s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
            v := add(shr(255, vs), 27)
        }
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

pragma solidity ^0.8.4;

/*

 ██████  ██████  ███████ ██    ██     ██    ██ ███████ ████████ ██    ██ 
██      ██    ██    ███   ██  ██       ██  ██  ██         ██     ██  ██  
██      ██    ██   ███     ████         ████   █████      ██      ████   
██      ██    ██  ███       ██           ██    ██         ██       ██    
 ██████  ██████  ███████    ██           ██    ███████    ██       ██    

                               By Devko.dev#7286 
*/


contract CozyYety is ERC721Enumerable, Ownable {
    using Strings for uint256;
    using ECDSA for bytes32;

    uint256 public YETY_PRIVATE = 500;
    uint256 public YETY_MAX = 3888;
    uint256 public YETY_PRICE = 0.04 ether;
    uint256 public YETY_PER_PUBLIC_MINT = 20;
    uint256 public YETY_PER_PRIVATE_MINT = 3;
    string private _tokenBaseURI = "https://api.cozyyety.com/api/token/";
    string private constant PRESALE_SIG_WORD = "CozyYety_PRESALE";
    address private presale_signer_Address = 0x5D7f41b8407A167b2f70c39E1C0E762C4b9FF1AD;
    address private member1 = 0x06bAde3c7893E7172fF65b295d07A0226999C755; // Team
    address private member2 = 0x0000064a362bDaf19B859b5fC829116DfB13ca30; // Devko
    uint256 public privateAmountMinted;
    bool public presaleLive;
    bool public saleLive;
    bool public locked;
    
    constructor() ERC721("CozyYety", "YETY") {}
    
    modifier notLocked {
        require(!locked, "Contract metadata methods are locked");
        _;
    }
    
    function matchAddresSigner(bytes memory signature,string memory word_used,address signer) private view returns(bool) {
         bytes32 hash = keccak256(abi.encodePacked(
            "\x19Ethereum Signed Message:\n32",
            keccak256(abi.encodePacked(msg.sender, word_used)))
          );
        return signer == hash.recover(signature);
    }

    function gift(address[] calldata receivers) external onlyOwner {
        require(totalSupply() + receivers.length <= YETY_MAX, "EXCEED_MAX");
        for (uint256 i = 0; i < receivers.length; i++) {
            _safeMint(receivers[i], totalSupply() + 1);
        }
    }

    function founderMint(uint256 tokenQuantity) external onlyOwner {
        require(totalSupply() + tokenQuantity <= YETY_MAX, "EXCEED_MAX");
        for(uint256 i = 0; i < tokenQuantity; i++) {
            _safeMint(msg.sender, totalSupply() + 1);
        }
    }

    function buy(uint256 tokenQuantity) external payable {
        require(saleLive, "SALE_CLOSED");
        require(totalSupply() + tokenQuantity <= YETY_MAX, "EXCEED_MAX");
        require(tokenQuantity <= YETY_PER_PUBLIC_MINT, "EXCEED_YETY_PER_PUBLIC_MINT");
        require(YETY_PRICE * tokenQuantity <= msg.value, "INSUFFICIENT_ETH");
        
        for(uint256 i = 0; i < tokenQuantity; i++) {
            _safeMint(msg.sender, totalSupply() + 1);
        }
    }

    function presaleBuy(bytes memory signature, uint256 tokenQuantity) external payable {
        require(presaleLive, "PRESALE_CLOSED");
        require(matchAddresSigner(signature, PRESALE_SIG_WORD, presale_signer_Address), "DIRECT_MINT_DISALLOWED");
        require(privateAmountMinted + tokenQuantity <= YETY_PRIVATE, "EXCEED_PRIVATE");
        require(totalSupply() + tokenQuantity <= YETY_MAX, "EXCEED_MAX");
        require(tokenQuantity <= YETY_PER_PRIVATE_MINT, "EXCEED_YETY_PER_PRIVATE_MINT");
        require(YETY_PRICE * tokenQuantity <= msg.value, "INSUFFICIENT_ETH");
        
        for (uint256 i = 0; i < tokenQuantity; i++) {
            privateAmountMinted++;
            _safeMint(msg.sender, totalSupply() + 1);
        }
    }

    function withdraw() external {
        payable(member2).transfer(address(this).balance / 10);
        payable(member1).transfer(address(this).balance);
    }
    
    function lockMetadata() external onlyOwner {
        locked = true;
    }
    
    function togglePresaleStatus() external onlyOwner notLocked {
        presaleLive = !presaleLive;
    }
    
    function toggleSaleStatus() external onlyOwner notLocked {
        saleLive = !saleLive;
    }

    function setPrice(uint256 price) external onlyOwner notLocked {
        YETY_PRICE = price;
    }

    function setPrivate(uint256 count) external onlyOwner notLocked {
        YETY_PRIVATE = count;
    }

    function setMax(uint256 count) external onlyOwner notLocked {
        YETY_MAX = count;
    }
    
    function setPrivateTxMax(uint256 count) external onlyOwner notLocked {
        YETY_PER_PRIVATE_MINT = count;
    }
    
    function setPublicTxMax(uint256 count) external onlyOwner notLocked {
        YETY_PER_PUBLIC_MINT = count;
    }
    
    function setBaseURI(string calldata URI) external onlyOwner notLocked {
        _tokenBaseURI = URI;
    }
    
    function tokenURI(uint256 tokenId) public view override(ERC721) returns (string memory) {
        require(_exists(tokenId), "Cannot query non-existent token");
        return string(abi.encodePacked(_tokenBaseURI, tokenId.toString()));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"YETY_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"YETY_PER_PRIVATE_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"YETY_PER_PUBLIC_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"YETY_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"YETY_PRIVATE","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":[{"internalType":"uint256","name":"tokenQuantity","type":"uint256"}],"name":"buy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenQuantity","type":"uint256"}],"name":"founderMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"receivers","type":"address[]"}],"name":"gift","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"locked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"uint256","name":"tokenQuantity","type":"uint256"}],"name":"presaleBuy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"presaleLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"privateAmountMinted","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":"saleLive","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":"URI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"setMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"setPrivate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"setPrivateTxMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"setPublicTxMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"togglePresaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleSaleStatus","outputs":[],"stateMutability":"nonpayable","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":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526101f4600b55610f30600c55668e1bc9bf040000600d556014600e556003600f5560405180606001604052806023815260200162005ba3602391396010908051906020019062000056929190620002f6565b50735d7f41b8407a167b2f70c39e1c0e762c4b9ff1ad601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507306bade3c7893e7172ff65b295d07a0226999c755601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555071064a362bdaf19b859b5fc829116dfb13ca30601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200016157600080fd5b506040518060400160405280600881526020017f436f7a79596574790000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f59455459000000000000000000000000000000000000000000000000000000008152508160009080519060200190620001e6929190620002f6565b508060019080519060200190620001ff929190620002f6565b50505062000222620002166200022860201b60201c565b6200023060201b60201c565b6200040b565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200030490620003a6565b90600052602060002090601f01602090048101928262000328576000855562000374565b82601f106200034357805160ff191683800117855562000374565b8280016001018555821562000374579182015b828111156200037357825182559160200191906001019062000356565b5b50905062000383919062000387565b5090565b5b80821115620003a257600081600090555060010162000388565b5090565b60006002820490506001821680620003bf57607f821691505b60208210811415620003d657620003d5620003dc565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b615788806200041b6000396000f3fe6080604052600436106102515760003560e01c8063715018a611610139578063acf04548116100b6578063d96a094a1161007a578063d96a094a14610864578063e081b78114610880578063e985e9c5146108ab578063f2fde38b146108e8578063f42202e814610911578063fd917b071461093a57610251565b8063acf045481461077f578063b88d4fde146107a8578063c87b56dd146107d1578063cbecb58e1461080e578063cf3090121461083957610251565b806391b7f5ed116100fd57806391b7f5ed146106c057806395d89b41146106e957806397d1a8d614610714578063989bdbb61461073f578063a22cb4651461075657610251565b8063715018a6146106135780637bffb4ce1461062a57806383a9e0491461064157806389cfd71b1461066c5780638da5cb5b1461069557610251565b806318496c38116101d257806342842e0e1161019657806342842e0e146104df5780634f6ccce71461050857806355f804b31461054557806359a12ad51461056e5780636352211e1461059957806370a08231146105d657610251565b806318496c381461040e5780631fe9eabc1461043957806323b872dd146104625780632f745c591461048b5780633ccfd60b146104c857610251565b8063095ea7b311610219578063095ea7b31461033b57806312b21ac414610364578063163e1e611461038f5780631759bd98146103b857806318160ddd146103e357610251565b806301ffc9a714610256578063049c5c491461029357806306fdde03146102aa578063081812fc146102d557806308a8401914610312575b600080fd5b34801561026257600080fd5b5061027d60048036038101906102789190613e9c565b610956565b60405161028a9190614684565b60405180910390f35b34801561029f57600080fd5b506102a86109d0565b005b3480156102b657600080fd5b506102bf610ac8565b6040516102cc91906146e4565b60405180910390f35b3480156102e157600080fd5b506102fc60048036038101906102f79190613f87565b610b5a565b604051610309919061461d565b60405180910390f35b34801561031e57600080fd5b5061033960048036038101906103349190613f87565b610bdf565b005b34801561034757600080fd5b50610362600480360381019061035d9190613e1b565b610cb5565b005b34801561037057600080fd5b50610379610dcd565b6040516103869190614ae6565b60405180910390f35b34801561039b57600080fd5b506103b660048036038101906103b19190613e57565b610dd3565b005b3480156103c457600080fd5b506103cd610f39565b6040516103da9190614ae6565b60405180910390f35b3480156103ef57600080fd5b506103f8610f3f565b6040516104059190614ae6565b60405180910390f35b34801561041a57600080fd5b50610423610f4c565b6040516104309190614ae6565b60405180910390f35b34801561044557600080fd5b50610460600480360381019061045b9190613f87565b610f52565b005b34801561046e57600080fd5b5061048960048036038101906104849190613d15565b611028565b005b34801561049757600080fd5b506104b260048036038101906104ad9190613e1b565b611088565b6040516104bf9190614ae6565b60405180910390f35b3480156104d457600080fd5b506104dd61112d565b005b3480156104eb57600080fd5b5061050660048036038101906105019190613d15565b61120d565b005b34801561051457600080fd5b5061052f600480360381019061052a9190613f87565b61122d565b60405161053c9190614ae6565b60405180910390f35b34801561055157600080fd5b5061056c60048036038101906105679190613f42565b6112c4565b005b34801561057a57600080fd5b506105836113a6565b6040516105909190614ae6565b60405180910390f35b3480156105a557600080fd5b506105c060048036038101906105bb9190613f87565b6113ac565b6040516105cd919061461d565b60405180910390f35b3480156105e257600080fd5b506105fd60048036038101906105f89190613cb0565b61145e565b60405161060a9190614ae6565b60405180910390f35b34801561061f57600080fd5b50610628611516565b005b34801561063657600080fd5b5061063f61159e565b005b34801561064d57600080fd5b50610656611696565b6040516106639190614684565b60405180910390f35b34801561067857600080fd5b50610693600480360381019061068e9190613f87565b6116a9565b005b3480156106a157600080fd5b506106aa61177f565b6040516106b7919061461d565b60405180910390f35b3480156106cc57600080fd5b506106e760048036038101906106e29190613f87565b6117a9565b005b3480156106f557600080fd5b506106fe61187f565b60405161070b91906146e4565b60405180910390f35b34801561072057600080fd5b50610729611911565b6040516107369190614ae6565b60405180910390f35b34801561074b57600080fd5b50610754611917565b005b34801561076257600080fd5b5061077d60048036038101906107789190613ddf565b6119b0565b005b34801561078b57600080fd5b506107a660048036038101906107a19190613f87565b611b31565b005b3480156107b457600080fd5b506107cf60048036038101906107ca9190613d64565b611c07565b005b3480156107dd57600080fd5b506107f860048036038101906107f39190613f87565b611c69565b60405161080591906146e4565b60405180910390f35b34801561081a57600080fd5b50610823611ce5565b6040516108309190614ae6565b60405180910390f35b34801561084557600080fd5b5061084e611ceb565b60405161085b9190614684565b60405180910390f35b61087e60048036038101906108799190613f87565b611cfe565b005b34801561088c57600080fd5b50610895611e78565b6040516108a29190614684565b60405180910390f35b3480156108b757600080fd5b506108d260048036038101906108cd9190613cd9565b611e8b565b6040516108df9190614684565b60405180910390f35b3480156108f457600080fd5b5061090f600480360381019061090a9190613cb0565b611f1f565b005b34801561091d57600080fd5b5061093860048036038101906109339190613f87565b612017565b005b610954600480360381019061094f9190613eee565b612129565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109c957506109c8826123af565b5b9050919050565b6109d8612491565b73ffffffffffffffffffffffffffffffffffffffff166109f661177f565b73ffffffffffffffffffffffffffffffffffffffff1614610a4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a43906149a6565b60405180910390fd5b601560029054906101000a900460ff1615610a9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a93906149e6565b60405180910390fd5b601560019054906101000a900460ff1615601560016101000a81548160ff021916908315150217905550565b606060008054610ad790614d91565b80601f0160208091040260200160405190810160405280929190818152602001828054610b0390614d91565b8015610b505780601f10610b2557610100808354040283529160200191610b50565b820191906000526020600020905b815481529060010190602001808311610b3357829003601f168201915b5050505050905090565b6000610b6582612499565b610ba4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9b90614986565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610be7612491565b73ffffffffffffffffffffffffffffffffffffffff16610c0561177f565b73ffffffffffffffffffffffffffffffffffffffff1614610c5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c52906149a6565b60405180910390fd5b601560029054906101000a900460ff1615610cab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca2906149e6565b60405180910390fd5b80600f8190555050565b6000610cc0826113ac565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2890614a26565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d50612491565b73ffffffffffffffffffffffffffffffffffffffff161480610d7f5750610d7e81610d79612491565b611e8b565b5b610dbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db5906148e6565b60405180910390fd5b610dc88383612505565b505050565b600f5481565b610ddb612491565b73ffffffffffffffffffffffffffffffffffffffff16610df961177f565b73ffffffffffffffffffffffffffffffffffffffff1614610e4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e46906149a6565b60405180910390fd5b600c5482829050610e5e610f3f565b610e689190614baf565b1115610ea9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea090614a46565b60405180910390fd5b60005b82829050811015610f3457610f21838383818110610ef3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190610f089190613cb0565b6001610f12610f3f565b610f1c9190614baf565b6125be565b8080610f2c90614df4565b915050610eac565b505050565b600d5481565b6000600880549050905090565b600e5481565b610f5a612491565b73ffffffffffffffffffffffffffffffffffffffff16610f7861177f565b73ffffffffffffffffffffffffffffffffffffffff1614610fce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc5906149a6565b60405180910390fd5b601560029054906101000a900460ff161561101e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611015906149e6565b60405180910390fd5b80600c8190555050565b611039611033612491565b826125dc565b611078576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106f90614a66565b60405180910390fd5b6110838383836126ba565b505050565b60006110938361145e565b82106110d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cb90614786565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc600a476111769190614c05565b9081150290604051600060405180830381858888f193505050501580156111a1573d6000803e3d6000fd5b50601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505015801561120a573d6000803e3d6000fd5b50565b61122883838360405180602001604052806000815250611c07565b505050565b6000611237610f3f565b8210611278576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126f90614a86565b60405180910390fd5b600882815481106112b2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6112cc612491565b73ffffffffffffffffffffffffffffffffffffffff166112ea61177f565b73ffffffffffffffffffffffffffffffffffffffff1614611340576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611337906149a6565b60405180910390fd5b601560029054906101000a900460ff1615611390576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611387906149e6565b60405180910390fd5b8181601091906113a1929190613aa8565b505050565b60145481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611455576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144c90614926565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c690614906565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61151e612491565b73ffffffffffffffffffffffffffffffffffffffff1661153c61177f565b73ffffffffffffffffffffffffffffffffffffffff1614611592576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611589906149a6565b60405180910390fd5b61159c6000612916565b565b6115a6612491565b73ffffffffffffffffffffffffffffffffffffffff166115c461177f565b73ffffffffffffffffffffffffffffffffffffffff161461161a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611611906149a6565b60405180910390fd5b601560029054906101000a900460ff161561166a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611661906149e6565b60405180910390fd5b601560009054906101000a900460ff1615601560006101000a81548160ff021916908315150217905550565b601560009054906101000a900460ff1681565b6116b1612491565b73ffffffffffffffffffffffffffffffffffffffff166116cf61177f565b73ffffffffffffffffffffffffffffffffffffffff1614611725576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171c906149a6565b60405180910390fd5b601560029054906101000a900460ff1615611775576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176c906149e6565b60405180910390fd5b80600b8190555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6117b1612491565b73ffffffffffffffffffffffffffffffffffffffff166117cf61177f565b73ffffffffffffffffffffffffffffffffffffffff1614611825576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181c906149a6565b60405180910390fd5b601560029054906101000a900460ff1615611875576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186c906149e6565b60405180910390fd5b80600d8190555050565b60606001805461188e90614d91565b80601f01602080910402602001604051908101604052809291908181526020018280546118ba90614d91565b80156119075780601f106118dc57610100808354040283529160200191611907565b820191906000526020600020905b8154815290600101906020018083116118ea57829003601f168201915b5050505050905090565b600c5481565b61191f612491565b73ffffffffffffffffffffffffffffffffffffffff1661193d61177f565b73ffffffffffffffffffffffffffffffffffffffff1614611993576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198a906149a6565b60405180910390fd5b6001601560026101000a81548160ff021916908315150217905550565b6119b8612491565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1d90614866565b60405180910390fd5b8060056000611a33612491565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611ae0612491565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b259190614684565b60405180910390a35050565b611b39612491565b73ffffffffffffffffffffffffffffffffffffffff16611b5761177f565b73ffffffffffffffffffffffffffffffffffffffff1614611bad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba4906149a6565b60405180910390fd5b601560029054906101000a900460ff1615611bfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf4906149e6565b60405180910390fd5b80600e8190555050565b611c18611c12612491565b836125dc565b611c57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4e90614a66565b60405180910390fd5b611c63848484846129dc565b50505050565b6060611c7482612499565b611cb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611caa90614a06565b60405180910390fd5b6010611cbe83612a38565b604051602001611ccf9291906145d3565b6040516020818303038152906040529050919050565b600b5481565b601560029054906101000a900460ff1681565b601560019054906101000a900460ff16611d4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d44906148a6565b60405180910390fd5b600c5481611d59610f3f565b611d639190614baf565b1115611da4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9b90614a46565b60405180910390fd5b600e54811115611de9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de0906147e6565b60405180910390fd5b3481600d54611df89190614c36565b1115611e39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3090614ac6565b60405180910390fd5b60005b81811015611e7457611e61336001611e52610f3f565b611e5c9190614baf565b6125be565b8080611e6c90614df4565b915050611e3c565b5050565b601560019054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611f27612491565b73ffffffffffffffffffffffffffffffffffffffff16611f4561177f565b73ffffffffffffffffffffffffffffffffffffffff1614611f9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f92906149a6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561200b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612002906147c6565b60405180910390fd5b61201481612916565b50565b61201f612491565b73ffffffffffffffffffffffffffffffffffffffff1661203d61177f565b73ffffffffffffffffffffffffffffffffffffffff1614612093576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208a906149a6565b60405180910390fd5b600c548161209f610f3f565b6120a99190614baf565b11156120ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e190614a46565b60405180910390fd5b60005b8181101561212557612112336001612103610f3f565b61210d9190614baf565b6125be565b808061211d90614df4565b9150506120ed565b5050565b601560009054906101000a900460ff16612178576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216f90614726565b60405180910390fd5b6121da826040518060400160405280601081526020017f436f7a79596574795f50524553414c4500000000000000000000000000000000815250601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612be5565b612219576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221090614746565b60405180910390fd5b600b548160145461222a9190614baf565b111561226b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226290614aa6565b60405180910390fd5b600c5481612277610f3f565b6122819190614baf565b11156122c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b990614a46565b60405180910390fd5b600f54811115612307576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122fe90614826565b60405180910390fd5b3481600d546123169190614c36565b1115612357576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234e90614ac6565b60405180910390fd5b60005b818110156123aa576014600081548092919061237590614df4565b9190505550612397336001612388610f3f565b6123929190614baf565b6125be565b80806123a290614df4565b91505061235a565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061247a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061248a575061248982612c84565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612578836113ac565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6125d8828260405180602001604052806000815250612cee565b5050565b60006125e782612499565b612626576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261d906148c6565b60405180910390fd5b6000612631836113ac565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806126a057508373ffffffffffffffffffffffffffffffffffffffff1661268884610b5a565b73ffffffffffffffffffffffffffffffffffffffff16145b806126b157506126b08185611e8b565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166126da826113ac565b73ffffffffffffffffffffffffffffffffffffffff1614612730576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612727906149c6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279790614846565b60405180910390fd5b6127ab838383612d49565b6127b6600082612505565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128069190614c90565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461285d9190614baf565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6129e78484846126ba565b6129f384848484612e5d565b612a32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a29906147a6565b60405180910390fd5b50505050565b60606000821415612a80576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612be0565b600082905060005b60008214612ab2578080612a9b90614df4565b915050600a82612aab9190614c05565b9150612a88565b60008167ffffffffffffffff811115612af4577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612b265781602001600182028036833780820191505090505b5090505b60008514612bd957600182612b3f9190614c90565b9150600a85612b4e9190614e6b565b6030612b5a9190614baf565b60f81b818381518110612b96577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612bd29190614c05565b9450612b2a565b8093505050505b919050565b6000803384604051602001612bfb9291906145ab565b60405160208183030381529060405280519060200120604051602001612c2191906145f7565b604051602081830303815290604052805190602001209050612c4c8582612ff490919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16149150509392505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612cf8838361301b565b612d056000848484612e5d565b612d44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3b906147a6565b60405180910390fd5b505050565b612d548383836131e9565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612d9757612d92816131ee565b612dd6565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612dd557612dd48382613237565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e1957612e14816133a4565b612e58565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612e5757612e5682826134e7565b5b5b505050565b6000612e7e8473ffffffffffffffffffffffffffffffffffffffff16613566565b15612fe7578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612ea7612491565b8786866040518563ffffffff1660e01b8152600401612ec99493929190614638565b602060405180830381600087803b158015612ee357600080fd5b505af1925050508015612f1457506040513d601f19601f82011682018060405250810190612f119190613ec5565b60015b612f97573d8060008114612f44576040519150601f19603f3d011682016040523d82523d6000602084013e612f49565b606091505b50600081511415612f8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f86906147a6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612fec565b600190505b949350505050565b60008060006130038585613579565b91509150613010816135fc565b819250505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561308b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161308290614966565b60405180910390fd5b61309481612499565b156130d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130cb90614806565b60405180910390fd5b6130e060008383612d49565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131309190614baf565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016132448461145e565b61324e9190614c90565b9050600060076000848152602001908152602001600020549050818114613333576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506133b89190614c90565b905060006009600084815260200190815260200160002054905060006008838154811061340e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613456577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806134cb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006134f28361145e565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b6000806041835114156135bb5760008060006020860151925060408601519150606086015160001a90506135af8782858561394d565b945094505050506135f5565b6040835114156135ec5760008060208501519150604085015190506135e1868383613a5a565b9350935050506135f5565b60006002915091505b9250929050565b60006004811115613636577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81600481111561366f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b141561367a5761394a565b600160048111156136b4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8160048111156136ed577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b141561372e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161372590614706565b60405180910390fd5b60026004811115613768577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8160048111156137a1577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14156137e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137d990614766565b60405180910390fd5b6003600481111561381c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115613855577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415613896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161388d90614886565b60405180910390fd5b6004808111156138cf577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115613908577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415613949576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161394090614946565b60405180910390fd5b5b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115613988576000600391509150613a51565b601b8560ff16141580156139a05750601c8560ff1614155b156139b2576000600491509150613a51565b6000600187878787604051600081526020016040526040516139d7949392919061469f565b6020604051602081039080840390855afa1580156139f9573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613a4857600060019250925050613a51565b80600092509250505b94509492505050565b6000806000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85169150601b8560ff1c019050613a9a8782888561394d565b935093505050935093915050565b828054613ab490614d91565b90600052602060002090601f016020900481019282613ad65760008555613b1d565b82601f10613aef57803560ff1916838001178555613b1d565b82800160010185558215613b1d579182015b82811115613b1c578235825591602001919060010190613b01565b5b509050613b2a9190613b2e565b5090565b5b80821115613b47576000816000905550600101613b2f565b5090565b6000613b5e613b5984614b26565b614b01565b905082815260208101848484011115613b7657600080fd5b613b81848285614d4f565b509392505050565b600081359050613b98816156f6565b92915050565b60008083601f840112613bb057600080fd5b8235905067ffffffffffffffff811115613bc957600080fd5b602083019150836020820283011115613be157600080fd5b9250929050565b600081359050613bf78161570d565b92915050565b600081359050613c0c81615724565b92915050565b600081519050613c2181615724565b92915050565b600082601f830112613c3857600080fd5b8135613c48848260208601613b4b565b91505092915050565b60008083601f840112613c6357600080fd5b8235905067ffffffffffffffff811115613c7c57600080fd5b602083019150836001820283011115613c9457600080fd5b9250929050565b600081359050613caa8161573b565b92915050565b600060208284031215613cc257600080fd5b6000613cd084828501613b89565b91505092915050565b60008060408385031215613cec57600080fd5b6000613cfa85828601613b89565b9250506020613d0b85828601613b89565b9150509250929050565b600080600060608486031215613d2a57600080fd5b6000613d3886828701613b89565b9350506020613d4986828701613b89565b9250506040613d5a86828701613c9b565b9150509250925092565b60008060008060808587031215613d7a57600080fd5b6000613d8887828801613b89565b9450506020613d9987828801613b89565b9350506040613daa87828801613c9b565b925050606085013567ffffffffffffffff811115613dc757600080fd5b613dd387828801613c27565b91505092959194509250565b60008060408385031215613df257600080fd5b6000613e0085828601613b89565b9250506020613e1185828601613be8565b9150509250929050565b60008060408385031215613e2e57600080fd5b6000613e3c85828601613b89565b9250506020613e4d85828601613c9b565b9150509250929050565b60008060208385031215613e6a57600080fd5b600083013567ffffffffffffffff811115613e8457600080fd5b613e9085828601613b9e565b92509250509250929050565b600060208284031215613eae57600080fd5b6000613ebc84828501613bfd565b91505092915050565b600060208284031215613ed757600080fd5b6000613ee584828501613c12565b91505092915050565b60008060408385031215613f0157600080fd5b600083013567ffffffffffffffff811115613f1b57600080fd5b613f2785828601613c27565b9250506020613f3885828601613c9b565b9150509250929050565b60008060208385031215613f5557600080fd5b600083013567ffffffffffffffff811115613f6f57600080fd5b613f7b85828601613c51565b92509250509250929050565b600060208284031215613f9957600080fd5b6000613fa784828501613c9b565b91505092915050565b613fb981614cc4565b82525050565b613fd0613fcb82614cc4565b614e3d565b82525050565b613fdf81614cd6565b82525050565b613fee81614ce2565b82525050565b61400561400082614ce2565b614e4f565b82525050565b600061401682614b6c565b6140208185614b82565b9350614030818560208601614d5e565b61403981614f58565b840191505092915050565b600061404f82614b77565b6140598185614b93565b9350614069818560208601614d5e565b61407281614f58565b840191505092915050565b600061408882614b77565b6140928185614ba4565b93506140a2818560208601614d5e565b80840191505092915050565b600081546140bb81614d91565b6140c58186614ba4565b945060018216600081146140e057600181146140f157614124565b60ff19831686528186019350614124565b6140fa85614b57565b60005b8381101561411c578154818901526001820191506020810190506140fd565b838801955050505b50505092915050565b600061413a601883614b93565b915061414582614f76565b602082019050919050565b600061415d600e83614b93565b915061416882614f9f565b602082019050919050565b6000614180601683614b93565b915061418b82614fc8565b602082019050919050565b60006141a3601f83614b93565b91506141ae82614ff1565b602082019050919050565b60006141c6601c83614ba4565b91506141d18261501a565b601c82019050919050565b60006141e9602b83614b93565b91506141f482615043565b604082019050919050565b600061420c603283614b93565b915061421782615092565b604082019050919050565b600061422f602683614b93565b915061423a826150e1565b604082019050919050565b6000614252601b83614b93565b915061425d82615130565b602082019050919050565b6000614275601c83614b93565b915061428082615159565b602082019050919050565b6000614298601c83614b93565b91506142a382615182565b602082019050919050565b60006142bb602483614b93565b91506142c6826151ab565b604082019050919050565b60006142de601983614b93565b91506142e9826151fa565b602082019050919050565b6000614301602283614b93565b915061430c82615223565b604082019050919050565b6000614324600b83614b93565b915061432f82615272565b602082019050919050565b6000614347602c83614b93565b91506143528261529b565b604082019050919050565b600061436a603883614b93565b9150614375826152ea565b604082019050919050565b600061438d602a83614b93565b915061439882615339565b604082019050919050565b60006143b0602983614b93565b91506143bb82615388565b604082019050919050565b60006143d3602283614b93565b91506143de826153d7565b604082019050919050565b60006143f6602083614b93565b915061440182615426565b602082019050919050565b6000614419602c83614b93565b91506144248261544f565b604082019050919050565b600061443c602083614b93565b91506144478261549e565b602082019050919050565b600061445f602983614b93565b915061446a826154c7565b604082019050919050565b6000614482602483614b93565b915061448d82615516565b604082019050919050565b60006144a5601f83614b93565b91506144b082615565565b602082019050919050565b60006144c8602183614b93565b91506144d38261558e565b604082019050919050565b60006144eb600a83614b93565b91506144f6826155dd565b602082019050919050565b600061450e603183614b93565b915061451982615606565b604082019050919050565b6000614531602c83614b93565b915061453c82615655565b604082019050919050565b6000614554600e83614b93565b915061455f826156a4565b602082019050919050565b6000614577601083614b93565b9150614582826156cd565b602082019050919050565b61459681614d38565b82525050565b6145a581614d42565b82525050565b60006145b78285613fbf565b6014820191506145c7828461407d565b91508190509392505050565b60006145df82856140ae565b91506145eb828461407d565b91508190509392505050565b6000614602826141b9565b915061460e8284613ff4565b60208201915081905092915050565b60006020820190506146326000830184613fb0565b92915050565b600060808201905061464d6000830187613fb0565b61465a6020830186613fb0565b614667604083018561458d565b8181036060830152614679818461400b565b905095945050505050565b60006020820190506146996000830184613fd6565b92915050565b60006080820190506146b46000830187613fe5565b6146c1602083018661459c565b6146ce6040830185613fe5565b6146db6060830184613fe5565b95945050505050565b600060208201905081810360008301526146fe8184614044565b905092915050565b6000602082019050818103600083015261471f8161412d565b9050919050565b6000602082019050818103600083015261473f81614150565b9050919050565b6000602082019050818103600083015261475f81614173565b9050919050565b6000602082019050818103600083015261477f81614196565b9050919050565b6000602082019050818103600083015261479f816141dc565b9050919050565b600060208201905081810360008301526147bf816141ff565b9050919050565b600060208201905081810360008301526147df81614222565b9050919050565b600060208201905081810360008301526147ff81614245565b9050919050565b6000602082019050818103600083015261481f81614268565b9050919050565b6000602082019050818103600083015261483f8161428b565b9050919050565b6000602082019050818103600083015261485f816142ae565b9050919050565b6000602082019050818103600083015261487f816142d1565b9050919050565b6000602082019050818103600083015261489f816142f4565b9050919050565b600060208201905081810360008301526148bf81614317565b9050919050565b600060208201905081810360008301526148df8161433a565b9050919050565b600060208201905081810360008301526148ff8161435d565b9050919050565b6000602082019050818103600083015261491f81614380565b9050919050565b6000602082019050818103600083015261493f816143a3565b9050919050565b6000602082019050818103600083015261495f816143c6565b9050919050565b6000602082019050818103600083015261497f816143e9565b9050919050565b6000602082019050818103600083015261499f8161440c565b9050919050565b600060208201905081810360008301526149bf8161442f565b9050919050565b600060208201905081810360008301526149df81614452565b9050919050565b600060208201905081810360008301526149ff81614475565b9050919050565b60006020820190508181036000830152614a1f81614498565b9050919050565b60006020820190508181036000830152614a3f816144bb565b9050919050565b60006020820190508181036000830152614a5f816144de565b9050919050565b60006020820190508181036000830152614a7f81614501565b9050919050565b60006020820190508181036000830152614a9f81614524565b9050919050565b60006020820190508181036000830152614abf81614547565b9050919050565b60006020820190508181036000830152614adf8161456a565b9050919050565b6000602082019050614afb600083018461458d565b92915050565b6000614b0b614b1c565b9050614b178282614dc3565b919050565b6000604051905090565b600067ffffffffffffffff821115614b4157614b40614f29565b5b614b4a82614f58565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614bba82614d38565b9150614bc583614d38565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614bfa57614bf9614e9c565b5b828201905092915050565b6000614c1082614d38565b9150614c1b83614d38565b925082614c2b57614c2a614ecb565b5b828204905092915050565b6000614c4182614d38565b9150614c4c83614d38565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614c8557614c84614e9c565b5b828202905092915050565b6000614c9b82614d38565b9150614ca683614d38565b925082821015614cb957614cb8614e9c565b5b828203905092915050565b6000614ccf82614d18565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614d7c578082015181840152602081019050614d61565b83811115614d8b576000848401525b50505050565b60006002820490506001821680614da957607f821691505b60208210811415614dbd57614dbc614efa565b5b50919050565b614dcc82614f58565b810181811067ffffffffffffffff82111715614deb57614dea614f29565b5b80604052505050565b6000614dff82614d38565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614e3257614e31614e9c565b5b600182019050919050565b6000614e4882614e59565b9050919050565b6000819050919050565b6000614e6482614f69565b9050919050565b6000614e7682614d38565b9150614e8183614d38565b925082614e9157614e90614ecb565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f50524553414c455f434c4f534544000000000000000000000000000000000000600082015250565b7f4449524543545f4d494e545f444953414c4c4f57454400000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4558434545445f594554595f5045525f5055424c49435f4d494e540000000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4558434545445f594554595f5045525f505249564154455f4d494e5400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f53414c455f434c4f534544000000000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f436f6e7472616374206d65746164617461206d6574686f647320617265206c6f60008201527f636b656400000000000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f74207175657279206e6f6e2d6578697374656e7420746f6b656e00600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4558434545445f4d415800000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4558434545445f50524956415445000000000000000000000000000000000000600082015250565b7f494e53554646494349454e545f45544800000000000000000000000000000000600082015250565b6156ff81614cc4565b811461570a57600080fd5b50565b61571681614cd6565b811461572157600080fd5b50565b61572d81614cec565b811461573857600080fd5b50565b61574481614d38565b811461574f57600080fd5b5056fea264697066735822122014ce7b206af6020d3df58ee5f01d1ef89fea661dbc92afc26b8f64b96e00686c64736f6c6343000804003368747470733a2f2f6170692e636f7a79796574792e636f6d2f6170692f746f6b656e2f

Deployed Bytecode

0x6080604052600436106102515760003560e01c8063715018a611610139578063acf04548116100b6578063d96a094a1161007a578063d96a094a14610864578063e081b78114610880578063e985e9c5146108ab578063f2fde38b146108e8578063f42202e814610911578063fd917b071461093a57610251565b8063acf045481461077f578063b88d4fde146107a8578063c87b56dd146107d1578063cbecb58e1461080e578063cf3090121461083957610251565b806391b7f5ed116100fd57806391b7f5ed146106c057806395d89b41146106e957806397d1a8d614610714578063989bdbb61461073f578063a22cb4651461075657610251565b8063715018a6146106135780637bffb4ce1461062a57806383a9e0491461064157806389cfd71b1461066c5780638da5cb5b1461069557610251565b806318496c38116101d257806342842e0e1161019657806342842e0e146104df5780634f6ccce71461050857806355f804b31461054557806359a12ad51461056e5780636352211e1461059957806370a08231146105d657610251565b806318496c381461040e5780631fe9eabc1461043957806323b872dd146104625780632f745c591461048b5780633ccfd60b146104c857610251565b8063095ea7b311610219578063095ea7b31461033b57806312b21ac414610364578063163e1e611461038f5780631759bd98146103b857806318160ddd146103e357610251565b806301ffc9a714610256578063049c5c491461029357806306fdde03146102aa578063081812fc146102d557806308a8401914610312575b600080fd5b34801561026257600080fd5b5061027d60048036038101906102789190613e9c565b610956565b60405161028a9190614684565b60405180910390f35b34801561029f57600080fd5b506102a86109d0565b005b3480156102b657600080fd5b506102bf610ac8565b6040516102cc91906146e4565b60405180910390f35b3480156102e157600080fd5b506102fc60048036038101906102f79190613f87565b610b5a565b604051610309919061461d565b60405180910390f35b34801561031e57600080fd5b5061033960048036038101906103349190613f87565b610bdf565b005b34801561034757600080fd5b50610362600480360381019061035d9190613e1b565b610cb5565b005b34801561037057600080fd5b50610379610dcd565b6040516103869190614ae6565b60405180910390f35b34801561039b57600080fd5b506103b660048036038101906103b19190613e57565b610dd3565b005b3480156103c457600080fd5b506103cd610f39565b6040516103da9190614ae6565b60405180910390f35b3480156103ef57600080fd5b506103f8610f3f565b6040516104059190614ae6565b60405180910390f35b34801561041a57600080fd5b50610423610f4c565b6040516104309190614ae6565b60405180910390f35b34801561044557600080fd5b50610460600480360381019061045b9190613f87565b610f52565b005b34801561046e57600080fd5b5061048960048036038101906104849190613d15565b611028565b005b34801561049757600080fd5b506104b260048036038101906104ad9190613e1b565b611088565b6040516104bf9190614ae6565b60405180910390f35b3480156104d457600080fd5b506104dd61112d565b005b3480156104eb57600080fd5b5061050660048036038101906105019190613d15565b61120d565b005b34801561051457600080fd5b5061052f600480360381019061052a9190613f87565b61122d565b60405161053c9190614ae6565b60405180910390f35b34801561055157600080fd5b5061056c60048036038101906105679190613f42565b6112c4565b005b34801561057a57600080fd5b506105836113a6565b6040516105909190614ae6565b60405180910390f35b3480156105a557600080fd5b506105c060048036038101906105bb9190613f87565b6113ac565b6040516105cd919061461d565b60405180910390f35b3480156105e257600080fd5b506105fd60048036038101906105f89190613cb0565b61145e565b60405161060a9190614ae6565b60405180910390f35b34801561061f57600080fd5b50610628611516565b005b34801561063657600080fd5b5061063f61159e565b005b34801561064d57600080fd5b50610656611696565b6040516106639190614684565b60405180910390f35b34801561067857600080fd5b50610693600480360381019061068e9190613f87565b6116a9565b005b3480156106a157600080fd5b506106aa61177f565b6040516106b7919061461d565b60405180910390f35b3480156106cc57600080fd5b506106e760048036038101906106e29190613f87565b6117a9565b005b3480156106f557600080fd5b506106fe61187f565b60405161070b91906146e4565b60405180910390f35b34801561072057600080fd5b50610729611911565b6040516107369190614ae6565b60405180910390f35b34801561074b57600080fd5b50610754611917565b005b34801561076257600080fd5b5061077d60048036038101906107789190613ddf565b6119b0565b005b34801561078b57600080fd5b506107a660048036038101906107a19190613f87565b611b31565b005b3480156107b457600080fd5b506107cf60048036038101906107ca9190613d64565b611c07565b005b3480156107dd57600080fd5b506107f860048036038101906107f39190613f87565b611c69565b60405161080591906146e4565b60405180910390f35b34801561081a57600080fd5b50610823611ce5565b6040516108309190614ae6565b60405180910390f35b34801561084557600080fd5b5061084e611ceb565b60405161085b9190614684565b60405180910390f35b61087e60048036038101906108799190613f87565b611cfe565b005b34801561088c57600080fd5b50610895611e78565b6040516108a29190614684565b60405180910390f35b3480156108b757600080fd5b506108d260048036038101906108cd9190613cd9565b611e8b565b6040516108df9190614684565b60405180910390f35b3480156108f457600080fd5b5061090f600480360381019061090a9190613cb0565b611f1f565b005b34801561091d57600080fd5b5061093860048036038101906109339190613f87565b612017565b005b610954600480360381019061094f9190613eee565b612129565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109c957506109c8826123af565b5b9050919050565b6109d8612491565b73ffffffffffffffffffffffffffffffffffffffff166109f661177f565b73ffffffffffffffffffffffffffffffffffffffff1614610a4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a43906149a6565b60405180910390fd5b601560029054906101000a900460ff1615610a9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a93906149e6565b60405180910390fd5b601560019054906101000a900460ff1615601560016101000a81548160ff021916908315150217905550565b606060008054610ad790614d91565b80601f0160208091040260200160405190810160405280929190818152602001828054610b0390614d91565b8015610b505780601f10610b2557610100808354040283529160200191610b50565b820191906000526020600020905b815481529060010190602001808311610b3357829003601f168201915b5050505050905090565b6000610b6582612499565b610ba4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9b90614986565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610be7612491565b73ffffffffffffffffffffffffffffffffffffffff16610c0561177f565b73ffffffffffffffffffffffffffffffffffffffff1614610c5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c52906149a6565b60405180910390fd5b601560029054906101000a900460ff1615610cab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca2906149e6565b60405180910390fd5b80600f8190555050565b6000610cc0826113ac565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2890614a26565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d50612491565b73ffffffffffffffffffffffffffffffffffffffff161480610d7f5750610d7e81610d79612491565b611e8b565b5b610dbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db5906148e6565b60405180910390fd5b610dc88383612505565b505050565b600f5481565b610ddb612491565b73ffffffffffffffffffffffffffffffffffffffff16610df961177f565b73ffffffffffffffffffffffffffffffffffffffff1614610e4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e46906149a6565b60405180910390fd5b600c5482829050610e5e610f3f565b610e689190614baf565b1115610ea9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea090614a46565b60405180910390fd5b60005b82829050811015610f3457610f21838383818110610ef3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190610f089190613cb0565b6001610f12610f3f565b610f1c9190614baf565b6125be565b8080610f2c90614df4565b915050610eac565b505050565b600d5481565b6000600880549050905090565b600e5481565b610f5a612491565b73ffffffffffffffffffffffffffffffffffffffff16610f7861177f565b73ffffffffffffffffffffffffffffffffffffffff1614610fce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc5906149a6565b60405180910390fd5b601560029054906101000a900460ff161561101e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611015906149e6565b60405180910390fd5b80600c8190555050565b611039611033612491565b826125dc565b611078576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106f90614a66565b60405180910390fd5b6110838383836126ba565b505050565b60006110938361145e565b82106110d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cb90614786565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc600a476111769190614c05565b9081150290604051600060405180830381858888f193505050501580156111a1573d6000803e3d6000fd5b50601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505015801561120a573d6000803e3d6000fd5b50565b61122883838360405180602001604052806000815250611c07565b505050565b6000611237610f3f565b8210611278576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126f90614a86565b60405180910390fd5b600882815481106112b2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6112cc612491565b73ffffffffffffffffffffffffffffffffffffffff166112ea61177f565b73ffffffffffffffffffffffffffffffffffffffff1614611340576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611337906149a6565b60405180910390fd5b601560029054906101000a900460ff1615611390576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611387906149e6565b60405180910390fd5b8181601091906113a1929190613aa8565b505050565b60145481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611455576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144c90614926565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c690614906565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61151e612491565b73ffffffffffffffffffffffffffffffffffffffff1661153c61177f565b73ffffffffffffffffffffffffffffffffffffffff1614611592576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611589906149a6565b60405180910390fd5b61159c6000612916565b565b6115a6612491565b73ffffffffffffffffffffffffffffffffffffffff166115c461177f565b73ffffffffffffffffffffffffffffffffffffffff161461161a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611611906149a6565b60405180910390fd5b601560029054906101000a900460ff161561166a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611661906149e6565b60405180910390fd5b601560009054906101000a900460ff1615601560006101000a81548160ff021916908315150217905550565b601560009054906101000a900460ff1681565b6116b1612491565b73ffffffffffffffffffffffffffffffffffffffff166116cf61177f565b73ffffffffffffffffffffffffffffffffffffffff1614611725576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171c906149a6565b60405180910390fd5b601560029054906101000a900460ff1615611775576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176c906149e6565b60405180910390fd5b80600b8190555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6117b1612491565b73ffffffffffffffffffffffffffffffffffffffff166117cf61177f565b73ffffffffffffffffffffffffffffffffffffffff1614611825576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181c906149a6565b60405180910390fd5b601560029054906101000a900460ff1615611875576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186c906149e6565b60405180910390fd5b80600d8190555050565b60606001805461188e90614d91565b80601f01602080910402602001604051908101604052809291908181526020018280546118ba90614d91565b80156119075780601f106118dc57610100808354040283529160200191611907565b820191906000526020600020905b8154815290600101906020018083116118ea57829003601f168201915b5050505050905090565b600c5481565b61191f612491565b73ffffffffffffffffffffffffffffffffffffffff1661193d61177f565b73ffffffffffffffffffffffffffffffffffffffff1614611993576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198a906149a6565b60405180910390fd5b6001601560026101000a81548160ff021916908315150217905550565b6119b8612491565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1d90614866565b60405180910390fd5b8060056000611a33612491565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611ae0612491565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b259190614684565b60405180910390a35050565b611b39612491565b73ffffffffffffffffffffffffffffffffffffffff16611b5761177f565b73ffffffffffffffffffffffffffffffffffffffff1614611bad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba4906149a6565b60405180910390fd5b601560029054906101000a900460ff1615611bfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf4906149e6565b60405180910390fd5b80600e8190555050565b611c18611c12612491565b836125dc565b611c57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4e90614a66565b60405180910390fd5b611c63848484846129dc565b50505050565b6060611c7482612499565b611cb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611caa90614a06565b60405180910390fd5b6010611cbe83612a38565b604051602001611ccf9291906145d3565b6040516020818303038152906040529050919050565b600b5481565b601560029054906101000a900460ff1681565b601560019054906101000a900460ff16611d4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d44906148a6565b60405180910390fd5b600c5481611d59610f3f565b611d639190614baf565b1115611da4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9b90614a46565b60405180910390fd5b600e54811115611de9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de0906147e6565b60405180910390fd5b3481600d54611df89190614c36565b1115611e39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3090614ac6565b60405180910390fd5b60005b81811015611e7457611e61336001611e52610f3f565b611e5c9190614baf565b6125be565b8080611e6c90614df4565b915050611e3c565b5050565b601560019054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611f27612491565b73ffffffffffffffffffffffffffffffffffffffff16611f4561177f565b73ffffffffffffffffffffffffffffffffffffffff1614611f9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f92906149a6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561200b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612002906147c6565b60405180910390fd5b61201481612916565b50565b61201f612491565b73ffffffffffffffffffffffffffffffffffffffff1661203d61177f565b73ffffffffffffffffffffffffffffffffffffffff1614612093576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208a906149a6565b60405180910390fd5b600c548161209f610f3f565b6120a99190614baf565b11156120ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e190614a46565b60405180910390fd5b60005b8181101561212557612112336001612103610f3f565b61210d9190614baf565b6125be565b808061211d90614df4565b9150506120ed565b5050565b601560009054906101000a900460ff16612178576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216f90614726565b60405180910390fd5b6121da826040518060400160405280601081526020017f436f7a79596574795f50524553414c4500000000000000000000000000000000815250601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612be5565b612219576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221090614746565b60405180910390fd5b600b548160145461222a9190614baf565b111561226b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226290614aa6565b60405180910390fd5b600c5481612277610f3f565b6122819190614baf565b11156122c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b990614a46565b60405180910390fd5b600f54811115612307576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122fe90614826565b60405180910390fd5b3481600d546123169190614c36565b1115612357576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234e90614ac6565b60405180910390fd5b60005b818110156123aa576014600081548092919061237590614df4565b9190505550612397336001612388610f3f565b6123929190614baf565b6125be565b80806123a290614df4565b91505061235a565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061247a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061248a575061248982612c84565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612578836113ac565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6125d8828260405180602001604052806000815250612cee565b5050565b60006125e782612499565b612626576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261d906148c6565b60405180910390fd5b6000612631836113ac565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806126a057508373ffffffffffffffffffffffffffffffffffffffff1661268884610b5a565b73ffffffffffffffffffffffffffffffffffffffff16145b806126b157506126b08185611e8b565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166126da826113ac565b73ffffffffffffffffffffffffffffffffffffffff1614612730576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612727906149c6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279790614846565b60405180910390fd5b6127ab838383612d49565b6127b6600082612505565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128069190614c90565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461285d9190614baf565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6129e78484846126ba565b6129f384848484612e5d565b612a32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a29906147a6565b60405180910390fd5b50505050565b60606000821415612a80576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612be0565b600082905060005b60008214612ab2578080612a9b90614df4565b915050600a82612aab9190614c05565b9150612a88565b60008167ffffffffffffffff811115612af4577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612b265781602001600182028036833780820191505090505b5090505b60008514612bd957600182612b3f9190614c90565b9150600a85612b4e9190614e6b565b6030612b5a9190614baf565b60f81b818381518110612b96577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612bd29190614c05565b9450612b2a565b8093505050505b919050565b6000803384604051602001612bfb9291906145ab565b60405160208183030381529060405280519060200120604051602001612c2191906145f7565b604051602081830303815290604052805190602001209050612c4c8582612ff490919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16149150509392505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612cf8838361301b565b612d056000848484612e5d565b612d44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3b906147a6565b60405180910390fd5b505050565b612d548383836131e9565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612d9757612d92816131ee565b612dd6565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612dd557612dd48382613237565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e1957612e14816133a4565b612e58565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612e5757612e5682826134e7565b5b5b505050565b6000612e7e8473ffffffffffffffffffffffffffffffffffffffff16613566565b15612fe7578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612ea7612491565b8786866040518563ffffffff1660e01b8152600401612ec99493929190614638565b602060405180830381600087803b158015612ee357600080fd5b505af1925050508015612f1457506040513d601f19601f82011682018060405250810190612f119190613ec5565b60015b612f97573d8060008114612f44576040519150601f19603f3d011682016040523d82523d6000602084013e612f49565b606091505b50600081511415612f8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f86906147a6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612fec565b600190505b949350505050565b60008060006130038585613579565b91509150613010816135fc565b819250505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561308b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161308290614966565b60405180910390fd5b61309481612499565b156130d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130cb90614806565b60405180910390fd5b6130e060008383612d49565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131309190614baf565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016132448461145e565b61324e9190614c90565b9050600060076000848152602001908152602001600020549050818114613333576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506133b89190614c90565b905060006009600084815260200190815260200160002054905060006008838154811061340e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613456577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806134cb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006134f28361145e565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b6000806041835114156135bb5760008060006020860151925060408601519150606086015160001a90506135af8782858561394d565b945094505050506135f5565b6040835114156135ec5760008060208501519150604085015190506135e1868383613a5a565b9350935050506135f5565b60006002915091505b9250929050565b60006004811115613636577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81600481111561366f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b141561367a5761394a565b600160048111156136b4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8160048111156136ed577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b141561372e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161372590614706565b60405180910390fd5b60026004811115613768577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8160048111156137a1577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14156137e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137d990614766565b60405180910390fd5b6003600481111561381c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115613855577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415613896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161388d90614886565b60405180910390fd5b6004808111156138cf577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115613908577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415613949576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161394090614946565b60405180910390fd5b5b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115613988576000600391509150613a51565b601b8560ff16141580156139a05750601c8560ff1614155b156139b2576000600491509150613a51565b6000600187878787604051600081526020016040526040516139d7949392919061469f565b6020604051602081039080840390855afa1580156139f9573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613a4857600060019250925050613a51565b80600092509250505b94509492505050565b6000806000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85169150601b8560ff1c019050613a9a8782888561394d565b935093505050935093915050565b828054613ab490614d91565b90600052602060002090601f016020900481019282613ad65760008555613b1d565b82601f10613aef57803560ff1916838001178555613b1d565b82800160010185558215613b1d579182015b82811115613b1c578235825591602001919060010190613b01565b5b509050613b2a9190613b2e565b5090565b5b80821115613b47576000816000905550600101613b2f565b5090565b6000613b5e613b5984614b26565b614b01565b905082815260208101848484011115613b7657600080fd5b613b81848285614d4f565b509392505050565b600081359050613b98816156f6565b92915050565b60008083601f840112613bb057600080fd5b8235905067ffffffffffffffff811115613bc957600080fd5b602083019150836020820283011115613be157600080fd5b9250929050565b600081359050613bf78161570d565b92915050565b600081359050613c0c81615724565b92915050565b600081519050613c2181615724565b92915050565b600082601f830112613c3857600080fd5b8135613c48848260208601613b4b565b91505092915050565b60008083601f840112613c6357600080fd5b8235905067ffffffffffffffff811115613c7c57600080fd5b602083019150836001820283011115613c9457600080fd5b9250929050565b600081359050613caa8161573b565b92915050565b600060208284031215613cc257600080fd5b6000613cd084828501613b89565b91505092915050565b60008060408385031215613cec57600080fd5b6000613cfa85828601613b89565b9250506020613d0b85828601613b89565b9150509250929050565b600080600060608486031215613d2a57600080fd5b6000613d3886828701613b89565b9350506020613d4986828701613b89565b9250506040613d5a86828701613c9b565b9150509250925092565b60008060008060808587031215613d7a57600080fd5b6000613d8887828801613b89565b9450506020613d9987828801613b89565b9350506040613daa87828801613c9b565b925050606085013567ffffffffffffffff811115613dc757600080fd5b613dd387828801613c27565b91505092959194509250565b60008060408385031215613df257600080fd5b6000613e0085828601613b89565b9250506020613e1185828601613be8565b9150509250929050565b60008060408385031215613e2e57600080fd5b6000613e3c85828601613b89565b9250506020613e4d85828601613c9b565b9150509250929050565b60008060208385031215613e6a57600080fd5b600083013567ffffffffffffffff811115613e8457600080fd5b613e9085828601613b9e565b92509250509250929050565b600060208284031215613eae57600080fd5b6000613ebc84828501613bfd565b91505092915050565b600060208284031215613ed757600080fd5b6000613ee584828501613c12565b91505092915050565b60008060408385031215613f0157600080fd5b600083013567ffffffffffffffff811115613f1b57600080fd5b613f2785828601613c27565b9250506020613f3885828601613c9b565b9150509250929050565b60008060208385031215613f5557600080fd5b600083013567ffffffffffffffff811115613f6f57600080fd5b613f7b85828601613c51565b92509250509250929050565b600060208284031215613f9957600080fd5b6000613fa784828501613c9b565b91505092915050565b613fb981614cc4565b82525050565b613fd0613fcb82614cc4565b614e3d565b82525050565b613fdf81614cd6565b82525050565b613fee81614ce2565b82525050565b61400561400082614ce2565b614e4f565b82525050565b600061401682614b6c565b6140208185614b82565b9350614030818560208601614d5e565b61403981614f58565b840191505092915050565b600061404f82614b77565b6140598185614b93565b9350614069818560208601614d5e565b61407281614f58565b840191505092915050565b600061408882614b77565b6140928185614ba4565b93506140a2818560208601614d5e565b80840191505092915050565b600081546140bb81614d91565b6140c58186614ba4565b945060018216600081146140e057600181146140f157614124565b60ff19831686528186019350614124565b6140fa85614b57565b60005b8381101561411c578154818901526001820191506020810190506140fd565b838801955050505b50505092915050565b600061413a601883614b93565b915061414582614f76565b602082019050919050565b600061415d600e83614b93565b915061416882614f9f565b602082019050919050565b6000614180601683614b93565b915061418b82614fc8565b602082019050919050565b60006141a3601f83614b93565b91506141ae82614ff1565b602082019050919050565b60006141c6601c83614ba4565b91506141d18261501a565b601c82019050919050565b60006141e9602b83614b93565b91506141f482615043565b604082019050919050565b600061420c603283614b93565b915061421782615092565b604082019050919050565b600061422f602683614b93565b915061423a826150e1565b604082019050919050565b6000614252601b83614b93565b915061425d82615130565b602082019050919050565b6000614275601c83614b93565b915061428082615159565b602082019050919050565b6000614298601c83614b93565b91506142a382615182565b602082019050919050565b60006142bb602483614b93565b91506142c6826151ab565b604082019050919050565b60006142de601983614b93565b91506142e9826151fa565b602082019050919050565b6000614301602283614b93565b915061430c82615223565b604082019050919050565b6000614324600b83614b93565b915061432f82615272565b602082019050919050565b6000614347602c83614b93565b91506143528261529b565b604082019050919050565b600061436a603883614b93565b9150614375826152ea565b604082019050919050565b600061438d602a83614b93565b915061439882615339565b604082019050919050565b60006143b0602983614b93565b91506143bb82615388565b604082019050919050565b60006143d3602283614b93565b91506143de826153d7565b604082019050919050565b60006143f6602083614b93565b915061440182615426565b602082019050919050565b6000614419602c83614b93565b91506144248261544f565b604082019050919050565b600061443c602083614b93565b91506144478261549e565b602082019050919050565b600061445f602983614b93565b915061446a826154c7565b604082019050919050565b6000614482602483614b93565b915061448d82615516565b604082019050919050565b60006144a5601f83614b93565b91506144b082615565565b602082019050919050565b60006144c8602183614b93565b91506144d38261558e565b604082019050919050565b60006144eb600a83614b93565b91506144f6826155dd565b602082019050919050565b600061450e603183614b93565b915061451982615606565b604082019050919050565b6000614531602c83614b93565b915061453c82615655565b604082019050919050565b6000614554600e83614b93565b915061455f826156a4565b602082019050919050565b6000614577601083614b93565b9150614582826156cd565b602082019050919050565b61459681614d38565b82525050565b6145a581614d42565b82525050565b60006145b78285613fbf565b6014820191506145c7828461407d565b91508190509392505050565b60006145df82856140ae565b91506145eb828461407d565b91508190509392505050565b6000614602826141b9565b915061460e8284613ff4565b60208201915081905092915050565b60006020820190506146326000830184613fb0565b92915050565b600060808201905061464d6000830187613fb0565b61465a6020830186613fb0565b614667604083018561458d565b8181036060830152614679818461400b565b905095945050505050565b60006020820190506146996000830184613fd6565b92915050565b60006080820190506146b46000830187613fe5565b6146c1602083018661459c565b6146ce6040830185613fe5565b6146db6060830184613fe5565b95945050505050565b600060208201905081810360008301526146fe8184614044565b905092915050565b6000602082019050818103600083015261471f8161412d565b9050919050565b6000602082019050818103600083015261473f81614150565b9050919050565b6000602082019050818103600083015261475f81614173565b9050919050565b6000602082019050818103600083015261477f81614196565b9050919050565b6000602082019050818103600083015261479f816141dc565b9050919050565b600060208201905081810360008301526147bf816141ff565b9050919050565b600060208201905081810360008301526147df81614222565b9050919050565b600060208201905081810360008301526147ff81614245565b9050919050565b6000602082019050818103600083015261481f81614268565b9050919050565b6000602082019050818103600083015261483f8161428b565b9050919050565b6000602082019050818103600083015261485f816142ae565b9050919050565b6000602082019050818103600083015261487f816142d1565b9050919050565b6000602082019050818103600083015261489f816142f4565b9050919050565b600060208201905081810360008301526148bf81614317565b9050919050565b600060208201905081810360008301526148df8161433a565b9050919050565b600060208201905081810360008301526148ff8161435d565b9050919050565b6000602082019050818103600083015261491f81614380565b9050919050565b6000602082019050818103600083015261493f816143a3565b9050919050565b6000602082019050818103600083015261495f816143c6565b9050919050565b6000602082019050818103600083015261497f816143e9565b9050919050565b6000602082019050818103600083015261499f8161440c565b9050919050565b600060208201905081810360008301526149bf8161442f565b9050919050565b600060208201905081810360008301526149df81614452565b9050919050565b600060208201905081810360008301526149ff81614475565b9050919050565b60006020820190508181036000830152614a1f81614498565b9050919050565b60006020820190508181036000830152614a3f816144bb565b9050919050565b60006020820190508181036000830152614a5f816144de565b9050919050565b60006020820190508181036000830152614a7f81614501565b9050919050565b60006020820190508181036000830152614a9f81614524565b9050919050565b60006020820190508181036000830152614abf81614547565b9050919050565b60006020820190508181036000830152614adf8161456a565b9050919050565b6000602082019050614afb600083018461458d565b92915050565b6000614b0b614b1c565b9050614b178282614dc3565b919050565b6000604051905090565b600067ffffffffffffffff821115614b4157614b40614f29565b5b614b4a82614f58565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614bba82614d38565b9150614bc583614d38565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614bfa57614bf9614e9c565b5b828201905092915050565b6000614c1082614d38565b9150614c1b83614d38565b925082614c2b57614c2a614ecb565b5b828204905092915050565b6000614c4182614d38565b9150614c4c83614d38565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614c8557614c84614e9c565b5b828202905092915050565b6000614c9b82614d38565b9150614ca683614d38565b925082821015614cb957614cb8614e9c565b5b828203905092915050565b6000614ccf82614d18565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614d7c578082015181840152602081019050614d61565b83811115614d8b576000848401525b50505050565b60006002820490506001821680614da957607f821691505b60208210811415614dbd57614dbc614efa565b5b50919050565b614dcc82614f58565b810181811067ffffffffffffffff82111715614deb57614dea614f29565b5b80604052505050565b6000614dff82614d38565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614e3257614e31614e9c565b5b600182019050919050565b6000614e4882614e59565b9050919050565b6000819050919050565b6000614e6482614f69565b9050919050565b6000614e7682614d38565b9150614e8183614d38565b925082614e9157614e90614ecb565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f50524553414c455f434c4f534544000000000000000000000000000000000000600082015250565b7f4449524543545f4d494e545f444953414c4c4f57454400000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4558434545445f594554595f5045525f5055424c49435f4d494e540000000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4558434545445f594554595f5045525f505249564154455f4d494e5400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f53414c455f434c4f534544000000000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f436f6e7472616374206d65746164617461206d6574686f647320617265206c6f60008201527f636b656400000000000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f74207175657279206e6f6e2d6578697374656e7420746f6b656e00600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4558434545445f4d415800000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4558434545445f50524956415445000000000000000000000000000000000000600082015250565b7f494e53554646494349454e545f45544800000000000000000000000000000000600082015250565b6156ff81614cc4565b811461570a57600080fd5b50565b61571681614cd6565b811461572157600080fd5b50565b61572d81614cec565b811461573857600080fd5b50565b61574481614d38565b811461574f57600080fd5b5056fea264697066735822122014ce7b206af6020d3df58ee5f01d1ef89fea661dbc92afc26b8f64b96e00686c64736f6c63430008040033

Deployed Bytecode Sourcemap

55152:4635:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39030:300;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58735:96;;;;;;;;;;;;;:::i;:::-;;26271:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27964:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59164:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27487:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55439:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56553:275;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55347:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39833:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55392:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59057:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29023:376;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39414:343;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58359:160;;;;;;;;;;;;;:::i;:::-;;29470:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40023:320;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59420:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55886:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25878:326;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25521:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9444:94;;;;;;;;;;;;;:::i;:::-;;58618:105;;;;;;;;;;;;;:::i;:::-;;55927:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58946:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8793:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58839:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26440:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55310:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58531:75;;;;;;;;;;;;;:::i;:::-;;28344:327;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59293:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29726:365;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59540:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55270:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55984:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57110:476;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55957:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28742:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9693:229;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56836:266;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57594:757;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39030:300;39177:4;39234:35;39219:50;;;:11;:50;;;;:103;;;;39286:36;39310:11;39286:23;:36::i;:::-;39219:103;39199:123;;39030:300;;;:::o;58735:96::-;9024:12;:10;:12::i;:::-;9013:23;;:7;:5;:7::i;:::-;:23;;;9005:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56109:6:::1;;;;;;;;;;;56108:7;56100:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;58815:8:::2;;;;;;;;;;;58814:9;58803:8;;:20;;;;;;;;;;;;;;;;;;58735:96::o:0;26271:100::-;26325:13;26358:5;26351:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26271:100;:::o;27964:308::-;28085:7;28132:16;28140:7;28132;:16::i;:::-;28110:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;28240:15;:24;28256:7;28240:24;;;;;;;;;;;;;;;;;;;;;28233:31;;27964:308;;;:::o;59164:117::-;9024:12;:10;:12::i;:::-;9013:23;;:7;:5;:7::i;:::-;:23;;;9005:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56109:6:::1;;;;;;;;;;;56108:7;56100:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;59268:5:::2;59244:21;:29;;;;59164:117:::0;:::o;27487:411::-;27568:13;27584:23;27599:7;27584:14;:23::i;:::-;27568:39;;27632:5;27626:11;;:2;:11;;;;27618:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;27726:5;27710:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;27735:37;27752:5;27759:12;:10;:12::i;:::-;27735:16;:37::i;:::-;27710:62;27688:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;27869:21;27878:2;27882:7;27869:8;:21::i;:::-;27487:411;;;:::o;55439:40::-;;;;:::o;56553:275::-;9024:12;:10;:12::i;:::-;9013:23;;:7;:5;:7::i;:::-;:23;;;9005:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56671:8:::1;;56651:9;;:16;;56635:13;:11;:13::i;:::-;:32;;;;:::i;:::-;:44;;56627:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;56710:9;56705:116;56729:9;;:16;;56725:1;:20;56705:116;;;56767:42;56777:9;;56787:1;56777:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56807:1;56791:13;:11;:13::i;:::-;:17;;;;:::i;:::-;56767:9;:42::i;:::-;56747:3;;;;;:::i;:::-;;;;56705:116;;;;56553:275:::0;;:::o;55347:38::-;;;;:::o;39833:113::-;39894:7;39921:10;:17;;;;39914:24;;39833:113;:::o;55392:40::-;;;;:::o;59057:95::-;9024:12;:10;:12::i;:::-;9013:23;;:7;:5;:7::i;:::-;:23;;;9005:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56109:6:::1;;;;;;;;;;;56108:7;56100:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;59139:5:::2;59128:8;:16;;;;59057:95:::0;:::o;29023:376::-;29232:41;29251:12;:10;:12::i;:::-;29265:7;29232:18;:41::i;:::-;29210:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;29363:28;29373:4;29379:2;29383:7;29363:9;:28::i;:::-;29023:376;;;:::o;39414:343::-;39556:7;39611:23;39628:5;39611:16;:23::i;:::-;39603:5;:31;39581:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;39723:12;:19;39736:5;39723:19;;;;;;;;;;;;;;;:26;39743:5;39723:26;;;;;;;;;;;;39716:33;;39414:343;;;;:::o;58359:160::-;58407:7;;;;;;;;;;;58399:25;;:53;58449:2;58425:21;:26;;;;:::i;:::-;58399:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58471:7;;;;;;;;;;;58463:25;;:48;58489:21;58463:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58359:160::o;29470:185::-;29608:39;29625:4;29631:2;29635:7;29608:39;;;;;;;;;;;;:16;:39::i;:::-;29470:185;;;:::o;40023:320::-;40143:7;40198:30;:28;:30::i;:::-;40190:5;:38;40168:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;40318:10;40329:5;40318:17;;;;;;;;;;;;;;;;;;;;;;;;40311:24;;40023:320;;;:::o;59420:108::-;9024:12;:10;:12::i;:::-;9013:23;;:7;:5;:7::i;:::-;:23;;;9005:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56109:6:::1;;;;;;;;;;;56108:7;56100:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;59517:3:::2;;59501:13;:19;;;;;;;:::i;:::-;;59420:108:::0;;:::o;55886:34::-;;;;:::o;25878:326::-;25995:7;26020:13;26036:7;:16;26044:7;26036:16;;;;;;;;;;;;;;;;;;;;;26020:32;;26102:1;26085:19;;:5;:19;;;;26063:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;26191:5;26184:12;;;25878:326;;;:::o;25521:295::-;25638:7;25702:1;25685:19;;:5;:19;;;;25663:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25792:9;:16;25802:5;25792:16;;;;;;;;;;;;;;;;25785:23;;25521:295;;;:::o;9444:94::-;9024:12;:10;:12::i;:::-;9013:23;;:7;:5;:7::i;:::-;:23;;;9005:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9509:21:::1;9527:1;9509:9;:21::i;:::-;9444:94::o:0;58618:105::-;9024:12;:10;:12::i;:::-;9013:23;;:7;:5;:7::i;:::-;:23;;;9005:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56109:6:::1;;;;;;;;;;;56108:7;56100:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;58704:11:::2;;;;;;;;;;;58703:12;58689:11;;:26;;;;;;;;;;;;;;;;;;58618:105::o:0;55927:23::-;;;;;;;;;;;;;:::o;58946:103::-;9024:12;:10;:12::i;:::-;9013:23;;:7;:5;:7::i;:::-;:23;;;9005:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56109:6:::1;;;;;;;;;;;56108:7;56100:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;59036:5:::2;59021:12;:20;;;;58946:103:::0;:::o;8793:87::-;8839:7;8866:6;;;;;;;;;;;8859:13;;8793:87;:::o;58839:99::-;9024:12;:10;:12::i;:::-;9013:23;;:7;:5;:7::i;:::-;:23;;;9005:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56109:6:::1;;;;;;;;;;;56108:7;56100:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;58925:5:::2;58912:10;:18;;;;58839:99:::0;:::o;26440:104::-;26496:13;26529:7;26522:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26440:104;:::o;55310:30::-;;;;:::o;58531:75::-;9024:12;:10;:12::i;:::-;9013:23;;:7;:5;:7::i;:::-;:23;;;9005:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58594:4:::1;58585:6;;:13;;;;;;;;;;;;;;;;;;58531:75::o:0;28344:327::-;28491:12;:10;:12::i;:::-;28479:24;;:8;:24;;;;28471:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;28591:8;28546:18;:32;28565:12;:10;:12::i;:::-;28546:32;;;;;;;;;;;;;;;:42;28579:8;28546:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;28644:8;28615:48;;28630:12;:10;:12::i;:::-;28615:48;;;28654:8;28615:48;;;;;;:::i;:::-;;;;;;;;28344:327;;:::o;59293:115::-;9024:12;:10;:12::i;:::-;9013:23;;:7;:5;:7::i;:::-;:23;;;9005:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56109:6:::1;;;;;;;;;;;56108:7;56100:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;59395:5:::2;59372:20;:28;;;;59293:115:::0;:::o;29726:365::-;29915:41;29934:12;:10;:12::i;:::-;29948:7;29915:18;:41::i;:::-;29893:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;30044:39;30058:4;30064:2;30068:7;30077:5;30044:13;:39::i;:::-;29726:365;;;;:::o;59540:244::-;59613:13;59647:16;59655:7;59647;:16::i;:::-;59639:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;59741:13;59756:18;:7;:16;:18::i;:::-;59724:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59710:66;;59540:244;;;:::o;55270:33::-;;;;:::o;55984:18::-;;;;;;;;;;;;;:::o;57110:476::-;57182:8;;;;;;;;;;;57174:32;;;;;;;;;;;;:::i;:::-;;;;;;;;;57258:8;;57241:13;57225;:11;:13::i;:::-;:29;;;;:::i;:::-;:41;;57217:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;57317:20;;57300:13;:37;;57292:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;57418:9;57401:13;57388:10;;:26;;;;:::i;:::-;:39;;57380:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57473:9;57469:110;57492:13;57488:1;:17;57469:110;;;57527:40;57537:10;57565:1;57549:13;:11;:13::i;:::-;:17;;;;:::i;:::-;57527:9;:40::i;:::-;57507:3;;;;;:::i;:::-;;;;57469:110;;;;57110:476;:::o;55957:20::-;;;;;;;;;;;;;:::o;28742:214::-;28884:4;28913:18;:25;28932:5;28913:25;;;;;;;;;;;;;;;:35;28939:8;28913:35;;;;;;;;;;;;;;;;;;;;;;;;;28906:42;;28742:214;;;;:::o;9693:229::-;9024:12;:10;:12::i;:::-;9013:23;;:7;:5;:7::i;:::-;:23;;;9005:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9816:1:::1;9796:22;;:8;:22;;;;9774:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;9895:19;9905:8;9895:9;:19::i;:::-;9693:229:::0;:::o;56836:266::-;9024:12;:10;:12::i;:::-;9013:23;;:7;:5;:7::i;:::-;:23;;;9005:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56951:8:::1;;56934:13;56918;:11;:13::i;:::-;:29;;;;:::i;:::-;:41;;56910:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;56989:9;56985:110;57008:13;57004:1;:17;56985:110;;;57043:40;57053:10;57081:1;57065:13;:11;:13::i;:::-;:17;;;;:::i;:::-;57043:9;:40::i;:::-;57023:3;;;;;:::i;:::-;;;;56985:110;;;;56836:266:::0;:::o;57594:757::-;57697:11;;;;;;;;;;;57689:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;57746:70;57764:9;57775:16;;;;;;;;;;;;;;;;;57793:22;;;;;;;;;;;57746:17;:70::i;:::-;57738:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;57901:12;;57884:13;57862:19;;:35;;;;:::i;:::-;:51;;57854:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;57984:8;;57967:13;57951;:11;:13::i;:::-;:29;;;;:::i;:::-;:41;;57943:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;58043:21;;58026:13;:38;;58018:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;58146:9;58129:13;58116:10;;:26;;;;:::i;:::-;:39;;58108:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58202:9;58197:147;58221:13;58217:1;:17;58197:147;;;58256:19;;:21;;;;;;;;;:::i;:::-;;;;;;58292:40;58302:10;58330:1;58314:13;:11;:13::i;:::-;:17;;;;:::i;:::-;58292:9;:40::i;:::-;58236:3;;;;;:::i;:::-;;;;58197:147;;;;57594:757;;:::o;25102:355::-;25249:4;25306:25;25291:40;;;:11;:40;;;;:105;;;;25363:33;25348:48;;;:11;:48;;;;25291:105;:158;;;;25413:36;25437:11;25413:23;:36::i;:::-;25291:158;25271:178;;25102:355;;;:::o;1950:98::-;2003:7;2030:10;2023:17;;1950:98;:::o;31638:127::-;31703:4;31755:1;31727:30;;:7;:16;31735:7;31727:16;;;;;;;;;;;;;;;;;;;;;:30;;;;31720:37;;31638:127;;;:::o;35761:174::-;35863:2;35836:15;:24;35852:7;35836:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;35919:7;35915:2;35881:46;;35890:23;35905:7;35890:14;:23::i;:::-;35881:46;;;;;;;;;;;;35761:174;;:::o;32726:110::-;32802:26;32812:2;32816:7;32802:26;;;;;;;;;;;;:9;:26::i;:::-;32726:110;;:::o;31932:452::-;32061:4;32105:16;32113:7;32105;:16::i;:::-;32083:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;32204:13;32220:23;32235:7;32220:14;:23::i;:::-;32204:39;;32273:5;32262:16;;:7;:16;;;:64;;;;32319:7;32295:31;;:20;32307:7;32295:11;:20::i;:::-;:31;;;32262:64;:113;;;;32343:32;32360:5;32367:7;32343:16;:32::i;:::-;32262:113;32254:122;;;31932:452;;;;:::o;35028:615::-;35201:4;35174:31;;:23;35189:7;35174:14;:23::i;:::-;:31;;;35152:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;35307:1;35293:16;;:2;:16;;;;35285:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;35363:39;35384:4;35390:2;35394:7;35363:20;:39::i;:::-;35467:29;35484:1;35488:7;35467:8;:29::i;:::-;35528:1;35509:9;:15;35519:4;35509:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;35557:1;35540:9;:13;35550:2;35540:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;35588:2;35569:7;:16;35577:7;35569:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35627:7;35623:2;35608:27;;35617:4;35608:27;;;;;;;;;;;;35028:615;;;:::o;9930:173::-;9986:16;10005:6;;;;;;;;;;;9986:25;;10031:8;10022:6;;:17;;;;;;;;;;;;;;;;;;10086:8;10055:40;;10076:8;10055:40;;;;;;;;;;;;9930:173;;:::o;30973:352::-;31130:28;31140:4;31146:2;31150:7;31130:9;:28::i;:::-;31191:48;31214:4;31220:2;31224:7;31233:5;31191:22;:48::i;:::-;31169:148;;;;;;;;;;;;:::i;:::-;;;;;;;;;30973:352;;;;:::o;12232:723::-;12288:13;12518:1;12509:5;:10;12505:53;;;12536:10;;;;;;;;;;;;;;;;;;;;;12505:53;12568:12;12583:5;12568:20;;12599:14;12624:78;12639:1;12631:4;:9;12624:78;;12657:8;;;;;:::i;:::-;;;;12688:2;12680:10;;;;;:::i;:::-;;;12624:78;;;12712:19;12744:6;12734:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12712:39;;12762:154;12778:1;12769:5;:10;12762:154;;12806:1;12796:11;;;;;:::i;:::-;;;12873:2;12865:5;:10;;;;:::i;:::-;12852:2;:24;;;;:::i;:::-;12839:39;;12822:6;12829;12822:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;12902:2;12893:11;;;;;:::i;:::-;;;12762:154;;;12940:6;12926:21;;;;;12232:723;;;;:::o;56188:357::-;56299:4;56317:12;56449:10;56461:9;56432:39;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56422:50;;;;;;56342:131;;;;;;;;:::i;:::-;;;;;;;;;;;;;56332:154;;;;;;56317:169;;56514:23;56527:9;56514:4;:12;;:23;;;;:::i;:::-;56504:33;;:6;:33;;;56497:40;;;56188:357;;;;;:::o;11765:207::-;11895:4;11939:25;11924:40;;;:11;:40;;;;11917:47;;11765:207;;;:::o;33063:321::-;33193:18;33199:2;33203:7;33193:5;:18::i;:::-;33244:54;33275:1;33279:2;33283:7;33292:5;33244:22;:54::i;:::-;33222:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;33063:321;;;:::o;40956:589::-;41100:45;41127:4;41133:2;41137:7;41100:26;:45::i;:::-;41178:1;41162:18;;:4;:18;;;41158:187;;;41197:40;41229:7;41197:31;:40::i;:::-;41158:187;;;41267:2;41259:10;;:4;:10;;;41255:90;;41286:47;41319:4;41325:7;41286:32;:47::i;:::-;41255:90;41158:187;41373:1;41359:16;;:2;:16;;;41355:183;;;41392:45;41429:7;41392:36;:45::i;:::-;41355:183;;;41465:4;41459:10;;:2;:10;;;41455:83;;41486:40;41514:2;41518:7;41486:27;:40::i;:::-;41455:83;41355:183;40956:589;;;:::o;36500:984::-;36655:4;36676:15;:2;:13;;;:15::i;:::-;36672:805;;;36745:2;36729:36;;;36788:12;:10;:12::i;:::-;36823:4;36850:7;36880:5;36729:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36708:714;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37108:1;37091:6;:13;:18;37087:320;;;37134:108;;;;;;;;;;:::i;:::-;;;;;;;;37087:320;37357:6;37351:13;37342:6;37338:2;37334:15;37327:38;36708:714;36978:45;;;36968:55;;;:6;:55;;;;36961:62;;;;;36672:805;37461:4;37454:11;;36500:984;;;;;;;:::o;49708:231::-;49786:7;49807:17;49826:18;49848:27;49859:4;49865:9;49848:10;:27::i;:::-;49806:69;;;;49886:18;49898:5;49886:11;:18::i;:::-;49922:9;49915:16;;;;49708:231;;;;:::o;33720:382::-;33814:1;33800:16;;:2;:16;;;;33792:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;33873:16;33881:7;33873;:16::i;:::-;33872:17;33864:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;33935:45;33964:1;33968:2;33972:7;33935:20;:45::i;:::-;34010:1;33993:9;:13;34003:2;33993:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34041:2;34022:7;:16;34030:7;34022:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34086:7;34082:2;34061:33;;34078:1;34061:33;;;;;;;;;;;;33720:382;;:::o;38056:126::-;;;;:::o;42268:164::-;42372:10;:17;;;;42345:15;:24;42361:7;42345:24;;;;;;;;;;;:44;;;;42400:10;42416:7;42400:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42268:164;:::o;43059:1002::-;43339:22;43389:1;43364:22;43381:4;43364:16;:22::i;:::-;:26;;;;:::i;:::-;43339:51;;43401:18;43422:17;:26;43440:7;43422:26;;;;;;;;;;;;43401:47;;43569:14;43555:10;:28;43551:328;;43600:19;43622:12;:18;43635:4;43622:18;;;;;;;;;;;;;;;:34;43641:14;43622:34;;;;;;;;;;;;43600:56;;43706:11;43673:12;:18;43686:4;43673:18;;;;;;;;;;;;;;;:30;43692:10;43673:30;;;;;;;;;;;:44;;;;43823:10;43790:17;:30;43808:11;43790:30;;;;;;;;;;;:43;;;;43551:328;;43975:17;:26;43993:7;43975:26;;;;;;;;;;;43968:33;;;44019:12;:18;44032:4;44019:18;;;;;;;;;;;;;;;:34;44038:14;44019:34;;;;;;;;;;;44012:41;;;43059:1002;;;;:::o;44356:1079::-;44609:22;44654:1;44634:10;:17;;;;:21;;;;:::i;:::-;44609:46;;44666:18;44687:15;:24;44703:7;44687:24;;;;;;;;;;;;44666:45;;45038:19;45060:10;45071:14;45060:26;;;;;;;;;;;;;;;;;;;;;;;;45038:48;;45124:11;45099:10;45110;45099:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;45235:10;45204:15;:28;45220:11;45204:28;;;;;;;;;;;:41;;;;45376:15;:24;45392:7;45376:24;;;;;;;;;;;45369:31;;;45411:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44356:1079;;;;:::o;41846:221::-;41931:14;41948:20;41965:2;41948:16;:20::i;:::-;41931:37;;42006:7;41979:12;:16;41992:2;41979:16;;;;;;;;;;;;;;;:24;41996:6;41979:24;;;;;;;;;;;:34;;;;42053:6;42024:17;:26;42042:7;42024:26;;;;;;;;;;;:35;;;;41846:221;;;:::o;14731:387::-;14791:4;14999:12;15066:7;15054:20;15046:28;;15109:1;15102:4;:8;15095:15;;;14731:387;;;:::o;47598:1308::-;47679:7;47688:12;47933:2;47913:9;:16;:22;47909:990;;;47952:9;47976;48000:7;48209:4;48198:9;48194:20;48188:27;48183:32;;48259:4;48248:9;48244:20;48238:27;48233:32;;48317:4;48306:9;48302:20;48296:27;48293:1;48288:36;48283:41;;48360:25;48371:4;48377:1;48380;48383;48360:10;:25::i;:::-;48353:32;;;;;;;;;47909:990;48427:2;48407:9;:16;:22;48403:496;;;48446:9;48470:10;48682:4;48671:9;48667:20;48661:27;48656:32;;48733:4;48722:9;48718:20;48712:27;48706:33;;48775:23;48786:4;48792:1;48795:2;48775:10;:23::i;:::-;48768:30;;;;;;;;48403:496;48847:1;48851:35;48831:56;;;;47598:1308;;;;;;:::o;45869:643::-;45947:20;45938:29;;;;;;;;;;;;;;;;:5;:29;;;;;;;;;;;;;;;;;45934:571;;;45984:7;;45934:571;46045:29;46036:38;;;;;;;;;;;;;;;;:5;:38;;;;;;;;;;;;;;;;;46032:473;;;46091:34;;;;;;;;;;:::i;:::-;;;;;;;;46032:473;46156:35;46147:44;;;;;;;;;;;;;;;;:5;:44;;;;;;;;;;;;;;;;;46143:362;;;46208:41;;;;;;;;;;:::i;:::-;;;;;;;;46143:362;46280:30;46271:39;;;;;;;;;;;;;;;;:5;:39;;;;;;;;;;;;;;;;;46267:238;;;46327:44;;;;;;;;;;:::i;:::-;;;;;;;;46267:238;46402:30;46393:39;;;;;;;;;;;;;;;;:5;:39;;;;;;;;;;;;;;;;;46389:116;;;46449:44;;;;;;;;;;:::i;:::-;;;;;;;;46389:116;45869:643;;:::o;51207:1632::-;51338:7;51347:12;52272:66;52267:1;52259:10;;:79;52255:163;;;52371:1;52375:30;52355:51;;;;;;52255:163;52437:2;52432:1;:7;;;;:18;;;;;52448:2;52443:1;:7;;;;52432:18;52428:102;;;52483:1;52487:30;52467:51;;;;;;52428:102;52627:14;52644:24;52654:4;52660:1;52663;52666;52644:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52627:41;;52701:1;52683:20;;:6;:20;;;52679:103;;;52736:1;52740:29;52720:50;;;;;;;52679:103;52802:6;52810:20;52794:37;;;;;51207:1632;;;;;;;;:::o;50202:391::-;50316:7;50325:12;50350:9;50370:7;50425:66;50421:2;50417:75;50412:80;;50529:2;50524;50519:3;50515:12;50511:21;50506:26;;50560:25;50571:4;50577:1;50580;50583;50560:10;:25::i;:::-;50553:32;;;;;;50202:391;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343: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:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:139::-;402:5;440:6;427:20;418:29;;456:33;483:5;456:33;:::i;:::-;408:87;;;;:::o;518:367::-;591:8;601:6;651:3;644:4;636:6;632:17;628:27;618:2;;669:1;666;659:12;618:2;705:6;692:20;682:30;;735:18;727:6;724:30;721:2;;;767:1;764;757:12;721:2;804:4;796:6;792:17;780:29;;858:3;850:4;842:6;838:17;828:8;824:32;821:41;818:2;;;875:1;872;865:12;818:2;608:277;;;;;:::o;891:133::-;934:5;972:6;959:20;950:29;;988:30;1012:5;988:30;:::i;:::-;940:84;;;;:::o;1030:137::-;1075:5;1113:6;1100:20;1091:29;;1129:32;1155:5;1129:32;:::i;:::-;1081:86;;;;:::o;1173:141::-;1229:5;1260:6;1254:13;1245:22;;1276:32;1302:5;1276:32;:::i;:::-;1235:79;;;;:::o;1333:271::-;1388:5;1437:3;1430:4;1422:6;1418:17;1414:27;1404:2;;1455:1;1452;1445:12;1404:2;1495:6;1482:20;1520:78;1594:3;1586:6;1579:4;1571:6;1567:17;1520:78;:::i;:::-;1511:87;;1394:210;;;;;:::o;1624:352::-;1682:8;1692:6;1742:3;1735:4;1727:6;1723:17;1719:27;1709:2;;1760:1;1757;1750:12;1709:2;1796:6;1783:20;1773:30;;1826:18;1818:6;1815:30;1812:2;;;1858:1;1855;1848:12;1812:2;1895:4;1887:6;1883:17;1871:29;;1949:3;1941:4;1933:6;1929:17;1919:8;1915:32;1912:41;1909:2;;;1966:1;1963;1956:12;1909:2;1699:277;;;;;:::o;1982:139::-;2028:5;2066:6;2053:20;2044:29;;2082:33;2109:5;2082:33;:::i;:::-;2034:87;;;;:::o;2127:262::-;2186:6;2235:2;2223:9;2214:7;2210:23;2206:32;2203:2;;;2251:1;2248;2241:12;2203:2;2294:1;2319:53;2364:7;2355:6;2344:9;2340:22;2319:53;:::i;:::-;2309:63;;2265:117;2193:196;;;;:::o;2395:407::-;2463:6;2471;2520:2;2508:9;2499:7;2495:23;2491:32;2488:2;;;2536:1;2533;2526:12;2488:2;2579:1;2604:53;2649:7;2640:6;2629:9;2625:22;2604:53;:::i;:::-;2594:63;;2550:117;2706:2;2732:53;2777:7;2768:6;2757:9;2753:22;2732:53;:::i;:::-;2722:63;;2677:118;2478:324;;;;;:::o;2808:552::-;2885:6;2893;2901;2950:2;2938:9;2929:7;2925:23;2921:32;2918:2;;;2966:1;2963;2956:12;2918:2;3009:1;3034:53;3079:7;3070:6;3059:9;3055:22;3034:53;:::i;:::-;3024:63;;2980:117;3136:2;3162:53;3207:7;3198:6;3187:9;3183:22;3162:53;:::i;:::-;3152:63;;3107:118;3264:2;3290:53;3335:7;3326:6;3315:9;3311:22;3290:53;:::i;:::-;3280:63;;3235:118;2908:452;;;;;:::o;3366:809::-;3461:6;3469;3477;3485;3534:3;3522:9;3513:7;3509:23;3505:33;3502:2;;;3551:1;3548;3541:12;3502:2;3594:1;3619:53;3664:7;3655:6;3644:9;3640:22;3619:53;:::i;:::-;3609:63;;3565:117;3721:2;3747:53;3792:7;3783:6;3772:9;3768:22;3747:53;:::i;:::-;3737:63;;3692:118;3849:2;3875:53;3920:7;3911:6;3900:9;3896:22;3875:53;:::i;:::-;3865:63;;3820:118;4005:2;3994:9;3990:18;3977:32;4036:18;4028:6;4025:30;4022:2;;;4068:1;4065;4058:12;4022:2;4096:62;4150:7;4141:6;4130:9;4126:22;4096:62;:::i;:::-;4086:72;;3948:220;3492:683;;;;;;;:::o;4181:401::-;4246:6;4254;4303:2;4291:9;4282:7;4278:23;4274:32;4271:2;;;4319:1;4316;4309:12;4271:2;4362:1;4387:53;4432:7;4423:6;4412:9;4408:22;4387:53;:::i;:::-;4377:63;;4333:117;4489:2;4515:50;4557:7;4548:6;4537:9;4533:22;4515:50;:::i;:::-;4505:60;;4460:115;4261:321;;;;;:::o;4588:407::-;4656:6;4664;4713:2;4701:9;4692:7;4688:23;4684:32;4681:2;;;4729:1;4726;4719:12;4681:2;4772:1;4797:53;4842:7;4833:6;4822:9;4818:22;4797:53;:::i;:::-;4787:63;;4743:117;4899:2;4925:53;4970:7;4961:6;4950:9;4946:22;4925:53;:::i;:::-;4915:63;;4870:118;4671:324;;;;;:::o;5001:425::-;5087:6;5095;5144:2;5132:9;5123:7;5119:23;5115:32;5112:2;;;5160:1;5157;5150:12;5112:2;5231:1;5220:9;5216:17;5203:31;5261:18;5253:6;5250:30;5247:2;;;5293:1;5290;5283:12;5247:2;5329:80;5401:7;5392:6;5381:9;5377:22;5329:80;:::i;:::-;5311:98;;;;5174:245;5102:324;;;;;:::o;5432:260::-;5490:6;5539:2;5527:9;5518:7;5514:23;5510:32;5507:2;;;5555:1;5552;5545:12;5507:2;5598:1;5623:52;5667:7;5658:6;5647:9;5643:22;5623:52;:::i;:::-;5613:62;;5569:116;5497:195;;;;:::o;5698:282::-;5767:6;5816:2;5804:9;5795:7;5791:23;5787:32;5784:2;;;5832:1;5829;5822:12;5784:2;5875:1;5900:63;5955:7;5946:6;5935:9;5931:22;5900:63;:::i;:::-;5890:73;;5846:127;5774:206;;;;:::o;5986:518::-;6063:6;6071;6120:2;6108:9;6099:7;6095:23;6091:32;6088:2;;;6136:1;6133;6126:12;6088:2;6207:1;6196:9;6192:17;6179:31;6237:18;6229:6;6226:30;6223:2;;;6269:1;6266;6259:12;6223:2;6297:62;6351:7;6342:6;6331:9;6327:22;6297:62;:::i;:::-;6287:72;;6150:219;6408:2;6434:53;6479:7;6470:6;6459:9;6455:22;6434:53;:::i;:::-;6424:63;;6379:118;6078:426;;;;;:::o;6510:395::-;6581:6;6589;6638:2;6626:9;6617:7;6613:23;6609:32;6606:2;;;6654:1;6651;6644:12;6606:2;6725:1;6714:9;6710:17;6697:31;6755:18;6747:6;6744:30;6741:2;;;6787:1;6784;6777:12;6741:2;6823:65;6880:7;6871:6;6860:9;6856:22;6823:65;:::i;:::-;6805:83;;;;6668:230;6596:309;;;;;:::o;6911:262::-;6970:6;7019:2;7007:9;6998:7;6994:23;6990:32;6987:2;;;7035:1;7032;7025:12;6987:2;7078:1;7103:53;7148:7;7139:6;7128:9;7124:22;7103:53;:::i;:::-;7093:63;;7049:117;6977:196;;;;:::o;7179:118::-;7266:24;7284:5;7266:24;:::i;:::-;7261:3;7254:37;7244:53;;:::o;7303:157::-;7408:45;7428:24;7446:5;7428:24;:::i;:::-;7408:45;:::i;:::-;7403:3;7396:58;7386:74;;:::o;7466:109::-;7547:21;7562:5;7547:21;:::i;:::-;7542:3;7535:34;7525:50;;:::o;7581:118::-;7668:24;7686:5;7668:24;:::i;:::-;7663:3;7656:37;7646:53;;:::o;7705:157::-;7810:45;7830:24;7848:5;7830:24;:::i;:::-;7810:45;:::i;:::-;7805:3;7798:58;7788:74;;:::o;7868:360::-;7954:3;7982:38;8014:5;7982:38;:::i;:::-;8036:70;8099:6;8094:3;8036:70;:::i;:::-;8029:77;;8115:52;8160:6;8155:3;8148:4;8141:5;8137:16;8115:52;:::i;:::-;8192:29;8214:6;8192:29;:::i;:::-;8187:3;8183:39;8176:46;;7958:270;;;;;:::o;8234:364::-;8322:3;8350:39;8383:5;8350:39;:::i;:::-;8405:71;8469:6;8464:3;8405:71;:::i;:::-;8398:78;;8485:52;8530:6;8525:3;8518:4;8511:5;8507:16;8485:52;:::i;:::-;8562:29;8584:6;8562:29;:::i;:::-;8557:3;8553:39;8546:46;;8326:272;;;;;:::o;8604:377::-;8710:3;8738:39;8771:5;8738:39;:::i;:::-;8793:89;8875:6;8870:3;8793:89;:::i;:::-;8786:96;;8891:52;8936:6;8931:3;8924:4;8917:5;8913:16;8891:52;:::i;:::-;8968:6;8963:3;8959:16;8952:23;;8714:267;;;;;:::o;9011:845::-;9114:3;9151:5;9145:12;9180:36;9206:9;9180:36;:::i;:::-;9232:89;9314:6;9309:3;9232:89;:::i;:::-;9225:96;;9352:1;9341:9;9337:17;9368:1;9363:137;;;;9514:1;9509:341;;;;9330:520;;9363:137;9447:4;9443:9;9432;9428:25;9423:3;9416:38;9483:6;9478:3;9474:16;9467:23;;9363:137;;9509:341;9576:38;9608:5;9576:38;:::i;:::-;9636:1;9650:154;9664:6;9661:1;9658:13;9650:154;;;9738:7;9732:14;9728:1;9723:3;9719:11;9712:35;9788:1;9779:7;9775:15;9764:26;;9686:4;9683:1;9679:12;9674:17;;9650:154;;;9833:6;9828:3;9824:16;9817:23;;9516:334;;9330:520;;9118:738;;;;;;:::o;9862:366::-;10004:3;10025:67;10089:2;10084:3;10025:67;:::i;:::-;10018:74;;10101:93;10190:3;10101:93;:::i;:::-;10219:2;10214:3;10210:12;10203:19;;10008:220;;;:::o;10234:366::-;10376:3;10397:67;10461:2;10456:3;10397:67;:::i;:::-;10390:74;;10473:93;10562:3;10473:93;:::i;:::-;10591:2;10586:3;10582:12;10575:19;;10380:220;;;:::o;10606:366::-;10748:3;10769:67;10833:2;10828:3;10769:67;:::i;:::-;10762:74;;10845:93;10934:3;10845:93;:::i;:::-;10963:2;10958:3;10954:12;10947:19;;10752:220;;;:::o;10978:366::-;11120:3;11141:67;11205:2;11200:3;11141:67;:::i;:::-;11134:74;;11217:93;11306:3;11217:93;:::i;:::-;11335:2;11330:3;11326:12;11319:19;;11124:220;;;:::o;11350:402::-;11510:3;11531:85;11613:2;11608:3;11531:85;:::i;:::-;11524:92;;11625:93;11714:3;11625:93;:::i;:::-;11743:2;11738:3;11734:12;11727:19;;11514:238;;;:::o;11758:366::-;11900:3;11921:67;11985:2;11980:3;11921:67;:::i;:::-;11914:74;;11997:93;12086:3;11997:93;:::i;:::-;12115:2;12110:3;12106:12;12099:19;;11904:220;;;:::o;12130:366::-;12272:3;12293:67;12357:2;12352:3;12293:67;:::i;:::-;12286:74;;12369:93;12458:3;12369:93;:::i;:::-;12487:2;12482:3;12478:12;12471:19;;12276:220;;;:::o;12502:366::-;12644:3;12665:67;12729:2;12724:3;12665:67;:::i;:::-;12658:74;;12741:93;12830:3;12741:93;:::i;:::-;12859:2;12854:3;12850:12;12843:19;;12648:220;;;:::o;12874:366::-;13016:3;13037:67;13101:2;13096:3;13037:67;:::i;:::-;13030:74;;13113:93;13202:3;13113:93;:::i;:::-;13231:2;13226:3;13222:12;13215:19;;13020:220;;;:::o;13246:366::-;13388:3;13409:67;13473:2;13468:3;13409:67;:::i;:::-;13402:74;;13485:93;13574:3;13485:93;:::i;:::-;13603:2;13598:3;13594:12;13587:19;;13392:220;;;:::o;13618:366::-;13760:3;13781:67;13845:2;13840:3;13781:67;:::i;:::-;13774:74;;13857:93;13946:3;13857:93;:::i;:::-;13975:2;13970:3;13966:12;13959:19;;13764:220;;;:::o;13990:366::-;14132:3;14153:67;14217:2;14212:3;14153:67;:::i;:::-;14146:74;;14229:93;14318:3;14229:93;:::i;:::-;14347:2;14342:3;14338:12;14331:19;;14136:220;;;:::o;14362:366::-;14504:3;14525:67;14589:2;14584:3;14525:67;:::i;:::-;14518:74;;14601:93;14690:3;14601:93;:::i;:::-;14719:2;14714:3;14710:12;14703:19;;14508:220;;;:::o;14734:366::-;14876:3;14897:67;14961:2;14956:3;14897:67;:::i;:::-;14890:74;;14973:93;15062:3;14973:93;:::i;:::-;15091:2;15086:3;15082:12;15075:19;;14880:220;;;:::o;15106:366::-;15248:3;15269:67;15333:2;15328:3;15269:67;:::i;:::-;15262:74;;15345:93;15434:3;15345:93;:::i;:::-;15463:2;15458:3;15454:12;15447:19;;15252:220;;;:::o;15478:366::-;15620:3;15641:67;15705:2;15700:3;15641:67;:::i;:::-;15634:74;;15717:93;15806:3;15717:93;:::i;:::-;15835:2;15830:3;15826:12;15819:19;;15624:220;;;:::o;15850:366::-;15992:3;16013:67;16077:2;16072:3;16013:67;:::i;:::-;16006:74;;16089:93;16178:3;16089:93;:::i;:::-;16207:2;16202:3;16198:12;16191:19;;15996:220;;;:::o;16222:366::-;16364:3;16385:67;16449:2;16444:3;16385:67;:::i;:::-;16378:74;;16461:93;16550:3;16461:93;:::i;:::-;16579:2;16574:3;16570:12;16563:19;;16368:220;;;:::o;16594:366::-;16736:3;16757:67;16821:2;16816:3;16757:67;:::i;:::-;16750:74;;16833:93;16922:3;16833:93;:::i;:::-;16951:2;16946:3;16942:12;16935:19;;16740:220;;;:::o;16966:366::-;17108:3;17129:67;17193:2;17188:3;17129:67;:::i;:::-;17122:74;;17205:93;17294:3;17205:93;:::i;:::-;17323:2;17318:3;17314:12;17307:19;;17112:220;;;:::o;17338:366::-;17480:3;17501:67;17565:2;17560:3;17501:67;:::i;:::-;17494:74;;17577:93;17666:3;17577:93;:::i;:::-;17695:2;17690:3;17686:12;17679:19;;17484:220;;;:::o;17710:366::-;17852:3;17873:67;17937:2;17932:3;17873:67;:::i;:::-;17866:74;;17949:93;18038:3;17949:93;:::i;:::-;18067:2;18062:3;18058:12;18051:19;;17856:220;;;:::o;18082:366::-;18224:3;18245:67;18309:2;18304:3;18245:67;:::i;:::-;18238:74;;18321:93;18410:3;18321:93;:::i;:::-;18439:2;18434:3;18430:12;18423:19;;18228:220;;;:::o;18454:366::-;18596:3;18617:67;18681:2;18676:3;18617:67;:::i;:::-;18610:74;;18693:93;18782:3;18693:93;:::i;:::-;18811:2;18806:3;18802:12;18795:19;;18600:220;;;:::o;18826:366::-;18968:3;18989:67;19053:2;19048:3;18989:67;:::i;:::-;18982:74;;19065:93;19154:3;19065:93;:::i;:::-;19183:2;19178:3;19174:12;19167:19;;18972:220;;;:::o;19198:366::-;19340:3;19361:67;19425:2;19420:3;19361:67;:::i;:::-;19354:74;;19437:93;19526:3;19437:93;:::i;:::-;19555:2;19550:3;19546:12;19539:19;;19344:220;;;:::o;19570:366::-;19712:3;19733:67;19797:2;19792:3;19733:67;:::i;:::-;19726:74;;19809:93;19898:3;19809:93;:::i;:::-;19927:2;19922:3;19918:12;19911:19;;19716:220;;;:::o;19942:366::-;20084:3;20105:67;20169:2;20164:3;20105:67;:::i;:::-;20098:74;;20181:93;20270:3;20181:93;:::i;:::-;20299:2;20294:3;20290:12;20283:19;;20088:220;;;:::o;20314:366::-;20456:3;20477:67;20541:2;20536:3;20477:67;:::i;:::-;20470:74;;20553:93;20642:3;20553:93;:::i;:::-;20671:2;20666:3;20662:12;20655:19;;20460:220;;;:::o;20686:366::-;20828:3;20849:67;20913:2;20908:3;20849:67;:::i;:::-;20842:74;;20925:93;21014:3;20925:93;:::i;:::-;21043:2;21038:3;21034:12;21027:19;;20832:220;;;:::o;21058:366::-;21200:3;21221:67;21285:2;21280:3;21221:67;:::i;:::-;21214:74;;21297:93;21386:3;21297:93;:::i;:::-;21415:2;21410:3;21406:12;21399:19;;21204:220;;;:::o;21430:366::-;21572:3;21593:67;21657:2;21652:3;21593:67;:::i;:::-;21586:74;;21669:93;21758:3;21669:93;:::i;:::-;21787:2;21782:3;21778:12;21771:19;;21576:220;;;:::o;21802:118::-;21889:24;21907:5;21889:24;:::i;:::-;21884:3;21877:37;21867:53;;:::o;21926:112::-;22009:22;22025:5;22009:22;:::i;:::-;22004:3;21997:35;21987:51;;:::o;22044:416::-;22204:3;22219:75;22290:3;22281:6;22219:75;:::i;:::-;22319:2;22314:3;22310:12;22303:19;;22339:95;22430:3;22421:6;22339:95;:::i;:::-;22332:102;;22451:3;22444:10;;22208:252;;;;;:::o;22466:429::-;22643:3;22665:92;22753:3;22744:6;22665:92;:::i;:::-;22658:99;;22774:95;22865:3;22856:6;22774:95;:::i;:::-;22767:102;;22886:3;22879:10;;22647:248;;;;;:::o;22901:522::-;23114:3;23136:148;23280:3;23136:148;:::i;:::-;23129:155;;23294:75;23365:3;23356:6;23294:75;:::i;:::-;23394:2;23389:3;23385:12;23378:19;;23414:3;23407:10;;23118:305;;;;:::o;23429:222::-;23522:4;23560:2;23549:9;23545:18;23537:26;;23573:71;23641:1;23630:9;23626:17;23617:6;23573:71;:::i;:::-;23527:124;;;;:::o;23657:640::-;23852:4;23890:3;23879:9;23875:19;23867:27;;23904:71;23972:1;23961:9;23957:17;23948:6;23904:71;:::i;:::-;23985:72;24053:2;24042:9;24038:18;24029:6;23985:72;:::i;:::-;24067;24135:2;24124:9;24120:18;24111:6;24067:72;:::i;:::-;24186:9;24180:4;24176:20;24171:2;24160:9;24156:18;24149:48;24214:76;24285:4;24276:6;24214:76;:::i;:::-;24206:84;;23857:440;;;;;;;:::o;24303:210::-;24390:4;24428:2;24417:9;24413:18;24405:26;;24441:65;24503:1;24492:9;24488:17;24479:6;24441:65;:::i;:::-;24395:118;;;;:::o;24519:545::-;24692:4;24730:3;24719:9;24715:19;24707:27;;24744:71;24812:1;24801:9;24797:17;24788:6;24744:71;:::i;:::-;24825:68;24889:2;24878:9;24874:18;24865:6;24825:68;:::i;:::-;24903:72;24971:2;24960:9;24956:18;24947:6;24903:72;:::i;:::-;24985;25053:2;25042:9;25038:18;25029:6;24985:72;:::i;:::-;24697:367;;;;;;;:::o;25070:313::-;25183:4;25221:2;25210:9;25206:18;25198:26;;25270:9;25264:4;25260:20;25256:1;25245:9;25241:17;25234:47;25298:78;25371:4;25362:6;25298:78;:::i;:::-;25290:86;;25188:195;;;;:::o;25389:419::-;25555:4;25593:2;25582:9;25578:18;25570:26;;25642:9;25636:4;25632:20;25628:1;25617:9;25613:17;25606:47;25670:131;25796:4;25670:131;:::i;:::-;25662:139;;25560:248;;;:::o;25814:419::-;25980:4;26018:2;26007:9;26003:18;25995:26;;26067:9;26061:4;26057:20;26053:1;26042:9;26038:17;26031:47;26095:131;26221:4;26095:131;:::i;:::-;26087:139;;25985:248;;;:::o;26239:419::-;26405:4;26443:2;26432:9;26428:18;26420:26;;26492:9;26486:4;26482:20;26478:1;26467:9;26463:17;26456:47;26520:131;26646:4;26520:131;:::i;:::-;26512:139;;26410:248;;;:::o;26664:419::-;26830:4;26868:2;26857:9;26853:18;26845:26;;26917:9;26911:4;26907:20;26903:1;26892:9;26888:17;26881:47;26945:131;27071:4;26945:131;:::i;:::-;26937:139;;26835:248;;;:::o;27089:419::-;27255:4;27293:2;27282:9;27278:18;27270:26;;27342:9;27336:4;27332:20;27328:1;27317:9;27313:17;27306:47;27370:131;27496:4;27370:131;:::i;:::-;27362:139;;27260:248;;;:::o;27514:419::-;27680:4;27718:2;27707:9;27703:18;27695:26;;27767:9;27761:4;27757:20;27753:1;27742:9;27738:17;27731:47;27795:131;27921:4;27795:131;:::i;:::-;27787:139;;27685:248;;;:::o;27939:419::-;28105:4;28143:2;28132:9;28128:18;28120:26;;28192:9;28186:4;28182:20;28178:1;28167:9;28163:17;28156:47;28220:131;28346:4;28220:131;:::i;:::-;28212:139;;28110:248;;;:::o;28364:419::-;28530:4;28568:2;28557:9;28553:18;28545:26;;28617:9;28611:4;28607:20;28603:1;28592:9;28588:17;28581:47;28645:131;28771:4;28645:131;:::i;:::-;28637:139;;28535:248;;;:::o;28789:419::-;28955:4;28993:2;28982:9;28978:18;28970:26;;29042:9;29036:4;29032:20;29028:1;29017:9;29013:17;29006:47;29070:131;29196:4;29070:131;:::i;:::-;29062:139;;28960:248;;;:::o;29214:419::-;29380:4;29418:2;29407:9;29403:18;29395:26;;29467:9;29461:4;29457:20;29453:1;29442:9;29438:17;29431:47;29495:131;29621:4;29495:131;:::i;:::-;29487:139;;29385:248;;;:::o;29639:419::-;29805:4;29843:2;29832:9;29828:18;29820:26;;29892:9;29886:4;29882:20;29878:1;29867:9;29863:17;29856:47;29920:131;30046:4;29920:131;:::i;:::-;29912:139;;29810:248;;;:::o;30064:419::-;30230:4;30268:2;30257:9;30253:18;30245:26;;30317:9;30311:4;30307:20;30303:1;30292:9;30288:17;30281:47;30345:131;30471:4;30345:131;:::i;:::-;30337:139;;30235:248;;;:::o;30489:419::-;30655:4;30693:2;30682:9;30678:18;30670:26;;30742:9;30736:4;30732:20;30728:1;30717:9;30713:17;30706:47;30770:131;30896:4;30770:131;:::i;:::-;30762:139;;30660:248;;;:::o;30914:419::-;31080:4;31118:2;31107:9;31103:18;31095:26;;31167:9;31161:4;31157:20;31153:1;31142:9;31138:17;31131:47;31195:131;31321:4;31195:131;:::i;:::-;31187:139;;31085:248;;;:::o;31339:419::-;31505:4;31543:2;31532:9;31528:18;31520:26;;31592:9;31586:4;31582:20;31578:1;31567:9;31563:17;31556:47;31620:131;31746:4;31620:131;:::i;:::-;31612:139;;31510:248;;;:::o;31764:419::-;31930:4;31968:2;31957:9;31953:18;31945:26;;32017:9;32011:4;32007:20;32003:1;31992:9;31988:17;31981:47;32045:131;32171:4;32045:131;:::i;:::-;32037:139;;31935:248;;;:::o;32189:419::-;32355:4;32393:2;32382:9;32378:18;32370:26;;32442:9;32436:4;32432:20;32428:1;32417:9;32413:17;32406:47;32470:131;32596:4;32470:131;:::i;:::-;32462:139;;32360:248;;;:::o;32614:419::-;32780:4;32818:2;32807:9;32803:18;32795:26;;32867:9;32861:4;32857:20;32853:1;32842:9;32838:17;32831:47;32895:131;33021:4;32895:131;:::i;:::-;32887:139;;32785:248;;;:::o;33039:419::-;33205:4;33243:2;33232:9;33228:18;33220:26;;33292:9;33286:4;33282:20;33278:1;33267:9;33263:17;33256:47;33320:131;33446:4;33320:131;:::i;:::-;33312:139;;33210:248;;;:::o;33464:419::-;33630:4;33668:2;33657:9;33653:18;33645:26;;33717:9;33711:4;33707:20;33703:1;33692:9;33688:17;33681:47;33745:131;33871:4;33745:131;:::i;:::-;33737:139;;33635:248;;;:::o;33889:419::-;34055:4;34093:2;34082:9;34078:18;34070:26;;34142:9;34136:4;34132:20;34128:1;34117:9;34113:17;34106:47;34170:131;34296:4;34170:131;:::i;:::-;34162:139;;34060:248;;;:::o;34314:419::-;34480:4;34518:2;34507:9;34503:18;34495:26;;34567:9;34561:4;34557:20;34553:1;34542:9;34538:17;34531:47;34595:131;34721:4;34595:131;:::i;:::-;34587:139;;34485:248;;;:::o;34739:419::-;34905:4;34943:2;34932:9;34928:18;34920:26;;34992:9;34986:4;34982:20;34978:1;34967:9;34963:17;34956:47;35020:131;35146:4;35020:131;:::i;:::-;35012:139;;34910:248;;;:::o;35164:419::-;35330:4;35368:2;35357:9;35353:18;35345:26;;35417:9;35411:4;35407:20;35403:1;35392:9;35388:17;35381:47;35445:131;35571:4;35445:131;:::i;:::-;35437:139;;35335:248;;;:::o;35589:419::-;35755:4;35793:2;35782:9;35778:18;35770:26;;35842:9;35836:4;35832:20;35828:1;35817:9;35813:17;35806:47;35870:131;35996:4;35870:131;:::i;:::-;35862:139;;35760:248;;;:::o;36014:419::-;36180:4;36218:2;36207:9;36203:18;36195:26;;36267:9;36261:4;36257:20;36253:1;36242:9;36238:17;36231:47;36295:131;36421:4;36295:131;:::i;:::-;36287:139;;36185:248;;;:::o;36439:419::-;36605:4;36643:2;36632:9;36628:18;36620:26;;36692:9;36686:4;36682:20;36678:1;36667:9;36663:17;36656:47;36720:131;36846:4;36720:131;:::i;:::-;36712:139;;36610:248;;;:::o;36864:419::-;37030:4;37068:2;37057:9;37053:18;37045:26;;37117:9;37111:4;37107:20;37103:1;37092:9;37088:17;37081:47;37145:131;37271:4;37145:131;:::i;:::-;37137:139;;37035:248;;;:::o;37289:419::-;37455:4;37493:2;37482:9;37478:18;37470:26;;37542:9;37536:4;37532:20;37528:1;37517:9;37513:17;37506:47;37570:131;37696:4;37570:131;:::i;:::-;37562:139;;37460:248;;;:::o;37714:419::-;37880:4;37918:2;37907:9;37903:18;37895:26;;37967:9;37961:4;37957:20;37953:1;37942:9;37938:17;37931:47;37995:131;38121:4;37995:131;:::i;:::-;37987:139;;37885:248;;;:::o;38139:419::-;38305:4;38343:2;38332:9;38328:18;38320:26;;38392:9;38386:4;38382:20;38378:1;38367:9;38363:17;38356:47;38420:131;38546:4;38420:131;:::i;:::-;38412:139;;38310:248;;;:::o;38564:222::-;38657:4;38695:2;38684:9;38680:18;38672:26;;38708:71;38776:1;38765:9;38761:17;38752:6;38708:71;:::i;:::-;38662:124;;;;:::o;38792:129::-;38826:6;38853:20;;:::i;:::-;38843:30;;38882:33;38910:4;38902:6;38882:33;:::i;:::-;38833:88;;;:::o;38927:75::-;38960:6;38993:2;38987:9;38977:19;;38967:35;:::o;39008:307::-;39069:4;39159:18;39151:6;39148:30;39145:2;;;39181:18;;:::i;:::-;39145:2;39219:29;39241:6;39219:29;:::i;:::-;39211:37;;39303:4;39297;39293:15;39285:23;;39074:241;;;:::o;39321:141::-;39370:4;39393:3;39385:11;;39416:3;39413:1;39406:14;39450:4;39447:1;39437:18;39429:26;;39375:87;;;:::o;39468:98::-;39519:6;39553:5;39547:12;39537:22;;39526:40;;;:::o;39572:99::-;39624:6;39658:5;39652:12;39642:22;;39631:40;;;:::o;39677:168::-;39760:11;39794:6;39789:3;39782:19;39834:4;39829:3;39825:14;39810:29;;39772:73;;;;:::o;39851:169::-;39935:11;39969:6;39964:3;39957:19;40009:4;40004:3;40000:14;39985:29;;39947:73;;;;:::o;40026:148::-;40128:11;40165:3;40150:18;;40140:34;;;;:::o;40180:305::-;40220:3;40239:20;40257:1;40239:20;:::i;:::-;40234:25;;40273:20;40291:1;40273:20;:::i;:::-;40268:25;;40427:1;40359:66;40355:74;40352:1;40349:81;40346:2;;;40433:18;;:::i;:::-;40346:2;40477:1;40474;40470:9;40463:16;;40224:261;;;;:::o;40491:185::-;40531:1;40548:20;40566:1;40548:20;:::i;:::-;40543:25;;40582:20;40600:1;40582:20;:::i;:::-;40577:25;;40621:1;40611:2;;40626:18;;:::i;:::-;40611:2;40668:1;40665;40661:9;40656:14;;40533:143;;;;:::o;40682:348::-;40722:7;40745:20;40763:1;40745:20;:::i;:::-;40740:25;;40779:20;40797:1;40779:20;:::i;:::-;40774:25;;40967:1;40899:66;40895:74;40892:1;40889:81;40884:1;40877:9;40870:17;40866:105;40863:2;;;40974:18;;:::i;:::-;40863:2;41022:1;41019;41015:9;41004:20;;40730:300;;;;:::o;41036:191::-;41076:4;41096:20;41114:1;41096:20;:::i;:::-;41091:25;;41130:20;41148:1;41130:20;:::i;:::-;41125:25;;41169:1;41166;41163:8;41160:2;;;41174:18;;:::i;:::-;41160:2;41219:1;41216;41212:9;41204:17;;41081:146;;;;:::o;41233:96::-;41270:7;41299:24;41317:5;41299:24;:::i;:::-;41288:35;;41278:51;;;:::o;41335:90::-;41369:7;41412:5;41405:13;41398:21;41387:32;;41377:48;;;:::o;41431:77::-;41468:7;41497:5;41486:16;;41476:32;;;:::o;41514:149::-;41550:7;41590:66;41583:5;41579:78;41568:89;;41558:105;;;:::o;41669:126::-;41706:7;41746:42;41739:5;41735:54;41724:65;;41714:81;;;:::o;41801:77::-;41838:7;41867:5;41856:16;;41846:32;;;:::o;41884:86::-;41919:7;41959:4;41952:5;41948:16;41937:27;;41927:43;;;:::o;41976:154::-;42060:6;42055:3;42050;42037:30;42122:1;42113:6;42108:3;42104:16;42097:27;42027:103;;;:::o;42136:307::-;42204:1;42214:113;42228:6;42225:1;42222:13;42214:113;;;42313:1;42308:3;42304:11;42298:18;42294:1;42289:3;42285:11;42278:39;42250:2;42247:1;42243:10;42238:15;;42214:113;;;42345:6;42342:1;42339:13;42336:2;;;42425:1;42416:6;42411:3;42407:16;42400:27;42336:2;42185:258;;;;:::o;42449:320::-;42493:6;42530:1;42524:4;42520:12;42510:22;;42577:1;42571:4;42567:12;42598:18;42588:2;;42654:4;42646:6;42642:17;42632:27;;42588:2;42716;42708:6;42705:14;42685:18;42682:38;42679:2;;;42735:18;;:::i;:::-;42679:2;42500:269;;;;:::o;42775:281::-;42858:27;42880:4;42858:27;:::i;:::-;42850:6;42846:40;42988:6;42976:10;42973:22;42952:18;42940:10;42937:34;42934:62;42931:2;;;42999:18;;:::i;:::-;42931:2;43039:10;43035:2;43028:22;42818:238;;;:::o;43062:233::-;43101:3;43124:24;43142:5;43124:24;:::i;:::-;43115:33;;43170:66;43163:5;43160:77;43157:2;;;43240:18;;:::i;:::-;43157:2;43287:1;43280:5;43276:13;43269:20;;43105:190;;;:::o;43301:100::-;43340:7;43369:26;43389:5;43369:26;:::i;:::-;43358:37;;43348:53;;;:::o;43407:79::-;43446:7;43475:5;43464:16;;43454:32;;;:::o;43492:94::-;43531:7;43560:20;43574:5;43560:20;:::i;:::-;43549:31;;43539:47;;;:::o;43592:176::-;43624:1;43641:20;43659:1;43641:20;:::i;:::-;43636:25;;43675:20;43693:1;43675:20;:::i;:::-;43670:25;;43714:1;43704:2;;43719:18;;:::i;:::-;43704:2;43760:1;43757;43753:9;43748:14;;43626:142;;;;:::o;43774:180::-;43822:77;43819:1;43812:88;43919:4;43916:1;43909:15;43943:4;43940:1;43933:15;43960:180;44008:77;44005:1;43998:88;44105:4;44102:1;44095:15;44129:4;44126:1;44119:15;44146:180;44194:77;44191:1;44184:88;44291:4;44288:1;44281:15;44315:4;44312:1;44305:15;44332:180;44380:77;44377:1;44370:88;44477:4;44474:1;44467:15;44501:4;44498:1;44491:15;44518:102;44559:6;44610:2;44606:7;44601:2;44594:5;44590:14;44586:28;44576:38;;44566:54;;;:::o;44626:94::-;44659:8;44707:5;44703:2;44699:14;44678:35;;44668:52;;;:::o;44726:174::-;44866:26;44862:1;44854:6;44850:14;44843:50;44832:68;:::o;44906:164::-;45046:16;45042:1;45034:6;45030:14;45023:40;45012:58;:::o;45076:172::-;45216:24;45212:1;45204:6;45200:14;45193:48;45182:66;:::o;45254:181::-;45394:33;45390:1;45382:6;45378:14;45371:57;45360:75;:::o;45441:214::-;45581:66;45577:1;45569:6;45565:14;45558:90;45547:108;:::o;45661:230::-;45801:34;45797:1;45789:6;45785:14;45778:58;45870:13;45865:2;45857:6;45853:15;45846:38;45767:124;:::o;45897:237::-;46037:34;46033:1;46025:6;46021:14;46014:58;46106:20;46101:2;46093:6;46089:15;46082:45;46003:131;:::o;46140:225::-;46280:34;46276:1;46268:6;46264:14;46257:58;46349:8;46344:2;46336:6;46332:15;46325:33;46246:119;:::o;46371:177::-;46511:29;46507:1;46499:6;46495:14;46488:53;46477:71;:::o;46554:178::-;46694:30;46690:1;46682:6;46678:14;46671:54;46660:72;:::o;46738:178::-;46878:30;46874:1;46866:6;46862:14;46855:54;46844:72;:::o;46922:223::-;47062:34;47058:1;47050:6;47046:14;47039:58;47131:6;47126:2;47118:6;47114:15;47107:31;47028:117;:::o;47151:175::-;47291:27;47287:1;47279:6;47275:14;47268:51;47257:69;:::o;47332:221::-;47472:34;47468:1;47460:6;47456:14;47449:58;47541:4;47536:2;47528:6;47524:15;47517:29;47438:115;:::o;47559:161::-;47699:13;47695:1;47687:6;47683:14;47676:37;47665:55;:::o;47726:231::-;47866:34;47862:1;47854:6;47850:14;47843:58;47935:14;47930:2;47922:6;47918:15;47911:39;47832:125;:::o;47963:243::-;48103:34;48099:1;48091:6;48087:14;48080:58;48172:26;48167:2;48159:6;48155:15;48148:51;48069:137;:::o;48212:229::-;48352:34;48348:1;48340:6;48336:14;48329:58;48421:12;48416:2;48408:6;48404:15;48397:37;48318:123;:::o;48447:228::-;48587:34;48583:1;48575:6;48571:14;48564:58;48656:11;48651:2;48643:6;48639:15;48632:36;48553:122;:::o;48681:221::-;48821:34;48817:1;48809:6;48805:14;48798:58;48890:4;48885:2;48877:6;48873:15;48866:29;48787:115;:::o;48908:182::-;49048:34;49044:1;49036:6;49032:14;49025:58;49014:76;:::o;49096:231::-;49236:34;49232:1;49224:6;49220:14;49213:58;49305:14;49300:2;49292:6;49288:15;49281:39;49202:125;:::o;49333:182::-;49473:34;49469:1;49461:6;49457:14;49450:58;49439:76;:::o;49521:228::-;49661:34;49657:1;49649:6;49645:14;49638:58;49730:11;49725:2;49717:6;49713:15;49706:36;49627:122;:::o;49755:223::-;49895:34;49891:1;49883:6;49879:14;49872:58;49964:6;49959:2;49951:6;49947:15;49940:31;49861:117;:::o;49984:181::-;50124:33;50120:1;50112:6;50108:14;50101:57;50090:75;:::o;50171:220::-;50311:34;50307:1;50299:6;50295:14;50288:58;50380:3;50375:2;50367:6;50363:15;50356:28;50277:114;:::o;50397:160::-;50537:12;50533:1;50525:6;50521:14;50514:36;50503:54;:::o;50563:236::-;50703:34;50699:1;50691:6;50687:14;50680:58;50772:19;50767:2;50759:6;50755:15;50748:44;50669:130;:::o;50805:231::-;50945:34;50941:1;50933:6;50929:14;50922:58;51014:14;51009:2;51001:6;50997:15;50990:39;50911:125;:::o;51042:164::-;51182:16;51178:1;51170:6;51166:14;51159:40;51148:58;:::o;51212:166::-;51352:18;51348:1;51340:6;51336:14;51329:42;51318:60;:::o;51384:122::-;51457:24;51475:5;51457:24;:::i;:::-;51450:5;51447:35;51437:2;;51496:1;51493;51486:12;51437:2;51427:79;:::o;51512:116::-;51582:21;51597:5;51582:21;:::i;:::-;51575:5;51572:32;51562:2;;51618:1;51615;51608:12;51562:2;51552:76;:::o;51634:120::-;51706:23;51723:5;51706:23;:::i;:::-;51699:5;51696:34;51686:2;;51744:1;51741;51734:12;51686:2;51676:78;:::o;51760:122::-;51833:24;51851:5;51833:24;:::i;:::-;51826:5;51823:35;51813:2;;51872:1;51869;51862:12;51813:2;51803:79;:::o

Swarm Source

ipfs://14ce7b206af6020d3df58ee5f01d1ef89fea661dbc92afc26b8f64b96e00686c
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.