ETH Price: $2,941.67 (-4.10%)
Gas: 1 Gwei

Token

FISH GAME (FISHER)
 

Overview

Max Total Supply

1,600 FISHER

Holders

692

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 FISHER
0xf547afbca7d82b366c1e6e0d161480606a95f17f
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Fish Game is a new, creative P2E game that brings the world of fishing to the NFT space with utility. 1600 Genesis Fishers

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
FISHGAME

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-12-07
*/

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
        uint _value; // default: 0
    }

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

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

    function decrement(Counter storage counter) internal {
        uint 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,
        uint indexed tokenId
    );

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(
        address indexed owner,
        address indexed approved,
        uint 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 (uint balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint 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,
        uint 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,
        uint 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, uint tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint 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,
        uint 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 (uint);

    /**
     * @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, uint index)
    external
    view
    returns (uint 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(uint index) external view returns (uint);
}


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 `uint` to its ASCII `string` decimal representation.
     */
    function toString(uint 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";
        }
        uint temp = value;
        uint digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

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

    /**
     * @dev Converts a `uint` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint value, uint length)
    internal
    pure
    returns (string memory)
    {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint 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.

        uint 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, uint 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,
        uint 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-uint-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint 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(uint 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,
        uint 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 uint;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

    // Mapping from token ID to approved address
    mapping(uint => 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 (uint)
    {
        require(
            owner != address(0),
            "ERC721: balance query for the zero address"
        );
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint 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(uint 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, uint 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(uint 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,
        uint 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,
        uint tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint 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,
        uint 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(uint 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, uint 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, uint tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint 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, uint 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(uint 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,
        uint 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, uint 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 uint 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,
        uint 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,
        uint 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(uint => uint)) private _ownedTokens;

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

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

    // Mapping from token id to position in the allTokens array
    mapping(uint => uint) 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, uint index)
    public
    view
    virtual
    override
    returns (uint)
    {
        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 (uint) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint index)
    public
    view
    virtual
    override
    returns (uint)
    {
        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,
        uint 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 uint ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint tokenId) private {
        uint 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 uint ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint 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 uint ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint 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).

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

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint 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 uint ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint 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).

        uint lastTokenIndex = _allTokens.length - 1;
        uint 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)
        uint 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;
    }


    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {

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


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

    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {

        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

pragma solidity ^0.8.0;

contract FISHGAME is ERC721Enumerable, Ownable {
    using Strings for uint;
    using ECDSA for bytes32;

    uint public FISH_MAX_COUNT = 3333; //maxSupply
    uint public FISH_PRESALE_LIMIT_PER_WALLET = 2; //FISHperwalletInWholeDuration
    uint public FISH_PUBLICSALE_LIMIT_PER_TRANSACTION = 2;
    uint public totalTokensSoldInPresale;

    uint public FISH_MAINSALE_PRICE = 0.075 ether; //priceInMainSale
    uint public FISH_PRESALE_PRICE = 0.05 ether; //priceInPreSale
    mapping (address => uint) public presalerListPurchases;

    //todo : we need to change this baseURI
    string private _tokenBaseURI = "https://gateway.pinata.cloud/ipfs/Qma4rxtQNJZGNAvyUJV4HnkUfCStuNg51bcxfjHjEpFhAS/";
    string private constant Sig_WORD = "private";
    address private _signerAddress = 0x956231B802D9494296acdE7B3Ce3890c8b0438b8;
    bool public presaleLive;
    bool public saleLive;
    bool public locked;

    modifier notLocked {
        require(!locked, "Contract metadata methods are locked");
        _;
    }

    constructor() ERC721("FISH GAME", "FISHER") {}

    function set_FISH_MAX_COUNT(uint _maxCount) external onlyOwner{
        FISH_MAX_COUNT = _maxCount;
    }

    function set_FISH_MAINSALE_PRICE(uint _mainSalePrice) external onlyOwner{
        FISH_MAINSALE_PRICE = _mainSalePrice;
    }

    function set_FISH_PRESALE_PRICE(uint _presalePrice) external onlyOwner{
        FISH_PRESALE_PRICE = _presalePrice;
    }

    function set_FISH_PRESALE_LIMIT_PER_WALLET(uint _newValue) external onlyOwner{
        FISH_PRESALE_LIMIT_PER_WALLET = _newValue;
    }

    function set_FISH_PUBLICSALE_LIMIT_PER_TRANSACTION(uint _newValue) external onlyOwner{
        FISH_PUBLICSALE_LIMIT_PER_TRANSACTION = _newValue;
    }


    function matchAddresSigner(bytes memory signature) private view returns(bool) {
        bytes32 hash = keccak256(abi.encodePacked(
                "\x19Ethereum Signed Message:\n32",
                keccak256(abi.encodePacked(msg.sender, Sig_WORD)))
        );
        return _signerAddress == hash.recover(signature);
    }

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

    function buy(uint tokenQuantity) external payable {
        require (saleLive, "SALE_CLOSED");
        require (tokenQuantity <= FISH_PUBLICSALE_LIMIT_PER_TRANSACTION, "TRANSACTION LIMIT EXCEED");
        require (totalSupply() + tokenQuantity <= FISH_MAX_COUNT, "EXCEED_MAX");
        require (FISH_MAINSALE_PRICE * tokenQuantity <= msg.value, "INSUFFICIENT_ETH");
        for (uint i = 0; i < tokenQuantity; i++) {
            _safeMint(msg.sender, totalSupply() + 1);
        }
    }

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

    function tokensOfOwner(address _owner) public view returns (uint256[] memory){
        uint256 count = balanceOf(_owner);
        uint256[] memory result = new uint256[](count);
        for (uint256 index = 0; index < count; index++) {
            result[index] = tokenOfOwnerByIndex(_owner, index);
        }
        return result;
    }

    function presaleBuy( bytes memory signature, uint tokenQuantity) external payable{
        require(presaleLive, "PRESALE_CLOSED"); //FISH_PRESALE_LIMIT_PER_WALLET
        require(matchAddresSigner(signature), "DIRECT_MINT_DISALLOWED");
        require(presalerListPurchases[msg.sender] + tokenQuantity <= FISH_PRESALE_LIMIT_PER_WALLET, "EXCEED_ALLOC");
        require(FISH_PRESALE_PRICE * tokenQuantity <= msg.value, "INSUFFICIENT_ETH");
        presalerListPurchases[msg.sender] += tokenQuantity;
        for(uint i = 0; i < tokenQuantity; i++) {
            _safeMint(msg.sender, totalSupply() + 1);
        }
    }

    function withdraw() external {
        uint balance = address(this).balance;
        require(balance > 0);
        address payable _dylanAddress = payable (0xAA7484F5Be0AD8B1F51684E79E432307a54E9a8D);
        uint dylanTransfer =  (balance*(5))/(100);
        _dylanAddress.transfer(dylanTransfer);
        payable(owner()).transfer(address(this).balance);
    }

    function presalePurchasedCount(address addr) external view returns (uint) {
        return presalerListPurchases[addr];
    }

    function lockMetadata(bool _assertion) external onlyOwner {
        locked = _assertion;
    }


    function togglePresaleStatus() external onlyOwner {
        presaleLive = !presaleLive;
    }

    function toggleSaleStatus() external onlyOwner {
        saleLive = !saleLive;
    }


    function setSignerAddress(address addr) external onlyOwner {
        _signerAddress = addr;
    }

    function setBaseURI(string calldata URI) external onlyOwner notLocked {
        _tokenBaseURI = URI;
    }

    function tokenURI(uint 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":"FISH_MAINSALE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FISH_MAX_COUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FISH_PRESALE_LIMIT_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FISH_PRESALE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FISH_PUBLICSALE_LIMIT_PER_TRANSACTION","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":[{"internalType":"bool","name":"_assertion","type":"bool"}],"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":[{"internalType":"address","name":"addr","type":"address"}],"name":"presalePurchasedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"presalerListPurchases","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":"address","name":"addr","type":"address"}],"name":"setSignerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mainSalePrice","type":"uint256"}],"name":"set_FISH_MAINSALE_PRICE","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxCount","type":"uint256"}],"name":"set_FISH_MAX_COUNT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newValue","type":"uint256"}],"name":"set_FISH_PRESALE_LIMIT_PER_WALLET","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_presalePrice","type":"uint256"}],"name":"set_FISH_PRESALE_PRICE","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newValue","type":"uint256"}],"name":"set_FISH_PUBLICSALE_LIMIT_PER_TRANSACTION","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":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTokensSoldInPresale","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"}]

6080604052610d05600b556002600c556002600d5567010a741a46278000600f5566b1a2bc2ec5000060105560405180608001604052806051815260200162005ac160519139601290805190602001906200005c92919062000254565b5073956231b802d9494296acde7b3ce3890c8b0438b8601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000bf57600080fd5b506040518060400160405280600981526020017f464953482047414d4500000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f464953484552000000000000000000000000000000000000000000000000000081525081600090805190602001906200014492919062000254565b5080600190805190602001906200015d92919062000254565b50505062000180620001746200018660201b60201c565b6200018e60201b60201c565b62000369565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002629062000304565b90600052602060002090601f016020900481019282620002865760008555620002d2565b82601f10620002a157805160ff1916838001178555620002d2565b82800160010185558215620002d2579182015b82811115620002d1578251825591602001919060010190620002b4565b5b509050620002e19190620002e5565b5090565b5b8082111562000300576000816000905550600101620002e6565b5090565b600060028204905060018216806200031d57607f821691505b602082108114156200033457620003336200033a565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61574880620003796000396000f3fe60806040526004361061027d5760003560e01c806370a082311161014f578063a22cb465116100c1578063e081b7811161007a578063e081b78114610973578063e14011c81461099e578063e985e9c5146109c9578063f2fde38b14610a06578063f42202e814610a2f578063fd917b0714610a585761027d565b8063a22cb46514610872578063aef027721461089b578063b88d4fde146108c6578063c87b56dd146108ef578063cf3090121461092c578063d96a094a146109575761027d565b806383a9e0491161011357806383a9e0491461074e5780638462151c146107795780638da5cb5b146107b657806395d89b41146107e15780639b76f2511461080c5780639bf80316146108355761027d565b806370a082311461068f578063715018a6146106cc5780637bffb4ce146106e35780637e27f572146106fa5780637e80fc4e146107255761027d565b806321dd7d6c116101f357806342842e0e116101ac57806342842e0e1461055b5780634f6ccce71461058457806355f804b3146105c15780635ce7af1f146105ea5780636352211e146106275780636d29e32f146106645761027d565b806321dd7d6c1461046157806323b872dd1461048c57806324a911f1146104b55780632f745c59146104de57806331b555881461051b5780633ccfd60b146105445761027d565b8063095ea7b311610245578063095ea7b314610367578063110019fc14610390578063163e1e61146103b957806318160ddd146103e2578063193995301461040d57806319e0dcfb146104365761027d565b806301ffc9a714610282578063046dc166146102bf578063049c5c49146102e857806306fdde03146102ff578063081812fc1461032a575b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a49190613d21565b610a74565b6040516102b691906145a9565b60405180910390f35b3480156102cb57600080fd5b506102e660048036038101906102e19190613ae4565b610aee565b005b3480156102f457600080fd5b506102fd610bae565b005b34801561030b57600080fd5b50610314610c56565b6040516103219190614609565b60405180910390f35b34801561033657600080fd5b50610351600480360381019061034c9190613e24565b610ce8565b60405161035e9190614520565b60405180910390f35b34801561037357600080fd5b5061038e60048036038101906103899190613c67565b610d6d565b005b34801561039c57600080fd5b506103b760048036038101906103b29190613e24565b610e85565b005b3480156103c557600080fd5b506103e060048036038101906103db9190613ca7565b610f0b565b005b3480156103ee57600080fd5b506103f761104b565b60405161040491906149eb565b60405180910390f35b34801561041957600080fd5b50610434600480360381019061042f9190613e24565b611058565b005b34801561044257600080fd5b5061044b6110de565b60405161045891906149eb565b60405180910390f35b34801561046d57600080fd5b506104766110e4565b60405161048391906149eb565b60405180910390f35b34801561049857600080fd5b506104b360048036038101906104ae9190613b51565b6110ea565b005b3480156104c157600080fd5b506104dc60048036038101906104d79190613e24565b61114a565b005b3480156104ea57600080fd5b5061050560048036038101906105009190613c67565b6111d0565b60405161051291906149eb565b60405180910390f35b34801561052757600080fd5b50610542600480360381019061053d9190613e24565b611275565b005b34801561055057600080fd5b506105596112fb565b005b34801561056757600080fd5b50610582600480360381019061057d9190613b51565b6113dd565b005b34801561059057600080fd5b506105ab60048036038101906105a69190613e24565b6113fd565b6040516105b891906149eb565b60405180910390f35b3480156105cd57600080fd5b506105e860048036038101906105e39190613dd7565b61146e565b005b3480156105f657600080fd5b50610611600480360381019061060c9190613ae4565b611550565b60405161061e91906149eb565b60405180910390f35b34801561063357600080fd5b5061064e60048036038101906106499190613e24565b611599565b60405161065b9190614520565b60405180910390f35b34801561067057600080fd5b5061067961164b565b60405161068691906149eb565b60405180910390f35b34801561069b57600080fd5b506106b660048036038101906106b19190613ae4565b611651565b6040516106c391906149eb565b60405180910390f35b3480156106d857600080fd5b506106e1611709565b005b3480156106ef57600080fd5b506106f8611791565b005b34801561070657600080fd5b5061070f611839565b60405161071c91906149eb565b60405180910390f35b34801561073157600080fd5b5061074c60048036038101906107479190613cf4565b61183f565b005b34801561075a57600080fd5b506107636118d8565b60405161077091906145a9565b60405180910390f35b34801561078557600080fd5b506107a0600480360381019061079b9190613ae4565b6118eb565b6040516107ad9190614587565b60405180910390f35b3480156107c257600080fd5b506107cb611999565b6040516107d89190614520565b60405180910390f35b3480156107ed57600080fd5b506107f66119c3565b6040516108039190614609565b60405180910390f35b34801561081857600080fd5b50610833600480360381019061082e9190613e24565b611a55565b005b34801561084157600080fd5b5061085c60048036038101906108579190613ae4565b611adb565b60405161086991906149eb565b60405180910390f35b34801561087e57600080fd5b5061089960048036038101906108949190613c27565b611af3565b005b3480156108a757600080fd5b506108b0611c74565b6040516108bd91906149eb565b60405180910390f35b3480156108d257600080fd5b506108ed60048036038101906108e89190613ba4565b611c7a565b005b3480156108fb57600080fd5b5061091660048036038101906109119190613e24565b611cdc565b6040516109239190614609565b60405180910390f35b34801561093857600080fd5b50610941611d58565b60405161094e91906145a9565b60405180910390f35b610971600480360381019061096c9190613e24565b611d6b565b005b34801561097f57600080fd5b50610988611ee5565b60405161099591906145a9565b60405180910390f35b3480156109aa57600080fd5b506109b3611ef8565b6040516109c091906149eb565b60405180910390f35b3480156109d557600080fd5b506109f060048036038101906109eb9190613b11565b611efe565b6040516109fd91906145a9565b60405180910390f35b348015610a1257600080fd5b50610a2d6004803603810190610a289190613ae4565b611f92565b005b348015610a3b57600080fd5b50610a566004803603810190610a519190613e24565b61208a565b005b610a726004803603810190610a6d9190613d7b565b61219c565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ae75750610ae6826123a8565b5b9050919050565b610af661248a565b73ffffffffffffffffffffffffffffffffffffffff16610b14611999565b73ffffffffffffffffffffffffffffffffffffffff1614610b6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b61906148ab565b60405180910390fd5b80601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610bb661248a565b73ffffffffffffffffffffffffffffffffffffffff16610bd4611999565b73ffffffffffffffffffffffffffffffffffffffff1614610c2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c21906148ab565b60405180910390fd5b601360159054906101000a900460ff1615601360156101000a81548160ff021916908315150217905550565b606060008054610c6590614ccf565b80601f0160208091040260200160405190810160405280929190818152602001828054610c9190614ccf565b8015610cde5780601f10610cb357610100808354040283529160200191610cde565b820191906000526020600020905b815481529060010190602001808311610cc157829003601f168201915b5050505050905090565b6000610cf382612492565b610d32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d299061488b565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d7882611599565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610de9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de09061492b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e0861248a565b73ffffffffffffffffffffffffffffffffffffffff161480610e375750610e3681610e3161248a565b611efe565b5b610e76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6d906147eb565b60405180910390fd5b610e8083836124fe565b505050565b610e8d61248a565b73ffffffffffffffffffffffffffffffffffffffff16610eab611999565b73ffffffffffffffffffffffffffffffffffffffff1614610f01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef8906148ab565b60405180910390fd5b80600d8190555050565b610f1361248a565b73ffffffffffffffffffffffffffffffffffffffff16610f31611999565b73ffffffffffffffffffffffffffffffffffffffff1614610f87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7e906148ab565b60405180910390fd5b600b5482829050610f9661104b565b610fa09190614aed565b1115610fe1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd89061494b565b60405180910390fd5b60005b828290508110156110465761103383838381811061100557611004614ec5565b5b905060200201602081019061101a9190613ae4565b600161102461104b565b61102e9190614aed565b6125b7565b808061103e90614d32565b915050610fe4565b505050565b6000600880549050905090565b61106061248a565b73ffffffffffffffffffffffffffffffffffffffff1661107e611999565b73ffffffffffffffffffffffffffffffffffffffff16146110d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cb906148ab565b60405180910390fd5b80600b8190555050565b600b5481565b60105481565b6110fb6110f561248a565b826125d5565b61113a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111319061496b565b60405180910390fd5b6111458383836126b3565b505050565b61115261248a565b73ffffffffffffffffffffffffffffffffffffffff16611170611999565b73ffffffffffffffffffffffffffffffffffffffff16146111c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111bd906148ab565b60405180910390fd5b8060108190555050565b60006111db83611651565b821061121c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611213906146cb565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61127d61248a565b73ffffffffffffffffffffffffffffffffffffffff1661129b611999565b73ffffffffffffffffffffffffffffffffffffffff16146112f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e8906148ab565b60405180910390fd5b80600c8190555050565b60004790506000811161130d57600080fd5b600073aa7484f5be0ad8b1f51684e79e432307a54e9a8d9050600060646005846113379190614b74565b6113419190614b43565b90508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611389573d6000803e3d6000fd5b50611392611999565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156113d7573d6000803e3d6000fd5b50505050565b6113f883838360405180602001604052806000815250611c7a565b505050565b600061140761104b565b8210611448576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143f9061498b565b60405180910390fd5b6008828154811061145c5761145b614ec5565b5b90600052602060002001549050919050565b61147661248a565b73ffffffffffffffffffffffffffffffffffffffff16611494611999565b73ffffffffffffffffffffffffffffffffffffffff16146114ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e1906148ab565b60405180910390fd5b601360169054906101000a900460ff161561153a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611531906148eb565b60405180910390fd5b81816012919061154b9291906138bc565b505050565b6000601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611642576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116399061482b565b60405180910390fd5b80915050919050565b600e5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b99061480b565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61171161248a565b73ffffffffffffffffffffffffffffffffffffffff1661172f611999565b73ffffffffffffffffffffffffffffffffffffffff1614611785576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177c906148ab565b60405180910390fd5b61178f600061290f565b565b61179961248a565b73ffffffffffffffffffffffffffffffffffffffff166117b7611999565b73ffffffffffffffffffffffffffffffffffffffff161461180d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611804906148ab565b60405180910390fd5b601360149054906101000a900460ff1615601360146101000a81548160ff021916908315150217905550565b600f5481565b61184761248a565b73ffffffffffffffffffffffffffffffffffffffff16611865611999565b73ffffffffffffffffffffffffffffffffffffffff16146118bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b2906148ab565b60405180910390fd5b80601360166101000a81548160ff02191690831515021790555050565b601360149054906101000a900460ff1681565b606060006118f883611651565b905060008167ffffffffffffffff81111561191657611915614ef4565b5b6040519080825280602002602001820160405280156119445781602001602082028036833780820191505090505b50905060005b8281101561198e5761195c85826111d0565b82828151811061196f5761196e614ec5565b5b602002602001018181525050808061198690614d32565b91505061194a565b508092505050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546119d290614ccf565b80601f01602080910402602001604051908101604052809291908181526020018280546119fe90614ccf565b8015611a4b5780601f10611a2057610100808354040283529160200191611a4b565b820191906000526020600020905b815481529060010190602001808311611a2e57829003601f168201915b5050505050905090565b611a5d61248a565b73ffffffffffffffffffffffffffffffffffffffff16611a7b611999565b73ffffffffffffffffffffffffffffffffffffffff1614611ad1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac8906148ab565b60405180910390fd5b80600f8190555050565b60116020528060005260406000206000915090505481565b611afb61248a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b609061476b565b60405180910390fd5b8060056000611b7661248a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611c2361248a565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c6891906145a9565b60405180910390a35050565b600d5481565b611c8b611c8561248a565b836125d5565b611cca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc19061496b565b60405180910390fd5b611cd6848484846129d5565b50505050565b6060611ce782612492565b611d26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1d9061490b565b60405180910390fd5b6012611d3183612a31565b604051602001611d429291906144d6565b6040516020818303038152906040529050919050565b601360169054906101000a900460ff1681565b601360159054906101000a900460ff16611dba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db1906147ab565b60405180910390fd5b600d54811115611dff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df69061468b565b60405180910390fd5b600b5481611e0b61104b565b611e159190614aed565b1115611e56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4d9061494b565b60405180910390fd5b3481600f54611e659190614b74565b1115611ea6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9d906149cb565b60405180910390fd5b60005b81811015611ee157611ece336001611ebf61104b565b611ec99190614aed565b6125b7565b8080611ed990614d32565b915050611ea9565b5050565b601360159054906101000a900460ff1681565b600c5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611f9a61248a565b73ffffffffffffffffffffffffffffffffffffffff16611fb8611999565b73ffffffffffffffffffffffffffffffffffffffff161461200e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612005906148ab565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561207e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120759061470b565b60405180910390fd5b6120878161290f565b50565b61209261248a565b73ffffffffffffffffffffffffffffffffffffffff166120b0611999565b73ffffffffffffffffffffffffffffffffffffffff1614612106576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120fd906148ab565b60405180910390fd5b600b548161211261104b565b61211c9190614aed565b111561215d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121549061494b565b60405180910390fd5b60005b818110156121985761218533600161217661104b565b6121809190614aed565b6125b7565b808061219090614d32565b915050612160565b5050565b601360149054906101000a900460ff166121eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e29061464b565b60405180910390fd5b6121f482612b92565b612233576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222a9061466b565b60405180910390fd5b600c5481601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546122819190614aed565b11156122c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b9906149ab565b60405180910390fd5b34816010546122d19190614b74565b1115612312576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612309906149cb565b60405180910390fd5b80601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123619190614aed565b9250508190555060005b818110156123a35761239033600161238161104b565b61238b9190614aed565b6125b7565b808061239b90614d32565b91505061236b565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061247357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612483575061248282612c86565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661257183611599565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6125d1828260405180602001604052806000815250612cf0565b5050565b60006125e082612492565b61261f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612616906147cb565b60405180910390fd5b600061262a83611599565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061269957508373ffffffffffffffffffffffffffffffffffffffff1661268184610ce8565b73ffffffffffffffffffffffffffffffffffffffff16145b806126aa57506126a98185611efe565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166126d382611599565b73ffffffffffffffffffffffffffffffffffffffff1614612729576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612720906148cb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612799576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127909061474b565b60405180910390fd5b6127a4838383612d4b565b6127af6000826124fe565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127ff9190614bce565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128569190614aed565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6129e08484846126b3565b6129ec84848484612e5f565b612a2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a22906146eb565b60405180910390fd5b50505050565b60606000821415612a79576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612b8d565b600082905060005b60008214612aab578080612a9490614d32565b915050600a82612aa49190614b43565b9150612a81565b60008167ffffffffffffffff811115612ac757612ac6614ef4565b5b6040519080825280601f01601f191660200182016040528015612af95781602001600182028036833780820191505090505b5090505b60008514612b8657600182612b129190614bce565b9150600a85612b219190614da9565b6030612b2d9190614aed565b60f81b818381518110612b4357612b42614ec5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612b7f9190614b43565b9450612afd565b8093505050505b919050565b600080336040518060400160405280600781526020017f7072697661746500000000000000000000000000000000000000000000000000815250604051602001612bdd9291906144ae565b60405160208183030381529060405280519060200120604051602001612c0391906144fa565b604051602081830303815290604052805190602001209050612c2e8382612ff690919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff16601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612cfa838361301d565b612d076000848484612e5f565b612d46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3d906146eb565b60405180910390fd5b505050565b612d568383836131eb565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612d9957612d94816131f0565b612dd8565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612dd757612dd68382613239565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e1b57612e16816133a6565b612e5a565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612e5957612e588282613477565b5b5b505050565b6000612e808473ffffffffffffffffffffffffffffffffffffffff166134f6565b15612fe9578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612ea961248a565b8786866040518563ffffffff1660e01b8152600401612ecb949392919061453b565b602060405180830381600087803b158015612ee557600080fd5b505af1925050508015612f1657506040513d601f19601f82011682018060405250810190612f139190613d4e565b60015b612f99573d8060008114612f46576040519150601f19603f3d011682016040523d82523d6000602084013e612f4b565b606091505b50600081511415612f91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f88906146eb565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612fee565b600190505b949350505050565b60008060006130058585613509565b915091506130128161358c565b819250505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561308d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130849061486b565b60405180910390fd5b61309681612492565b156130d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130cd9061472b565b60405180910390fd5b6130e260008383612d4b565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131329190614aed565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161324684611651565b6132509190614bce565b9050600060076000848152602001908152602001600020549050818114613335576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506133ba9190614bce565b90506000600960008481526020019081526020016000205490506000600883815481106133ea576133e9614ec5565b5b90600052602060002001549050806008838154811061340c5761340b614ec5565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061345b5761345a614e96565b5b6001900381819060005260206000200160009055905550505050565b600061348283611651565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b60008060418351141561354b5760008060006020860151925060408601519150606086015160001a905061353f87828585613761565b94509450505050613585565b60408351141561357c57600080602085015191506040850151905061357186838361386e565b935093505050613585565b60006002915091505b9250929050565b600060048111156135a05761359f614e38565b5b8160048111156135b3576135b2614e38565b5b14156135be5761375e565b600160048111156135d2576135d1614e38565b5b8160048111156135e5576135e4614e38565b5b1415613626576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161361d9061462b565b60405180910390fd5b6002600481111561363a57613639614e38565b5b81600481111561364d5761364c614e38565b5b141561368e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613685906146ab565b60405180910390fd5b600360048111156136a2576136a1614e38565b5b8160048111156136b5576136b4614e38565b5b14156136f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136ed9061478b565b60405180910390fd5b60048081111561370957613708614e38565b5b81600481111561371c5761371b614e38565b5b141561375d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137549061484b565b60405180910390fd5b5b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561379c576000600391509150613865565b601b8560ff16141580156137b45750601c8560ff1614155b156137c6576000600491509150613865565b6000600187878787604051600081526020016040526040516137eb94939291906145c4565b6020604051602081039080840390855afa15801561380d573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561385c57600060019250925050613865565b80600092509250505b94509492505050565b6000806000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85169150601b8560ff1c0190506138ae87828885613761565b935093505050935093915050565b8280546138c890614ccf565b90600052602060002090601f0160209004810192826138ea5760008555613931565b82601f1061390357803560ff1916838001178555613931565b82800160010185558215613931579182015b82811115613930578235825591602001919060010190613915565b5b50905061393e9190613942565b5090565b5b8082111561395b576000816000905550600101613943565b5090565b600061397261396d84614a2b565b614a06565b90508281526020810184848401111561398e5761398d614f32565b5b613999848285614c8d565b509392505050565b6000813590506139b0816156b6565b92915050565b60008083601f8401126139cc576139cb614f28565b5b8235905067ffffffffffffffff8111156139e9576139e8614f23565b5b602083019150836020820283011115613a0557613a04614f2d565b5b9250929050565b600081359050613a1b816156cd565b92915050565b600081359050613a30816156e4565b92915050565b600081519050613a45816156e4565b92915050565b600082601f830112613a6057613a5f614f28565b5b8135613a7084826020860161395f565b91505092915050565b60008083601f840112613a8f57613a8e614f28565b5b8235905067ffffffffffffffff811115613aac57613aab614f23565b5b602083019150836001820283011115613ac857613ac7614f2d565b5b9250929050565b600081359050613ade816156fb565b92915050565b600060208284031215613afa57613af9614f3c565b5b6000613b08848285016139a1565b91505092915050565b60008060408385031215613b2857613b27614f3c565b5b6000613b36858286016139a1565b9250506020613b47858286016139a1565b9150509250929050565b600080600060608486031215613b6a57613b69614f3c565b5b6000613b78868287016139a1565b9350506020613b89868287016139a1565b9250506040613b9a86828701613acf565b9150509250925092565b60008060008060808587031215613bbe57613bbd614f3c565b5b6000613bcc878288016139a1565b9450506020613bdd878288016139a1565b9350506040613bee87828801613acf565b925050606085013567ffffffffffffffff811115613c0f57613c0e614f37565b5b613c1b87828801613a4b565b91505092959194509250565b60008060408385031215613c3e57613c3d614f3c565b5b6000613c4c858286016139a1565b9250506020613c5d85828601613a0c565b9150509250929050565b60008060408385031215613c7e57613c7d614f3c565b5b6000613c8c858286016139a1565b9250506020613c9d85828601613acf565b9150509250929050565b60008060208385031215613cbe57613cbd614f3c565b5b600083013567ffffffffffffffff811115613cdc57613cdb614f37565b5b613ce8858286016139b6565b92509250509250929050565b600060208284031215613d0a57613d09614f3c565b5b6000613d1884828501613a0c565b91505092915050565b600060208284031215613d3757613d36614f3c565b5b6000613d4584828501613a21565b91505092915050565b600060208284031215613d6457613d63614f3c565b5b6000613d7284828501613a36565b91505092915050565b60008060408385031215613d9257613d91614f3c565b5b600083013567ffffffffffffffff811115613db057613daf614f37565b5b613dbc85828601613a4b565b9250506020613dcd85828601613acf565b9150509250929050565b60008060208385031215613dee57613ded614f3c565b5b600083013567ffffffffffffffff811115613e0c57613e0b614f37565b5b613e1885828601613a79565b92509250509250929050565b600060208284031215613e3a57613e39614f3c565b5b6000613e4884828501613acf565b91505092915050565b6000613e5d8383614481565b60208301905092915050565b613e7281614c02565b82525050565b613e89613e8482614c02565b614d7b565b82525050565b6000613e9a82614a81565b613ea48185614aaf565b9350613eaf83614a5c565b8060005b83811015613ee0578151613ec78882613e51565b9750613ed283614aa2565b925050600181019050613eb3565b5085935050505092915050565b613ef681614c14565b82525050565b613f0581614c20565b82525050565b613f1c613f1782614c20565b614d8d565b82525050565b6000613f2d82614a8c565b613f378185614ac0565b9350613f47818560208601614c9c565b613f5081614f41565b840191505092915050565b6000613f6682614a97565b613f708185614ad1565b9350613f80818560208601614c9c565b613f8981614f41565b840191505092915050565b6000613f9f82614a97565b613fa98185614ae2565b9350613fb9818560208601614c9c565b80840191505092915050565b60008154613fd281614ccf565b613fdc8186614ae2565b94506001821660008114613ff757600181146140085761403b565b60ff1983168652818601935061403b565b61401185614a6c565b60005b8381101561403357815481890152600182019150602081019050614014565b838801955050505b50505092915050565b6000614051601883614ad1565b915061405c82614f5f565b602082019050919050565b6000614074600e83614ad1565b915061407f82614f88565b602082019050919050565b6000614097601683614ad1565b91506140a282614fb1565b602082019050919050565b60006140ba601883614ad1565b91506140c582614fda565b602082019050919050565b60006140dd601f83614ad1565b91506140e882615003565b602082019050919050565b6000614100601c83614ae2565b915061410b8261502c565b601c82019050919050565b6000614123602b83614ad1565b915061412e82615055565b604082019050919050565b6000614146603283614ad1565b9150614151826150a4565b604082019050919050565b6000614169602683614ad1565b9150614174826150f3565b604082019050919050565b600061418c601c83614ad1565b915061419782615142565b602082019050919050565b60006141af602483614ad1565b91506141ba8261516b565b604082019050919050565b60006141d2601983614ad1565b91506141dd826151ba565b602082019050919050565b60006141f5602283614ad1565b9150614200826151e3565b604082019050919050565b6000614218600b83614ad1565b915061422382615232565b602082019050919050565b600061423b602c83614ad1565b91506142468261525b565b604082019050919050565b600061425e603883614ad1565b9150614269826152aa565b604082019050919050565b6000614281602a83614ad1565b915061428c826152f9565b604082019050919050565b60006142a4602983614ad1565b91506142af82615348565b604082019050919050565b60006142c7602283614ad1565b91506142d282615397565b604082019050919050565b60006142ea602083614ad1565b91506142f5826153e6565b602082019050919050565b600061430d602c83614ad1565b91506143188261540f565b604082019050919050565b6000614330602083614ad1565b915061433b8261545e565b602082019050919050565b6000614353602983614ad1565b915061435e82615487565b604082019050919050565b6000614376602483614ad1565b9150614381826154d6565b604082019050919050565b6000614399601f83614ad1565b91506143a482615525565b602082019050919050565b60006143bc602183614ad1565b91506143c78261554e565b604082019050919050565b60006143df600a83614ad1565b91506143ea8261559d565b602082019050919050565b6000614402603183614ad1565b915061440d826155c6565b604082019050919050565b6000614425602c83614ad1565b915061443082615615565b604082019050919050565b6000614448600c83614ad1565b915061445382615664565b602082019050919050565b600061446b601083614ad1565b91506144768261568d565b602082019050919050565b61448a81614c76565b82525050565b61449981614c76565b82525050565b6144a881614c80565b82525050565b60006144ba8285613e78565b6014820191506144ca8284613f94565b91508190509392505050565b60006144e28285613fc5565b91506144ee8284613f94565b91508190509392505050565b6000614505826140f3565b91506145118284613f0b565b60208201915081905092915050565b60006020820190506145356000830184613e69565b92915050565b60006080820190506145506000830187613e69565b61455d6020830186613e69565b61456a6040830185614490565b818103606083015261457c8184613f22565b905095945050505050565b600060208201905081810360008301526145a18184613e8f565b905092915050565b60006020820190506145be6000830184613eed565b92915050565b60006080820190506145d96000830187613efc565b6145e6602083018661449f565b6145f36040830185613efc565b6146006060830184613efc565b95945050505050565b600060208201905081810360008301526146238184613f5b565b905092915050565b6000602082019050818103600083015261464481614044565b9050919050565b6000602082019050818103600083015261466481614067565b9050919050565b600060208201905081810360008301526146848161408a565b9050919050565b600060208201905081810360008301526146a4816140ad565b9050919050565b600060208201905081810360008301526146c4816140d0565b9050919050565b600060208201905081810360008301526146e481614116565b9050919050565b6000602082019050818103600083015261470481614139565b9050919050565b600060208201905081810360008301526147248161415c565b9050919050565b600060208201905081810360008301526147448161417f565b9050919050565b60006020820190508181036000830152614764816141a2565b9050919050565b60006020820190508181036000830152614784816141c5565b9050919050565b600060208201905081810360008301526147a4816141e8565b9050919050565b600060208201905081810360008301526147c48161420b565b9050919050565b600060208201905081810360008301526147e48161422e565b9050919050565b6000602082019050818103600083015261480481614251565b9050919050565b6000602082019050818103600083015261482481614274565b9050919050565b6000602082019050818103600083015261484481614297565b9050919050565b60006020820190508181036000830152614864816142ba565b9050919050565b60006020820190508181036000830152614884816142dd565b9050919050565b600060208201905081810360008301526148a481614300565b9050919050565b600060208201905081810360008301526148c481614323565b9050919050565b600060208201905081810360008301526148e481614346565b9050919050565b6000602082019050818103600083015261490481614369565b9050919050565b600060208201905081810360008301526149248161438c565b9050919050565b60006020820190508181036000830152614944816143af565b9050919050565b60006020820190508181036000830152614964816143d2565b9050919050565b60006020820190508181036000830152614984816143f5565b9050919050565b600060208201905081810360008301526149a481614418565b9050919050565b600060208201905081810360008301526149c48161443b565b9050919050565b600060208201905081810360008301526149e48161445e565b9050919050565b6000602082019050614a006000830184614490565b92915050565b6000614a10614a21565b9050614a1c8282614d01565b919050565b6000604051905090565b600067ffffffffffffffff821115614a4657614a45614ef4565b5b614a4f82614f41565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614af882614c76565b9150614b0383614c76565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614b3857614b37614dda565b5b828201905092915050565b6000614b4e82614c76565b9150614b5983614c76565b925082614b6957614b68614e09565b5b828204905092915050565b6000614b7f82614c76565b9150614b8a83614c76565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614bc357614bc2614dda565b5b828202905092915050565b6000614bd982614c76565b9150614be483614c76565b925082821015614bf757614bf6614dda565b5b828203905092915050565b6000614c0d82614c56565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614cba578082015181840152602081019050614c9f565b83811115614cc9576000848401525b50505050565b60006002820490506001821680614ce757607f821691505b60208210811415614cfb57614cfa614e67565b5b50919050565b614d0a82614f41565b810181811067ffffffffffffffff82111715614d2957614d28614ef4565b5b80604052505050565b6000614d3d82614c76565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614d7057614d6f614dda565b5b600182019050919050565b6000614d8682614d97565b9050919050565b6000819050919050565b6000614da282614f52565b9050919050565b6000614db482614c76565b9150614dbf83614c76565b925082614dcf57614dce614e09565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f50524553414c455f434c4f534544000000000000000000000000000000000000600082015250565b7f4449524543545f4d494e545f444953414c4c4f57454400000000000000000000600082015250565b7f5452414e53414354494f4e204c494d4954204558434545440000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f53414c455f434c4f534544000000000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f436f6e7472616374206d65746164617461206d6574686f647320617265206c6f60008201527f636b656400000000000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f74207175657279206e6f6e2d6578697374656e7420746f6b656e00600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4558434545445f4d415800000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4558434545445f414c4c4f430000000000000000000000000000000000000000600082015250565b7f494e53554646494349454e545f45544800000000000000000000000000000000600082015250565b6156bf81614c02565b81146156ca57600080fd5b50565b6156d681614c14565b81146156e157600080fd5b50565b6156ed81614c2a565b81146156f857600080fd5b50565b61570481614c76565b811461570f57600080fd5b5056fea2646970667358221220d603624c45de93b61676ed5091dc47709b12e8e0302fbc58d5978a910572323064736f6c6343000807003368747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d6134727874514e4a5a474e417679554a5634486e6b5566435374754e673531626378666a486a4570466841532f

Deployed Bytecode

0x60806040526004361061027d5760003560e01c806370a082311161014f578063a22cb465116100c1578063e081b7811161007a578063e081b78114610973578063e14011c81461099e578063e985e9c5146109c9578063f2fde38b14610a06578063f42202e814610a2f578063fd917b0714610a585761027d565b8063a22cb46514610872578063aef027721461089b578063b88d4fde146108c6578063c87b56dd146108ef578063cf3090121461092c578063d96a094a146109575761027d565b806383a9e0491161011357806383a9e0491461074e5780638462151c146107795780638da5cb5b146107b657806395d89b41146107e15780639b76f2511461080c5780639bf80316146108355761027d565b806370a082311461068f578063715018a6146106cc5780637bffb4ce146106e35780637e27f572146106fa5780637e80fc4e146107255761027d565b806321dd7d6c116101f357806342842e0e116101ac57806342842e0e1461055b5780634f6ccce71461058457806355f804b3146105c15780635ce7af1f146105ea5780636352211e146106275780636d29e32f146106645761027d565b806321dd7d6c1461046157806323b872dd1461048c57806324a911f1146104b55780632f745c59146104de57806331b555881461051b5780633ccfd60b146105445761027d565b8063095ea7b311610245578063095ea7b314610367578063110019fc14610390578063163e1e61146103b957806318160ddd146103e2578063193995301461040d57806319e0dcfb146104365761027d565b806301ffc9a714610282578063046dc166146102bf578063049c5c49146102e857806306fdde03146102ff578063081812fc1461032a575b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a49190613d21565b610a74565b6040516102b691906145a9565b60405180910390f35b3480156102cb57600080fd5b506102e660048036038101906102e19190613ae4565b610aee565b005b3480156102f457600080fd5b506102fd610bae565b005b34801561030b57600080fd5b50610314610c56565b6040516103219190614609565b60405180910390f35b34801561033657600080fd5b50610351600480360381019061034c9190613e24565b610ce8565b60405161035e9190614520565b60405180910390f35b34801561037357600080fd5b5061038e60048036038101906103899190613c67565b610d6d565b005b34801561039c57600080fd5b506103b760048036038101906103b29190613e24565b610e85565b005b3480156103c557600080fd5b506103e060048036038101906103db9190613ca7565b610f0b565b005b3480156103ee57600080fd5b506103f761104b565b60405161040491906149eb565b60405180910390f35b34801561041957600080fd5b50610434600480360381019061042f9190613e24565b611058565b005b34801561044257600080fd5b5061044b6110de565b60405161045891906149eb565b60405180910390f35b34801561046d57600080fd5b506104766110e4565b60405161048391906149eb565b60405180910390f35b34801561049857600080fd5b506104b360048036038101906104ae9190613b51565b6110ea565b005b3480156104c157600080fd5b506104dc60048036038101906104d79190613e24565b61114a565b005b3480156104ea57600080fd5b5061050560048036038101906105009190613c67565b6111d0565b60405161051291906149eb565b60405180910390f35b34801561052757600080fd5b50610542600480360381019061053d9190613e24565b611275565b005b34801561055057600080fd5b506105596112fb565b005b34801561056757600080fd5b50610582600480360381019061057d9190613b51565b6113dd565b005b34801561059057600080fd5b506105ab60048036038101906105a69190613e24565b6113fd565b6040516105b891906149eb565b60405180910390f35b3480156105cd57600080fd5b506105e860048036038101906105e39190613dd7565b61146e565b005b3480156105f657600080fd5b50610611600480360381019061060c9190613ae4565b611550565b60405161061e91906149eb565b60405180910390f35b34801561063357600080fd5b5061064e60048036038101906106499190613e24565b611599565b60405161065b9190614520565b60405180910390f35b34801561067057600080fd5b5061067961164b565b60405161068691906149eb565b60405180910390f35b34801561069b57600080fd5b506106b660048036038101906106b19190613ae4565b611651565b6040516106c391906149eb565b60405180910390f35b3480156106d857600080fd5b506106e1611709565b005b3480156106ef57600080fd5b506106f8611791565b005b34801561070657600080fd5b5061070f611839565b60405161071c91906149eb565b60405180910390f35b34801561073157600080fd5b5061074c60048036038101906107479190613cf4565b61183f565b005b34801561075a57600080fd5b506107636118d8565b60405161077091906145a9565b60405180910390f35b34801561078557600080fd5b506107a0600480360381019061079b9190613ae4565b6118eb565b6040516107ad9190614587565b60405180910390f35b3480156107c257600080fd5b506107cb611999565b6040516107d89190614520565b60405180910390f35b3480156107ed57600080fd5b506107f66119c3565b6040516108039190614609565b60405180910390f35b34801561081857600080fd5b50610833600480360381019061082e9190613e24565b611a55565b005b34801561084157600080fd5b5061085c60048036038101906108579190613ae4565b611adb565b60405161086991906149eb565b60405180910390f35b34801561087e57600080fd5b5061089960048036038101906108949190613c27565b611af3565b005b3480156108a757600080fd5b506108b0611c74565b6040516108bd91906149eb565b60405180910390f35b3480156108d257600080fd5b506108ed60048036038101906108e89190613ba4565b611c7a565b005b3480156108fb57600080fd5b5061091660048036038101906109119190613e24565b611cdc565b6040516109239190614609565b60405180910390f35b34801561093857600080fd5b50610941611d58565b60405161094e91906145a9565b60405180910390f35b610971600480360381019061096c9190613e24565b611d6b565b005b34801561097f57600080fd5b50610988611ee5565b60405161099591906145a9565b60405180910390f35b3480156109aa57600080fd5b506109b3611ef8565b6040516109c091906149eb565b60405180910390f35b3480156109d557600080fd5b506109f060048036038101906109eb9190613b11565b611efe565b6040516109fd91906145a9565b60405180910390f35b348015610a1257600080fd5b50610a2d6004803603810190610a289190613ae4565b611f92565b005b348015610a3b57600080fd5b50610a566004803603810190610a519190613e24565b61208a565b005b610a726004803603810190610a6d9190613d7b565b61219c565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ae75750610ae6826123a8565b5b9050919050565b610af661248a565b73ffffffffffffffffffffffffffffffffffffffff16610b14611999565b73ffffffffffffffffffffffffffffffffffffffff1614610b6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b61906148ab565b60405180910390fd5b80601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610bb661248a565b73ffffffffffffffffffffffffffffffffffffffff16610bd4611999565b73ffffffffffffffffffffffffffffffffffffffff1614610c2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c21906148ab565b60405180910390fd5b601360159054906101000a900460ff1615601360156101000a81548160ff021916908315150217905550565b606060008054610c6590614ccf565b80601f0160208091040260200160405190810160405280929190818152602001828054610c9190614ccf565b8015610cde5780601f10610cb357610100808354040283529160200191610cde565b820191906000526020600020905b815481529060010190602001808311610cc157829003601f168201915b5050505050905090565b6000610cf382612492565b610d32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d299061488b565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d7882611599565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610de9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de09061492b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e0861248a565b73ffffffffffffffffffffffffffffffffffffffff161480610e375750610e3681610e3161248a565b611efe565b5b610e76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6d906147eb565b60405180910390fd5b610e8083836124fe565b505050565b610e8d61248a565b73ffffffffffffffffffffffffffffffffffffffff16610eab611999565b73ffffffffffffffffffffffffffffffffffffffff1614610f01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef8906148ab565b60405180910390fd5b80600d8190555050565b610f1361248a565b73ffffffffffffffffffffffffffffffffffffffff16610f31611999565b73ffffffffffffffffffffffffffffffffffffffff1614610f87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7e906148ab565b60405180910390fd5b600b5482829050610f9661104b565b610fa09190614aed565b1115610fe1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd89061494b565b60405180910390fd5b60005b828290508110156110465761103383838381811061100557611004614ec5565b5b905060200201602081019061101a9190613ae4565b600161102461104b565b61102e9190614aed565b6125b7565b808061103e90614d32565b915050610fe4565b505050565b6000600880549050905090565b61106061248a565b73ffffffffffffffffffffffffffffffffffffffff1661107e611999565b73ffffffffffffffffffffffffffffffffffffffff16146110d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cb906148ab565b60405180910390fd5b80600b8190555050565b600b5481565b60105481565b6110fb6110f561248a565b826125d5565b61113a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111319061496b565b60405180910390fd5b6111458383836126b3565b505050565b61115261248a565b73ffffffffffffffffffffffffffffffffffffffff16611170611999565b73ffffffffffffffffffffffffffffffffffffffff16146111c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111bd906148ab565b60405180910390fd5b8060108190555050565b60006111db83611651565b821061121c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611213906146cb565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61127d61248a565b73ffffffffffffffffffffffffffffffffffffffff1661129b611999565b73ffffffffffffffffffffffffffffffffffffffff16146112f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e8906148ab565b60405180910390fd5b80600c8190555050565b60004790506000811161130d57600080fd5b600073aa7484f5be0ad8b1f51684e79e432307a54e9a8d9050600060646005846113379190614b74565b6113419190614b43565b90508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611389573d6000803e3d6000fd5b50611392611999565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156113d7573d6000803e3d6000fd5b50505050565b6113f883838360405180602001604052806000815250611c7a565b505050565b600061140761104b565b8210611448576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143f9061498b565b60405180910390fd5b6008828154811061145c5761145b614ec5565b5b90600052602060002001549050919050565b61147661248a565b73ffffffffffffffffffffffffffffffffffffffff16611494611999565b73ffffffffffffffffffffffffffffffffffffffff16146114ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e1906148ab565b60405180910390fd5b601360169054906101000a900460ff161561153a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611531906148eb565b60405180910390fd5b81816012919061154b9291906138bc565b505050565b6000601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611642576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116399061482b565b60405180910390fd5b80915050919050565b600e5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b99061480b565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61171161248a565b73ffffffffffffffffffffffffffffffffffffffff1661172f611999565b73ffffffffffffffffffffffffffffffffffffffff1614611785576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177c906148ab565b60405180910390fd5b61178f600061290f565b565b61179961248a565b73ffffffffffffffffffffffffffffffffffffffff166117b7611999565b73ffffffffffffffffffffffffffffffffffffffff161461180d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611804906148ab565b60405180910390fd5b601360149054906101000a900460ff1615601360146101000a81548160ff021916908315150217905550565b600f5481565b61184761248a565b73ffffffffffffffffffffffffffffffffffffffff16611865611999565b73ffffffffffffffffffffffffffffffffffffffff16146118bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b2906148ab565b60405180910390fd5b80601360166101000a81548160ff02191690831515021790555050565b601360149054906101000a900460ff1681565b606060006118f883611651565b905060008167ffffffffffffffff81111561191657611915614ef4565b5b6040519080825280602002602001820160405280156119445781602001602082028036833780820191505090505b50905060005b8281101561198e5761195c85826111d0565b82828151811061196f5761196e614ec5565b5b602002602001018181525050808061198690614d32565b91505061194a565b508092505050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546119d290614ccf565b80601f01602080910402602001604051908101604052809291908181526020018280546119fe90614ccf565b8015611a4b5780601f10611a2057610100808354040283529160200191611a4b565b820191906000526020600020905b815481529060010190602001808311611a2e57829003601f168201915b5050505050905090565b611a5d61248a565b73ffffffffffffffffffffffffffffffffffffffff16611a7b611999565b73ffffffffffffffffffffffffffffffffffffffff1614611ad1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac8906148ab565b60405180910390fd5b80600f8190555050565b60116020528060005260406000206000915090505481565b611afb61248a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b609061476b565b60405180910390fd5b8060056000611b7661248a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611c2361248a565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c6891906145a9565b60405180910390a35050565b600d5481565b611c8b611c8561248a565b836125d5565b611cca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc19061496b565b60405180910390fd5b611cd6848484846129d5565b50505050565b6060611ce782612492565b611d26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1d9061490b565b60405180910390fd5b6012611d3183612a31565b604051602001611d429291906144d6565b6040516020818303038152906040529050919050565b601360169054906101000a900460ff1681565b601360159054906101000a900460ff16611dba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db1906147ab565b60405180910390fd5b600d54811115611dff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df69061468b565b60405180910390fd5b600b5481611e0b61104b565b611e159190614aed565b1115611e56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4d9061494b565b60405180910390fd5b3481600f54611e659190614b74565b1115611ea6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9d906149cb565b60405180910390fd5b60005b81811015611ee157611ece336001611ebf61104b565b611ec99190614aed565b6125b7565b8080611ed990614d32565b915050611ea9565b5050565b601360159054906101000a900460ff1681565b600c5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611f9a61248a565b73ffffffffffffffffffffffffffffffffffffffff16611fb8611999565b73ffffffffffffffffffffffffffffffffffffffff161461200e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612005906148ab565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561207e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120759061470b565b60405180910390fd5b6120878161290f565b50565b61209261248a565b73ffffffffffffffffffffffffffffffffffffffff166120b0611999565b73ffffffffffffffffffffffffffffffffffffffff1614612106576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120fd906148ab565b60405180910390fd5b600b548161211261104b565b61211c9190614aed565b111561215d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121549061494b565b60405180910390fd5b60005b818110156121985761218533600161217661104b565b6121809190614aed565b6125b7565b808061219090614d32565b915050612160565b5050565b601360149054906101000a900460ff166121eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e29061464b565b60405180910390fd5b6121f482612b92565b612233576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222a9061466b565b60405180910390fd5b600c5481601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546122819190614aed565b11156122c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b9906149ab565b60405180910390fd5b34816010546122d19190614b74565b1115612312576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612309906149cb565b60405180910390fd5b80601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123619190614aed565b9250508190555060005b818110156123a35761239033600161238161104b565b61238b9190614aed565b6125b7565b808061239b90614d32565b91505061236b565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061247357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612483575061248282612c86565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661257183611599565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6125d1828260405180602001604052806000815250612cf0565b5050565b60006125e082612492565b61261f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612616906147cb565b60405180910390fd5b600061262a83611599565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061269957508373ffffffffffffffffffffffffffffffffffffffff1661268184610ce8565b73ffffffffffffffffffffffffffffffffffffffff16145b806126aa57506126a98185611efe565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166126d382611599565b73ffffffffffffffffffffffffffffffffffffffff1614612729576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612720906148cb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612799576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127909061474b565b60405180910390fd5b6127a4838383612d4b565b6127af6000826124fe565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127ff9190614bce565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128569190614aed565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6129e08484846126b3565b6129ec84848484612e5f565b612a2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a22906146eb565b60405180910390fd5b50505050565b60606000821415612a79576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612b8d565b600082905060005b60008214612aab578080612a9490614d32565b915050600a82612aa49190614b43565b9150612a81565b60008167ffffffffffffffff811115612ac757612ac6614ef4565b5b6040519080825280601f01601f191660200182016040528015612af95781602001600182028036833780820191505090505b5090505b60008514612b8657600182612b129190614bce565b9150600a85612b219190614da9565b6030612b2d9190614aed565b60f81b818381518110612b4357612b42614ec5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612b7f9190614b43565b9450612afd565b8093505050505b919050565b600080336040518060400160405280600781526020017f7072697661746500000000000000000000000000000000000000000000000000815250604051602001612bdd9291906144ae565b60405160208183030381529060405280519060200120604051602001612c0391906144fa565b604051602081830303815290604052805190602001209050612c2e8382612ff690919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff16601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612cfa838361301d565b612d076000848484612e5f565b612d46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3d906146eb565b60405180910390fd5b505050565b612d568383836131eb565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612d9957612d94816131f0565b612dd8565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612dd757612dd68382613239565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e1b57612e16816133a6565b612e5a565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612e5957612e588282613477565b5b5b505050565b6000612e808473ffffffffffffffffffffffffffffffffffffffff166134f6565b15612fe9578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612ea961248a565b8786866040518563ffffffff1660e01b8152600401612ecb949392919061453b565b602060405180830381600087803b158015612ee557600080fd5b505af1925050508015612f1657506040513d601f19601f82011682018060405250810190612f139190613d4e565b60015b612f99573d8060008114612f46576040519150601f19603f3d011682016040523d82523d6000602084013e612f4b565b606091505b50600081511415612f91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f88906146eb565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612fee565b600190505b949350505050565b60008060006130058585613509565b915091506130128161358c565b819250505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561308d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130849061486b565b60405180910390fd5b61309681612492565b156130d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130cd9061472b565b60405180910390fd5b6130e260008383612d4b565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131329190614aed565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161324684611651565b6132509190614bce565b9050600060076000848152602001908152602001600020549050818114613335576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506133ba9190614bce565b90506000600960008481526020019081526020016000205490506000600883815481106133ea576133e9614ec5565b5b90600052602060002001549050806008838154811061340c5761340b614ec5565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061345b5761345a614e96565b5b6001900381819060005260206000200160009055905550505050565b600061348283611651565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b60008060418351141561354b5760008060006020860151925060408601519150606086015160001a905061353f87828585613761565b94509450505050613585565b60408351141561357c57600080602085015191506040850151905061357186838361386e565b935093505050613585565b60006002915091505b9250929050565b600060048111156135a05761359f614e38565b5b8160048111156135b3576135b2614e38565b5b14156135be5761375e565b600160048111156135d2576135d1614e38565b5b8160048111156135e5576135e4614e38565b5b1415613626576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161361d9061462b565b60405180910390fd5b6002600481111561363a57613639614e38565b5b81600481111561364d5761364c614e38565b5b141561368e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613685906146ab565b60405180910390fd5b600360048111156136a2576136a1614e38565b5b8160048111156136b5576136b4614e38565b5b14156136f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136ed9061478b565b60405180910390fd5b60048081111561370957613708614e38565b5b81600481111561371c5761371b614e38565b5b141561375d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137549061484b565b60405180910390fd5b5b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561379c576000600391509150613865565b601b8560ff16141580156137b45750601c8560ff1614155b156137c6576000600491509150613865565b6000600187878787604051600081526020016040526040516137eb94939291906145c4565b6020604051602081039080840390855afa15801561380d573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561385c57600060019250925050613865565b80600092509250505b94509492505050565b6000806000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85169150601b8560ff1c0190506138ae87828885613761565b935093505050935093915050565b8280546138c890614ccf565b90600052602060002090601f0160209004810192826138ea5760008555613931565b82601f1061390357803560ff1916838001178555613931565b82800160010185558215613931579182015b82811115613930578235825591602001919060010190613915565b5b50905061393e9190613942565b5090565b5b8082111561395b576000816000905550600101613943565b5090565b600061397261396d84614a2b565b614a06565b90508281526020810184848401111561398e5761398d614f32565b5b613999848285614c8d565b509392505050565b6000813590506139b0816156b6565b92915050565b60008083601f8401126139cc576139cb614f28565b5b8235905067ffffffffffffffff8111156139e9576139e8614f23565b5b602083019150836020820283011115613a0557613a04614f2d565b5b9250929050565b600081359050613a1b816156cd565b92915050565b600081359050613a30816156e4565b92915050565b600081519050613a45816156e4565b92915050565b600082601f830112613a6057613a5f614f28565b5b8135613a7084826020860161395f565b91505092915050565b60008083601f840112613a8f57613a8e614f28565b5b8235905067ffffffffffffffff811115613aac57613aab614f23565b5b602083019150836001820283011115613ac857613ac7614f2d565b5b9250929050565b600081359050613ade816156fb565b92915050565b600060208284031215613afa57613af9614f3c565b5b6000613b08848285016139a1565b91505092915050565b60008060408385031215613b2857613b27614f3c565b5b6000613b36858286016139a1565b9250506020613b47858286016139a1565b9150509250929050565b600080600060608486031215613b6a57613b69614f3c565b5b6000613b78868287016139a1565b9350506020613b89868287016139a1565b9250506040613b9a86828701613acf565b9150509250925092565b60008060008060808587031215613bbe57613bbd614f3c565b5b6000613bcc878288016139a1565b9450506020613bdd878288016139a1565b9350506040613bee87828801613acf565b925050606085013567ffffffffffffffff811115613c0f57613c0e614f37565b5b613c1b87828801613a4b565b91505092959194509250565b60008060408385031215613c3e57613c3d614f3c565b5b6000613c4c858286016139a1565b9250506020613c5d85828601613a0c565b9150509250929050565b60008060408385031215613c7e57613c7d614f3c565b5b6000613c8c858286016139a1565b9250506020613c9d85828601613acf565b9150509250929050565b60008060208385031215613cbe57613cbd614f3c565b5b600083013567ffffffffffffffff811115613cdc57613cdb614f37565b5b613ce8858286016139b6565b92509250509250929050565b600060208284031215613d0a57613d09614f3c565b5b6000613d1884828501613a0c565b91505092915050565b600060208284031215613d3757613d36614f3c565b5b6000613d4584828501613a21565b91505092915050565b600060208284031215613d6457613d63614f3c565b5b6000613d7284828501613a36565b91505092915050565b60008060408385031215613d9257613d91614f3c565b5b600083013567ffffffffffffffff811115613db057613daf614f37565b5b613dbc85828601613a4b565b9250506020613dcd85828601613acf565b9150509250929050565b60008060208385031215613dee57613ded614f3c565b5b600083013567ffffffffffffffff811115613e0c57613e0b614f37565b5b613e1885828601613a79565b92509250509250929050565b600060208284031215613e3a57613e39614f3c565b5b6000613e4884828501613acf565b91505092915050565b6000613e5d8383614481565b60208301905092915050565b613e7281614c02565b82525050565b613e89613e8482614c02565b614d7b565b82525050565b6000613e9a82614a81565b613ea48185614aaf565b9350613eaf83614a5c565b8060005b83811015613ee0578151613ec78882613e51565b9750613ed283614aa2565b925050600181019050613eb3565b5085935050505092915050565b613ef681614c14565b82525050565b613f0581614c20565b82525050565b613f1c613f1782614c20565b614d8d565b82525050565b6000613f2d82614a8c565b613f378185614ac0565b9350613f47818560208601614c9c565b613f5081614f41565b840191505092915050565b6000613f6682614a97565b613f708185614ad1565b9350613f80818560208601614c9c565b613f8981614f41565b840191505092915050565b6000613f9f82614a97565b613fa98185614ae2565b9350613fb9818560208601614c9c565b80840191505092915050565b60008154613fd281614ccf565b613fdc8186614ae2565b94506001821660008114613ff757600181146140085761403b565b60ff1983168652818601935061403b565b61401185614a6c565b60005b8381101561403357815481890152600182019150602081019050614014565b838801955050505b50505092915050565b6000614051601883614ad1565b915061405c82614f5f565b602082019050919050565b6000614074600e83614ad1565b915061407f82614f88565b602082019050919050565b6000614097601683614ad1565b91506140a282614fb1565b602082019050919050565b60006140ba601883614ad1565b91506140c582614fda565b602082019050919050565b60006140dd601f83614ad1565b91506140e882615003565b602082019050919050565b6000614100601c83614ae2565b915061410b8261502c565b601c82019050919050565b6000614123602b83614ad1565b915061412e82615055565b604082019050919050565b6000614146603283614ad1565b9150614151826150a4565b604082019050919050565b6000614169602683614ad1565b9150614174826150f3565b604082019050919050565b600061418c601c83614ad1565b915061419782615142565b602082019050919050565b60006141af602483614ad1565b91506141ba8261516b565b604082019050919050565b60006141d2601983614ad1565b91506141dd826151ba565b602082019050919050565b60006141f5602283614ad1565b9150614200826151e3565b604082019050919050565b6000614218600b83614ad1565b915061422382615232565b602082019050919050565b600061423b602c83614ad1565b91506142468261525b565b604082019050919050565b600061425e603883614ad1565b9150614269826152aa565b604082019050919050565b6000614281602a83614ad1565b915061428c826152f9565b604082019050919050565b60006142a4602983614ad1565b91506142af82615348565b604082019050919050565b60006142c7602283614ad1565b91506142d282615397565b604082019050919050565b60006142ea602083614ad1565b91506142f5826153e6565b602082019050919050565b600061430d602c83614ad1565b91506143188261540f565b604082019050919050565b6000614330602083614ad1565b915061433b8261545e565b602082019050919050565b6000614353602983614ad1565b915061435e82615487565b604082019050919050565b6000614376602483614ad1565b9150614381826154d6565b604082019050919050565b6000614399601f83614ad1565b91506143a482615525565b602082019050919050565b60006143bc602183614ad1565b91506143c78261554e565b604082019050919050565b60006143df600a83614ad1565b91506143ea8261559d565b602082019050919050565b6000614402603183614ad1565b915061440d826155c6565b604082019050919050565b6000614425602c83614ad1565b915061443082615615565b604082019050919050565b6000614448600c83614ad1565b915061445382615664565b602082019050919050565b600061446b601083614ad1565b91506144768261568d565b602082019050919050565b61448a81614c76565b82525050565b61449981614c76565b82525050565b6144a881614c80565b82525050565b60006144ba8285613e78565b6014820191506144ca8284613f94565b91508190509392505050565b60006144e28285613fc5565b91506144ee8284613f94565b91508190509392505050565b6000614505826140f3565b91506145118284613f0b565b60208201915081905092915050565b60006020820190506145356000830184613e69565b92915050565b60006080820190506145506000830187613e69565b61455d6020830186613e69565b61456a6040830185614490565b818103606083015261457c8184613f22565b905095945050505050565b600060208201905081810360008301526145a18184613e8f565b905092915050565b60006020820190506145be6000830184613eed565b92915050565b60006080820190506145d96000830187613efc565b6145e6602083018661449f565b6145f36040830185613efc565b6146006060830184613efc565b95945050505050565b600060208201905081810360008301526146238184613f5b565b905092915050565b6000602082019050818103600083015261464481614044565b9050919050565b6000602082019050818103600083015261466481614067565b9050919050565b600060208201905081810360008301526146848161408a565b9050919050565b600060208201905081810360008301526146a4816140ad565b9050919050565b600060208201905081810360008301526146c4816140d0565b9050919050565b600060208201905081810360008301526146e481614116565b9050919050565b6000602082019050818103600083015261470481614139565b9050919050565b600060208201905081810360008301526147248161415c565b9050919050565b600060208201905081810360008301526147448161417f565b9050919050565b60006020820190508181036000830152614764816141a2565b9050919050565b60006020820190508181036000830152614784816141c5565b9050919050565b600060208201905081810360008301526147a4816141e8565b9050919050565b600060208201905081810360008301526147c48161420b565b9050919050565b600060208201905081810360008301526147e48161422e565b9050919050565b6000602082019050818103600083015261480481614251565b9050919050565b6000602082019050818103600083015261482481614274565b9050919050565b6000602082019050818103600083015261484481614297565b9050919050565b60006020820190508181036000830152614864816142ba565b9050919050565b60006020820190508181036000830152614884816142dd565b9050919050565b600060208201905081810360008301526148a481614300565b9050919050565b600060208201905081810360008301526148c481614323565b9050919050565b600060208201905081810360008301526148e481614346565b9050919050565b6000602082019050818103600083015261490481614369565b9050919050565b600060208201905081810360008301526149248161438c565b9050919050565b60006020820190508181036000830152614944816143af565b9050919050565b60006020820190508181036000830152614964816143d2565b9050919050565b60006020820190508181036000830152614984816143f5565b9050919050565b600060208201905081810360008301526149a481614418565b9050919050565b600060208201905081810360008301526149c48161443b565b9050919050565b600060208201905081810360008301526149e48161445e565b9050919050565b6000602082019050614a006000830184614490565b92915050565b6000614a10614a21565b9050614a1c8282614d01565b919050565b6000604051905090565b600067ffffffffffffffff821115614a4657614a45614ef4565b5b614a4f82614f41565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614af882614c76565b9150614b0383614c76565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614b3857614b37614dda565b5b828201905092915050565b6000614b4e82614c76565b9150614b5983614c76565b925082614b6957614b68614e09565b5b828204905092915050565b6000614b7f82614c76565b9150614b8a83614c76565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614bc357614bc2614dda565b5b828202905092915050565b6000614bd982614c76565b9150614be483614c76565b925082821015614bf757614bf6614dda565b5b828203905092915050565b6000614c0d82614c56565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614cba578082015181840152602081019050614c9f565b83811115614cc9576000848401525b50505050565b60006002820490506001821680614ce757607f821691505b60208210811415614cfb57614cfa614e67565b5b50919050565b614d0a82614f41565b810181811067ffffffffffffffff82111715614d2957614d28614ef4565b5b80604052505050565b6000614d3d82614c76565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614d7057614d6f614dda565b5b600182019050919050565b6000614d8682614d97565b9050919050565b6000819050919050565b6000614da282614f52565b9050919050565b6000614db482614c76565b9150614dbf83614c76565b925082614dcf57614dce614e09565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f50524553414c455f434c4f534544000000000000000000000000000000000000600082015250565b7f4449524543545f4d494e545f444953414c4c4f57454400000000000000000000600082015250565b7f5452414e53414354494f4e204c494d4954204558434545440000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f53414c455f434c4f534544000000000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f436f6e7472616374206d65746164617461206d6574686f647320617265206c6f60008201527f636b656400000000000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f74207175657279206e6f6e2d6578697374656e7420746f6b656e00600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4558434545445f4d415800000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4558434545445f414c4c4f430000000000000000000000000000000000000000600082015250565b7f494e53554646494349454e545f45544800000000000000000000000000000000600082015250565b6156bf81614c02565b81146156ca57600080fd5b50565b6156d681614c14565b81146156e157600080fd5b50565b6156ed81614c2a565b81146156f857600080fd5b50565b61570481614c76565b811461570f57600080fd5b5056fea2646970667358221220d603624c45de93b61676ed5091dc47709b12e8e0302fbc58d5978a910572323064736f6c63430008070033

Deployed Bytecode Sourcemap

51746:5465:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38418:272;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56742:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56646:86;;;;;;;;;;;;;:::i;:::-;;25877:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27524:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27050:408;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53378:153;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53879:278;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39167:110;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52852:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51861:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52171:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28528:373;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53102:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38774:317;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53233:137;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55925:369;;;;;;;;;;;;;:::i;:::-;;28972:182;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39354:294;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56849:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56302:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25507:303;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52056:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25173:272;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9335:94;;;;;;;;;;;;;:::i;:::-;;56543:95;;;;;;;;;;;;;:::i;:::-;;52101:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56437:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52600:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54937:345;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8684:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26046:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52967:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52238:54;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27881:315;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51996:53;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29225:362;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56965:241;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52657:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54165:494;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52630:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51913:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28267:194;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9584:229;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54667:262;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55290:627;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38418:272;38545:4;38598:35;38583:50;;;:11;:50;;;;:99;;;;38646:36;38670:11;38646:23;:36::i;:::-;38583:99;38567:115;;38418:272;;;:::o;56742:99::-;8915:12;:10;:12::i;:::-;8904:23;;:7;:5;:7::i;:::-;:23;;;8896:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56829:4:::1;56812:14;;:21;;;;;;;;;;;;;;;;;;56742:99:::0;:::o;56646:86::-;8915:12;:10;:12::i;:::-;8904:23;;:7;:5;:7::i;:::-;:23;;;8896:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56716:8:::1;;;;;;;;;;;56715:9;56704:8;;:20;;;;;;;;;;;;;;;;;;56646:86::o:0;25877:100::-;25931:13;25964:5;25957:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25877:100;:::o;27524:285::-;27622:7;27669:16;27677:7;27669;:16::i;:::-;27647:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;27777:15;:24;27793:7;27777:24;;;;;;;;;;;;;;;;;;;;;27770:31;;27524:285;;;:::o;27050:408::-;27128:13;27144:23;27159:7;27144:14;:23::i;:::-;27128:39;;27192:5;27186:11;;:2;:11;;;;27178:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;27286:5;27270:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;27295:37;27312:5;27319:12;:10;:12::i;:::-;27295:16;:37::i;:::-;27270:62;27248:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;27429:21;27438:2;27442:7;27429:8;:21::i;:::-;27117:341;27050:408;;:::o;53378:153::-;8915:12;:10;:12::i;:::-;8904:23;;:7;:5;:7::i;:::-;:23;;;8896:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53514:9:::1;53474:37;:49;;;;53378:153:::0;:::o;53879:278::-;8915:12;:10;:12::i;:::-;8904:23;;:7;:5;:7::i;:::-;:23;;;8896:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53997:14:::1;;53977:9;;:16;;53961:13;:11;:13::i;:::-;:32;;;;:::i;:::-;:50;;53953:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;54042:6;54037:113;54058:9;;:16;;54054:1;:20;54037:113;;;54096:42;54106:9;;54116:1;54106:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;54136:1;54120:13;:11;:13::i;:::-;:17;;;;:::i;:::-;54096:9;:42::i;:::-;54076:3;;;;;:::i;:::-;;;;54037:113;;;;53879:278:::0;;:::o;39167:110::-;39228:4;39252:10;:17;;;;39245:24;;39167:110;:::o;52852:107::-;8915:12;:10;:12::i;:::-;8904:23;;:7;:5;:7::i;:::-;:23;;;8896:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52942:9:::1;52925:14;:26;;;;52852:107:::0;:::o;51861:33::-;;;;:::o;52171:43::-;;;;:::o;28528:373::-;28734:41;28753:12;:10;:12::i;:::-;28767:7;28734:18;:41::i;:::-;28712:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;28865:28;28875:4;28881:2;28885:7;28865:9;:28::i;:::-;28528:373;;;:::o;53102:123::-;8915:12;:10;:12::i;:::-;8904:23;;:7;:5;:7::i;:::-;:23;;;8896:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53204:13:::1;53183:18;:34;;;;53102:123:::0;:::o;38774:317::-;38893:4;38945:23;38962:5;38945:16;:23::i;:::-;38937:5;:31;38915:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;39057:12;:19;39070:5;39057:19;;;;;;;;;;;;;;;:26;39077:5;39057:26;;;;;;;;;;;;39050:33;;38774:317;;;;:::o;53233:137::-;8915:12;:10;:12::i;:::-;8904:23;;:7;:5;:7::i;:::-;:23;;;8896:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53353:9:::1;53321:29;:41;;;;53233:137:::0;:::o;55925:369::-;55965:12;55980:21;55965:36;;56030:1;56020:7;:11;56012:20;;;;;;56043:29;56084:42;56043:84;;56138:18;56175:3;56170:1;56161:7;:11;;;;:::i;:::-;56160:19;;;;:::i;:::-;56138:41;;56190:13;:22;;:37;56213:13;56190:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56246:7;:5;:7::i;:::-;56238:25;;:48;56264:21;56238:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55954:340;;;55925:369::o;28972:182::-;29107:39;29124:4;29130:2;29134:7;29107:39;;;;;;;;;;;;:16;:39::i;:::-;28972:182;;;:::o;39354:294::-;39451:4;39503:30;:28;:30::i;:::-;39495:5;:38;39473:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;39623:10;39634:5;39623:17;;;;;;;;:::i;:::-;;;;;;;;;;39616:24;;39354:294;;;:::o;56849:108::-;8915:12;:10;:12::i;:::-;8904:23;;:7;:5;:7::i;:::-;:23;;;8896:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52723:6:::1;;;;;;;;;;;52722:7;52714:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;56946:3:::2;;56930:13;:19;;;;;;;:::i;:::-;;56849:108:::0;;:::o;56302:127::-;56370:4;56394:21;:27;56416:4;56394:27;;;;;;;;;;;;;;;;56387:34;;56302:127;;;:::o;25507:303::-;25601:7;25626:13;25642:7;:16;25650:7;25642:16;;;;;;;;;;;;;;;;;;;;;25626:32;;25708:1;25691:19;;:5;:19;;;;25669:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;25797:5;25790:12;;;25507:303;;;:::o;52056:36::-;;;;:::o;25173:272::-;25270:4;25331:1;25314:19;;:5;:19;;;;25292:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25421:9;:16;25431:5;25421:16;;;;;;;;;;;;;;;;25414:23;;25173:272;;;:::o;9335:94::-;8915:12;:10;:12::i;:::-;8904:23;;:7;:5;:7::i;:::-;:23;;;8896:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9400:21:::1;9418:1;9400:9;:21::i;:::-;9335:94::o:0;56543:95::-;8915:12;:10;:12::i;:::-;8904:23;;:7;:5;:7::i;:::-;:23;;;8896:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56619:11:::1;;;;;;;;;;;56618:12;56604:11;;:26;;;;;;;;;;;;;;;;;;56543:95::o:0;52101:45::-;;;;:::o;56437:96::-;8915:12;:10;:12::i;:::-;8904:23;;:7;:5;:7::i;:::-;:23;;;8896:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56515:10:::1;56506:6;;:19;;;;;;;;;;;;;;;;;;56437:96:::0;:::o;52600:23::-;;;;;;;;;;;;;:::o;54937:345::-;54997:16;55025:13;55041:17;55051:6;55041:9;:17::i;:::-;55025:33;;55069:23;55109:5;55095:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55069:46;;55131:13;55126:125;55158:5;55150;:13;55126:125;;;55205:34;55225:6;55233:5;55205:19;:34::i;:::-;55189:6;55196:5;55189:13;;;;;;;;:::i;:::-;;;;;;;:50;;;;;55165:7;;;;;:::i;:::-;;;;55126:125;;;;55268:6;55261:13;;;;54937:345;;;:::o;8684:87::-;8730:7;8757:6;;;;;;;;;;;8750:13;;8684:87;:::o;26046:104::-;26102:13;26135:7;26128:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26046:104;:::o;52967:127::-;8915:12;:10;:12::i;:::-;8904:23;;:7;:5;:7::i;:::-;:23;;;8896:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53072:14:::1;53050:19;:36;;;;52967:127:::0;:::o;52238:54::-;;;;;;;;;;;;;;;;;:::o;27881:315::-;28016:12;:10;:12::i;:::-;28004:24;;:8;:24;;;;27996:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;28116:8;28071:18;:32;28090:12;:10;:12::i;:::-;28071:32;;;;;;;;;;;;;;;:42;28104:8;28071:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;28169:8;28140:48;;28155:12;:10;:12::i;:::-;28140:48;;;28179:8;28140:48;;;;;;:::i;:::-;;;;;;;;27881:315;;:::o;51996:53::-;;;;:::o;29225:362::-;29411:41;29430:12;:10;:12::i;:::-;29444:7;29411:18;:41::i;:::-;29389:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;29540:39;29554:4;29560:2;29564:7;29573:5;29540:13;:39::i;:::-;29225:362;;;;:::o;56965:241::-;57035:13;57069:16;57077:7;57069;:16::i;:::-;57061:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;57163:13;57178:18;:7;:16;:18::i;:::-;57146:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57132:66;;56965:241;;;:::o;52657:18::-;;;;;;;;;;;;;:::o;54165:494::-;54235:8;;;;;;;;;;;54226:33;;;;;;;;;;;;:::i;:::-;;;;;;;;;54296:37;;54279:13;:54;;54270:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;54415:14;;54398:13;54382;:11;:13::i;:::-;:29;;;;:::i;:::-;:47;;54373:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;54503:9;54486:13;54464:19;;:35;;;;:::i;:::-;:48;;54455:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;54549:6;54544:108;54565:13;54561:1;:17;54544:108;;;54600:40;54610:10;54638:1;54622:13;:11;:13::i;:::-;:17;;;;:::i;:::-;54600:9;:40::i;:::-;54580:3;;;;;:::i;:::-;;;;54544:108;;;;54165:494;:::o;52630:20::-;;;;;;;;;;;;;:::o;51913:45::-;;;;:::o;28267:194::-;28389:4;28418:18;:25;28437:5;28418:25;;;;;;;;;;;;;;;:35;28444:8;28418:35;;;;;;;;;;;;;;;;;;;;;;;;;28411:42;;28267:194;;;;:::o;9584:229::-;8915:12;:10;:12::i;:::-;8904:23;;:7;:5;:7::i;:::-;:23;;;8896:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9707:1:::1;9687:22;;:8;:22;;;;9665:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;9786:19;9796:8;9786:9;:19::i;:::-;9584:229:::0;:::o;54667:262::-;8915:12;:10;:12::i;:::-;8904:23;;:7;:5;:7::i;:::-;:23;;;8896:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54779:14:::1;;54762:13;54746;:11;:13::i;:::-;:29;;;;:::i;:::-;:47;;54738:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;54823:6;54819:103;54839:13;54835:1;:17;54819:103;;;54870:40;54880:10;54908:1;54892:13;:11;:13::i;:::-;:17;;;;:::i;:::-;54870:9;:40::i;:::-;54854:3;;;;;:::i;:::-;;;;54819:103;;;;54667:262:::0;:::o;55290:627::-;55390:11;;;;;;;;;;;55382:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;55471:28;55489:9;55471:17;:28::i;:::-;55463:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;55598:29;;55581:13;55545:21;:33;55567:10;55545:33;;;;;;;;;;;;;;;;:49;;;;:::i;:::-;:82;;55537:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;55701:9;55684:13;55663:18;;:34;;;;:::i;:::-;:47;;55655:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;55779:13;55742:21;:33;55764:10;55742:33;;;;;;;;;;;;;;;;:50;;;;;;;:::i;:::-;;;;;;;;55807:6;55803:107;55823:13;55819:1;:17;55803:107;;;55858:40;55868:10;55896:1;55880:13;:11;:13::i;:::-;:17;;;;:::i;:::-;55858:9;:40::i;:::-;55838:3;;;;;:::i;:::-;;;;55803:107;;;;55290:627;;:::o;24786:323::-;24913:4;24966:25;24951:40;;;:11;:40;;;;:101;;;;25019:33;25004:48;;;:11;:48;;;;24951:101;:150;;;;25065:36;25089:11;25065:23;:36::i;:::-;24951:150;24935:166;;24786:323;;;:::o;1886:98::-;1939:7;1966:10;1959:17;;1886:98;:::o;31131:124::-;31193:4;31245:1;31217:30;;:7;:16;31225:7;31217:16;;;;;;;;;;;;;;;;;;;;;:30;;;;31210:37;;31131:124;;;:::o;35206:171::-;35305:2;35278:15;:24;35294:7;35278:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;35361:7;35357:2;35323:46;;35332:23;35347:7;35332:14;:23::i;:::-;35323:46;;;;;;;;;;;;35206:171;;:::o;32189:107::-;32262:26;32272:2;32276:7;32262:26;;;;;;;;;;;;:9;:26::i;:::-;32189:107;;:::o;31422:425::-;31532:4;31576:16;31584:7;31576;:16::i;:::-;31554:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;31675:13;31691:23;31706:7;31691:14;:23::i;:::-;31675:39;;31744:5;31733:16;;:7;:16;;;:60;;;;31786:7;31762:31;;:20;31774:7;31762:11;:20::i;:::-;:31;;;31733:60;:105;;;;31806:32;31823:5;31830:7;31806:16;:32::i;:::-;31733:105;31725:114;;;31422:425;;;;:::o;34476:612::-;34646:4;34619:31;;:23;34634:7;34619:14;:23::i;:::-;:31;;;34597:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;34752:1;34738:16;;:2;:16;;;;34730:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;34808:39;34829:4;34835:2;34839:7;34808:20;:39::i;:::-;34912:29;34929:1;34933:7;34912:8;:29::i;:::-;34973:1;34954:9;:15;34964:4;34954:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;35002:1;34985:9;:13;34995:2;34985:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;35033:2;35014:7;:16;35022:7;35014:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35072:7;35068:2;35053:27;;35062:4;35053:27;;;;;;;;;;;;34476:612;;;:::o;9821:173::-;9877:16;9896:6;;;;;;;;;;;9877:25;;9922:8;9913:6;;:17;;;;;;;;;;;;;;;;;;9977:8;9946:40;;9967:8;9946:40;;;;;;;;;;;;9866:128;9821:173;:::o;30469:349::-;30623:28;30633:4;30639:2;30643:7;30623:9;:28::i;:::-;30684:48;30707:4;30713:2;30717:7;30726:5;30684:22;:48::i;:::-;30662:148;;;;;;;;;;;;:::i;:::-;;;;;;;;;30469:349;;;;:::o;12079:711::-;12132:13;12362:1;12353:5;:10;12349:53;;;12380:10;;;;;;;;;;;;;;;;;;;;;12349:53;12412:9;12424:5;12412:17;;12440:11;12462:78;12477:1;12469:4;:9;12462:78;;12495:8;;;;;:::i;:::-;;;;12526:2;12518:10;;;;;:::i;:::-;;;12462:78;;;12550:19;12582:6;12572:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12550:39;;12600:151;12616:1;12607:5;:10;12600:151;;12644:1;12634:11;;;;;:::i;:::-;;;12708:2;12700:5;:10;;;;:::i;:::-;12690:2;:21;;;;:::i;:::-;12677:36;;12660:6;12667;12660:14;;;;;;;;:::i;:::-;;;;;:53;;;;;;;;;;;12737:2;12728:11;;;;;:::i;:::-;;;12600:151;;;12775:6;12761:21;;;;;12079:711;;;;:::o;53541:330::-;53613:4;53630:12;53770:10;53782:8;;;;;;;;;;;;;;;;;53753:38;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53743:49;;;;;;53655:138;;;;;;;;:::i;:::-;;;;;;;;;;;;;53645:159;;;;;;53630:174;;53840:23;53853:9;53840:4;:12;;:23;;;;:::i;:::-;53822:41;;:14;;;;;;;;;;;:41;;;53815:48;;;53541:330;;;:::o;11633:187::-;11743:4;11787:25;11772:40;;;:11;:40;;;;11765:47;;11633:187;;;:::o;32520:318::-;32647:18;32653:2;32657:7;32647:5;:18::i;:::-;32698:54;32729:1;32733:2;32737:7;32746:5;32698:22;:54::i;:::-;32676:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;32520:318;;;:::o;40261:586::-;40402:45;40429:4;40435:2;40439:7;40402:26;:45::i;:::-;40480:1;40464:18;;:4;:18;;;40460:187;;;40499:40;40531:7;40499:31;:40::i;:::-;40460:187;;;40569:2;40561:10;;:4;:10;;;40557:90;;40588:47;40621:4;40627:7;40588:32;:47::i;:::-;40557:90;40460:187;40675:1;40661:16;;:2;:16;;;40657:183;;;40694:45;40731:7;40694:36;:45::i;:::-;40657:183;;;40767:4;40761:10;;:2;:10;;;40757:83;;40788:40;40816:2;40820:7;40788:27;:40::i;:::-;40757:83;40657:183;40261:586;;;:::o;35939:953::-;36091:4;36112:15;:2;:13;;;:15::i;:::-;36108:777;;;36177:2;36161:36;;;36216:12;:10;:12::i;:::-;36247:4;36270:7;36296:5;36161:155;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36144:686;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36520:1;36503:6;:13;:18;36499:316;;;36546:104;;;;;;;;;;:::i;:::-;;;;;;;;36499:316;36765:6;36759:13;36750:6;36746:2;36742:15;36735:38;36144:686;36390:45;;;36380:55;;;:6;:55;;;;36373:62;;;;;36108:777;36869:4;36862:11;;35939:953;;;;;;;:::o;48961:231::-;49039:7;49060:17;49079:18;49101:27;49112:4;49118:9;49101:10;:27::i;:::-;49059:69;;;;49139:18;49151:5;49139:11;:18::i;:::-;49175:9;49168:16;;;;48961:231;;;;:::o;33174:379::-;33265:1;33251:16;;:2;:16;;;;33243:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;33324:16;33332:7;33324;:16::i;:::-;33323:17;33315:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;33386:45;33415:1;33419:2;33423:7;33386:20;:45::i;:::-;33461:1;33444:9;:13;33454:2;33444:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33492:2;33473:7;:16;33481:7;33473:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33537:7;33533:2;33512:33;;33529:1;33512:33;;;;;;;;;;;;33174:379;;:::o;37464:123::-;;;;:::o;41558:161::-;41659:10;:17;;;;41632:15;:24;41648:7;41632:24;;;;;;;;;;;:44;;;;41687:10;41703:7;41687:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41558:161;:::o;42343:986::-;42616:19;42663:1;42638:22;42655:4;42638:16;:22::i;:::-;:26;;;;:::i;:::-;42616:48;;42675:15;42693:17;:26;42711:7;42693:26;;;;;;;;;;;;42675:44;;42840:14;42826:10;:28;42822:325;;42871:16;42890:12;:18;42903:4;42890:18;;;;;;;;;;;;;;;:34;42909:14;42890:34;;;;;;;;;;;;42871:53;;42974:11;42941:12;:18;42954:4;42941:18;;;;;;;;;;;;;;;:30;42960:10;42941:30;;;;;;;;;;;:44;;;;43091:10;43058:17;:30;43076:11;43058:30;;;;;;;;;;;:43;;;;42856:291;42822:325;43243:17;:26;43261:7;43243:26;;;;;;;;;;;43236:33;;;43287:12;:18;43300:4;43287:18;;;;;;;;;;;;;;;:34;43306:14;43287:34;;;;;;;;;;;43280:41;;;42431:898;;42343:986;;:::o;43621:1067::-;43871:19;43913:1;43893:10;:17;;;;:21;;;;:::i;:::-;43871:43;;43925:15;43943;:24;43959:7;43943:24;;;;;;;;;;;;43925:42;;44294:16;44313:10;44324:14;44313:26;;;;;;;;:::i;:::-;;;;;;;;;;44294:45;;44377:11;44352:10;44363;44352:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;44488:10;44457:15;:28;44473:11;44457:28;;;;;;;;;;;:41;;;;44629:15;:24;44645:7;44629:24;;;;;;;;;;;44622:31;;;44664:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;43689:999;;;43621:1067;:::o;41145:215::-;41227:11;41241:20;41258:2;41241:16;:20::i;:::-;41227:34;;41299:7;41272:12;:16;41285:2;41272:16;;;;;;;;;;;;;;;:24;41289:6;41272:24;;;;;;;;;;;:34;;;;41346:6;41317:17;:26;41335:7;41317:26;;;;;;;;;;;:35;;;;41216:144;41145:215;;:::o;14532:384::-;14592:4;14800:9;14864:7;14852:20;14844:28;;14907:1;14900:4;:8;14893:15;;;14532:384;;;:::o;46851:1308::-;46932:7;46941:12;47186:2;47166:9;:16;:22;47162:990;;;47205:9;47229;47253:7;47462:4;47451:9;47447:20;47441:27;47436:32;;47512:4;47501:9;47497:20;47491:27;47486:32;;47570:4;47559:9;47555:20;47549:27;47546:1;47541:36;47536:41;;47613:25;47624:4;47630:1;47633;47636;47613:10;:25::i;:::-;47606:32;;;;;;;;;47162:990;47680:2;47660:9;:16;:22;47656:496;;;47699:9;47723:10;47935:4;47924:9;47920:20;47914:27;47909:32;;47986:4;47975:9;47971:20;47965:27;47959:33;;48028:23;48039:4;48045:1;48048:2;48028:10;:23::i;:::-;48021:30;;;;;;;;47656:496;48100:1;48104:35;48084:56;;;;46851:1308;;;;;;:::o;45122:643::-;45200:20;45191:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;45187:571;;;45237:7;;45187:571;45298:29;45289:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;45285:473;;;45344:34;;;;;;;;;;:::i;:::-;;;;;;;;45285:473;45409:35;45400:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;45396:362;;;45461:41;;;;;;;;;;:::i;:::-;;;;;;;;45396:362;45533:30;45524:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;45520:238;;;45580:44;;;;;;;;;;:::i;:::-;;;;;;;;45520:238;45655:30;45646:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;45642:116;;;45702:44;;;;;;;;;;:::i;:::-;;;;;;;;45642:116;45122:643;;:::o;50288:748::-;50419:7;50428:12;50469:66;50464:1;50459:7;;:76;50455:160;;;50568:1;50572:30;50552:51;;;;;;50455:160;50634:2;50629:1;:7;;;;:18;;;;;50645:2;50640:1;:7;;;;50629:18;50625:102;;;50680:1;50684:30;50664:51;;;;;;50625:102;50824:14;50841:24;50851:4;50857:1;50860;50863;50841:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50824:41;;50898:1;50880:20;;:6;:20;;;50876:103;;;50933:1;50937:29;50917:50;;;;;;;50876:103;50999:6;51007:20;50991:37;;;;;50288:748;;;;;;;;:::o;49455:391::-;49569:7;49578:12;49603:9;49623:7;49678:66;49674:2;49670:75;49665:80;;49782:2;49777;49772:3;49768:12;49764:21;49759:26;;49813:25;49824:4;49830:1;49833;49836;49813:10;:25::i;:::-;49806:32;;;;;;49455:391;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;585:568::-;658:8;668:6;718:3;711:4;703:6;699:17;695:27;685:122;;726:79;;:::i;:::-;685:122;839:6;826:20;816:30;;869:18;861:6;858:30;855:117;;;891:79;;:::i;:::-;855:117;1005:4;997:6;993:17;981:29;;1059:3;1051:4;1043:6;1039:17;1029:8;1025:32;1022:41;1019:128;;;1066:79;;:::i;:::-;1019:128;585:568;;;;;:::o;1159:133::-;1202:5;1240:6;1227:20;1218:29;;1256:30;1280:5;1256:30;:::i;:::-;1159:133;;;;:::o;1298:137::-;1343:5;1381:6;1368:20;1359:29;;1397:32;1423:5;1397:32;:::i;:::-;1298:137;;;;:::o;1441:141::-;1497:5;1528:6;1522:13;1513:22;;1544:32;1570:5;1544:32;:::i;:::-;1441:141;;;;:::o;1601:338::-;1656:5;1705:3;1698:4;1690:6;1686:17;1682:27;1672:122;;1713:79;;:::i;:::-;1672:122;1830:6;1817:20;1855:78;1929:3;1921:6;1914:4;1906:6;1902:17;1855:78;:::i;:::-;1846:87;;1662:277;1601:338;;;;:::o;1959:553::-;2017:8;2027:6;2077:3;2070:4;2062:6;2058:17;2054:27;2044:122;;2085:79;;:::i;:::-;2044:122;2198:6;2185:20;2175:30;;2228:18;2220:6;2217:30;2214:117;;;2250:79;;:::i;:::-;2214:117;2364:4;2356:6;2352:17;2340:29;;2418:3;2410:4;2402:6;2398:17;2388:8;2384:32;2381:41;2378:128;;;2425:79;;:::i;:::-;2378:128;1959:553;;;;;:::o;2518:139::-;2564:5;2602:6;2589:20;2580:29;;2618:33;2645:5;2618:33;:::i;:::-;2518:139;;;;:::o;2663:329::-;2722:6;2771:2;2759:9;2750:7;2746:23;2742:32;2739:119;;;2777:79;;:::i;:::-;2739:119;2897:1;2922:53;2967:7;2958:6;2947:9;2943:22;2922:53;:::i;:::-;2912:63;;2868:117;2663:329;;;;:::o;2998:474::-;3066:6;3074;3123:2;3111:9;3102:7;3098:23;3094:32;3091:119;;;3129:79;;:::i;:::-;3091:119;3249:1;3274:53;3319:7;3310:6;3299:9;3295:22;3274:53;:::i;:::-;3264:63;;3220:117;3376:2;3402:53;3447:7;3438:6;3427:9;3423:22;3402:53;:::i;:::-;3392:63;;3347:118;2998:474;;;;;:::o;3478:619::-;3555:6;3563;3571;3620:2;3608:9;3599:7;3595:23;3591:32;3588:119;;;3626:79;;:::i;:::-;3588:119;3746:1;3771:53;3816:7;3807:6;3796:9;3792:22;3771:53;:::i;:::-;3761:63;;3717:117;3873:2;3899:53;3944:7;3935:6;3924:9;3920:22;3899:53;:::i;:::-;3889:63;;3844:118;4001:2;4027:53;4072:7;4063:6;4052:9;4048:22;4027:53;:::i;:::-;4017:63;;3972:118;3478:619;;;;;:::o;4103:943::-;4198:6;4206;4214;4222;4271:3;4259:9;4250:7;4246:23;4242:33;4239:120;;;4278:79;;:::i;:::-;4239:120;4398:1;4423:53;4468:7;4459:6;4448:9;4444:22;4423:53;:::i;:::-;4413:63;;4369:117;4525:2;4551:53;4596:7;4587:6;4576:9;4572:22;4551:53;:::i;:::-;4541:63;;4496:118;4653:2;4679:53;4724:7;4715:6;4704:9;4700:22;4679:53;:::i;:::-;4669:63;;4624:118;4809:2;4798:9;4794:18;4781:32;4840:18;4832:6;4829:30;4826:117;;;4862:79;;:::i;:::-;4826:117;4967:62;5021:7;5012:6;5001:9;4997:22;4967:62;:::i;:::-;4957:72;;4752:287;4103:943;;;;;;;:::o;5052:468::-;5117:6;5125;5174:2;5162:9;5153:7;5149:23;5145:32;5142:119;;;5180:79;;:::i;:::-;5142:119;5300:1;5325:53;5370:7;5361:6;5350:9;5346:22;5325:53;:::i;:::-;5315:63;;5271:117;5427:2;5453:50;5495:7;5486:6;5475:9;5471:22;5453:50;:::i;:::-;5443:60;;5398:115;5052:468;;;;;:::o;5526:474::-;5594:6;5602;5651:2;5639:9;5630:7;5626:23;5622:32;5619:119;;;5657:79;;:::i;:::-;5619:119;5777:1;5802:53;5847:7;5838:6;5827:9;5823:22;5802:53;:::i;:::-;5792:63;;5748:117;5904:2;5930:53;5975:7;5966:6;5955:9;5951:22;5930:53;:::i;:::-;5920:63;;5875:118;5526:474;;;;;:::o;6006:559::-;6092:6;6100;6149:2;6137:9;6128:7;6124:23;6120:32;6117:119;;;6155:79;;:::i;:::-;6117:119;6303:1;6292:9;6288:17;6275:31;6333:18;6325:6;6322:30;6319:117;;;6355:79;;:::i;:::-;6319:117;6468:80;6540:7;6531:6;6520:9;6516:22;6468:80;:::i;:::-;6450:98;;;;6246:312;6006:559;;;;;:::o;6571:323::-;6627:6;6676:2;6664:9;6655:7;6651:23;6647:32;6644:119;;;6682:79;;:::i;:::-;6644:119;6802:1;6827:50;6869:7;6860:6;6849:9;6845:22;6827:50;:::i;:::-;6817:60;;6773:114;6571:323;;;;:::o;6900:327::-;6958:6;7007:2;6995:9;6986:7;6982:23;6978:32;6975:119;;;7013:79;;:::i;:::-;6975:119;7133:1;7158:52;7202:7;7193:6;7182:9;7178:22;7158:52;:::i;:::-;7148:62;;7104:116;6900:327;;;;:::o;7233:349::-;7302:6;7351:2;7339:9;7330:7;7326:23;7322:32;7319:119;;;7357:79;;:::i;:::-;7319:119;7477:1;7502:63;7557:7;7548:6;7537:9;7533:22;7502:63;:::i;:::-;7492:73;;7448:127;7233:349;;;;:::o;7588:652::-;7665:6;7673;7722:2;7710:9;7701:7;7697:23;7693:32;7690:119;;;7728:79;;:::i;:::-;7690:119;7876:1;7865:9;7861:17;7848:31;7906:18;7898:6;7895:30;7892:117;;;7928:79;;:::i;:::-;7892:117;8033:62;8087:7;8078:6;8067:9;8063:22;8033:62;:::i;:::-;8023:72;;7819:286;8144:2;8170:53;8215:7;8206:6;8195:9;8191:22;8170:53;:::i;:::-;8160:63;;8115:118;7588:652;;;;;:::o;8246:529::-;8317:6;8325;8374:2;8362:9;8353:7;8349:23;8345:32;8342:119;;;8380:79;;:::i;:::-;8342:119;8528:1;8517:9;8513:17;8500:31;8558:18;8550:6;8547:30;8544:117;;;8580:79;;:::i;:::-;8544:117;8693:65;8750:7;8741:6;8730:9;8726:22;8693:65;:::i;:::-;8675:83;;;;8471:297;8246:529;;;;;:::o;8781:329::-;8840:6;8889:2;8877:9;8868:7;8864:23;8860:32;8857:119;;;8895:79;;:::i;:::-;8857:119;9015:1;9040:53;9085:7;9076:6;9065:9;9061:22;9040:53;:::i;:::-;9030:63;;8986:117;8781:329;;;;:::o;9116:179::-;9185:10;9206:46;9248:3;9240:6;9206:46;:::i;:::-;9284:4;9279:3;9275:14;9261:28;;9116:179;;;;:::o;9301:118::-;9388:24;9406:5;9388:24;:::i;:::-;9383:3;9376:37;9301:118;;:::o;9425:157::-;9530:45;9550:24;9568:5;9550:24;:::i;:::-;9530:45;:::i;:::-;9525:3;9518:58;9425:157;;:::o;9618:732::-;9737:3;9766:54;9814:5;9766:54;:::i;:::-;9836:86;9915:6;9910:3;9836:86;:::i;:::-;9829:93;;9946:56;9996:5;9946:56;:::i;:::-;10025:7;10056:1;10041:284;10066:6;10063:1;10060:13;10041:284;;;10142:6;10136:13;10169:63;10228:3;10213:13;10169:63;:::i;:::-;10162:70;;10255:60;10308:6;10255:60;:::i;:::-;10245:70;;10101:224;10088:1;10085;10081:9;10076:14;;10041:284;;;10045:14;10341:3;10334:10;;9742:608;;;9618:732;;;;:::o;10356:109::-;10437:21;10452:5;10437:21;:::i;:::-;10432:3;10425:34;10356:109;;:::o;10471:118::-;10558:24;10576:5;10558:24;:::i;:::-;10553:3;10546:37;10471:118;;:::o;10595:157::-;10700:45;10720:24;10738:5;10720:24;:::i;:::-;10700:45;:::i;:::-;10695:3;10688:58;10595:157;;:::o;10758:360::-;10844:3;10872:38;10904:5;10872:38;:::i;:::-;10926:70;10989:6;10984:3;10926:70;:::i;:::-;10919:77;;11005:52;11050:6;11045:3;11038:4;11031:5;11027:16;11005:52;:::i;:::-;11082:29;11104:6;11082:29;:::i;:::-;11077:3;11073:39;11066:46;;10848:270;10758:360;;;;:::o;11124:364::-;11212:3;11240:39;11273:5;11240:39;:::i;:::-;11295:71;11359:6;11354:3;11295:71;:::i;:::-;11288:78;;11375:52;11420:6;11415:3;11408:4;11401:5;11397:16;11375:52;:::i;:::-;11452:29;11474:6;11452:29;:::i;:::-;11447:3;11443:39;11436:46;;11216:272;11124:364;;;;:::o;11494:377::-;11600:3;11628:39;11661:5;11628:39;:::i;:::-;11683:89;11765:6;11760:3;11683:89;:::i;:::-;11676:96;;11781:52;11826:6;11821:3;11814:4;11807:5;11803:16;11781:52;:::i;:::-;11858:6;11853:3;11849:16;11842:23;;11604:267;11494:377;;;;:::o;11901:845::-;12004:3;12041:5;12035:12;12070:36;12096:9;12070:36;:::i;:::-;12122:89;12204:6;12199:3;12122:89;:::i;:::-;12115:96;;12242:1;12231:9;12227:17;12258:1;12253:137;;;;12404:1;12399:341;;;;12220:520;;12253:137;12337:4;12333:9;12322;12318:25;12313:3;12306:38;12373:6;12368:3;12364:16;12357:23;;12253:137;;12399:341;12466:38;12498:5;12466:38;:::i;:::-;12526:1;12540:154;12554:6;12551:1;12548:13;12540:154;;;12628:7;12622:14;12618:1;12613:3;12609:11;12602:35;12678:1;12669:7;12665:15;12654:26;;12576:4;12573:1;12569:12;12564:17;;12540:154;;;12723:6;12718:3;12714:16;12707:23;;12406:334;;12220:520;;12008:738;;11901:845;;;;:::o;12752:366::-;12894:3;12915:67;12979:2;12974:3;12915:67;:::i;:::-;12908:74;;12991:93;13080:3;12991:93;:::i;:::-;13109:2;13104:3;13100:12;13093:19;;12752:366;;;:::o;13124:::-;13266:3;13287:67;13351:2;13346:3;13287:67;:::i;:::-;13280:74;;13363:93;13452:3;13363:93;:::i;:::-;13481:2;13476:3;13472:12;13465:19;;13124:366;;;:::o;13496:::-;13638:3;13659:67;13723:2;13718:3;13659:67;:::i;:::-;13652:74;;13735:93;13824:3;13735:93;:::i;:::-;13853:2;13848:3;13844:12;13837:19;;13496:366;;;:::o;13868:::-;14010:3;14031:67;14095:2;14090:3;14031:67;:::i;:::-;14024:74;;14107:93;14196:3;14107:93;:::i;:::-;14225:2;14220:3;14216:12;14209:19;;13868:366;;;:::o;14240:::-;14382:3;14403:67;14467:2;14462:3;14403:67;:::i;:::-;14396:74;;14479:93;14568:3;14479:93;:::i;:::-;14597:2;14592:3;14588:12;14581:19;;14240:366;;;:::o;14612:402::-;14772:3;14793:85;14875:2;14870:3;14793:85;:::i;:::-;14786:92;;14887:93;14976:3;14887:93;:::i;:::-;15005:2;15000:3;14996:12;14989:19;;14612:402;;;:::o;15020:366::-;15162:3;15183:67;15247:2;15242:3;15183:67;:::i;:::-;15176:74;;15259:93;15348:3;15259:93;:::i;:::-;15377:2;15372:3;15368:12;15361:19;;15020:366;;;:::o;15392:::-;15534:3;15555:67;15619:2;15614:3;15555:67;:::i;:::-;15548:74;;15631:93;15720:3;15631:93;:::i;:::-;15749:2;15744:3;15740:12;15733:19;;15392:366;;;:::o;15764:::-;15906:3;15927:67;15991:2;15986:3;15927:67;:::i;:::-;15920:74;;16003:93;16092:3;16003:93;:::i;:::-;16121:2;16116:3;16112:12;16105:19;;15764:366;;;:::o;16136:::-;16278:3;16299:67;16363:2;16358:3;16299:67;:::i;:::-;16292:74;;16375:93;16464:3;16375:93;:::i;:::-;16493:2;16488:3;16484:12;16477:19;;16136:366;;;:::o;16508:::-;16650:3;16671:67;16735:2;16730:3;16671:67;:::i;:::-;16664:74;;16747:93;16836:3;16747:93;:::i;:::-;16865:2;16860:3;16856:12;16849:19;;16508:366;;;:::o;16880:::-;17022:3;17043:67;17107:2;17102:3;17043:67;:::i;:::-;17036:74;;17119:93;17208:3;17119:93;:::i;:::-;17237:2;17232:3;17228:12;17221:19;;16880:366;;;:::o;17252:::-;17394:3;17415:67;17479:2;17474:3;17415:67;:::i;:::-;17408:74;;17491:93;17580:3;17491:93;:::i;:::-;17609:2;17604:3;17600:12;17593:19;;17252:366;;;:::o;17624:::-;17766:3;17787:67;17851:2;17846:3;17787:67;:::i;:::-;17780:74;;17863:93;17952:3;17863:93;:::i;:::-;17981:2;17976:3;17972:12;17965:19;;17624:366;;;:::o;17996:::-;18138:3;18159:67;18223:2;18218:3;18159:67;:::i;:::-;18152:74;;18235:93;18324:3;18235:93;:::i;:::-;18353:2;18348:3;18344:12;18337:19;;17996:366;;;:::o;18368:::-;18510:3;18531:67;18595:2;18590:3;18531:67;:::i;:::-;18524:74;;18607:93;18696:3;18607:93;:::i;:::-;18725:2;18720:3;18716:12;18709:19;;18368:366;;;:::o;18740:::-;18882:3;18903:67;18967:2;18962:3;18903:67;:::i;:::-;18896:74;;18979:93;19068:3;18979:93;:::i;:::-;19097:2;19092:3;19088:12;19081:19;;18740:366;;;:::o;19112:::-;19254:3;19275:67;19339:2;19334:3;19275:67;:::i;:::-;19268:74;;19351:93;19440:3;19351:93;:::i;:::-;19469:2;19464:3;19460:12;19453:19;;19112:366;;;:::o;19484:::-;19626:3;19647:67;19711:2;19706:3;19647:67;:::i;:::-;19640:74;;19723:93;19812:3;19723:93;:::i;:::-;19841:2;19836:3;19832:12;19825:19;;19484:366;;;:::o;19856:::-;19998:3;20019:67;20083:2;20078:3;20019:67;:::i;:::-;20012:74;;20095:93;20184:3;20095:93;:::i;:::-;20213:2;20208:3;20204:12;20197:19;;19856:366;;;:::o;20228:::-;20370:3;20391:67;20455:2;20450:3;20391:67;:::i;:::-;20384:74;;20467:93;20556:3;20467:93;:::i;:::-;20585:2;20580:3;20576:12;20569:19;;20228:366;;;:::o;20600:::-;20742:3;20763:67;20827:2;20822:3;20763:67;:::i;:::-;20756:74;;20839:93;20928:3;20839:93;:::i;:::-;20957:2;20952:3;20948:12;20941:19;;20600:366;;;:::o;20972:::-;21114:3;21135:67;21199:2;21194:3;21135:67;:::i;:::-;21128:74;;21211:93;21300:3;21211:93;:::i;:::-;21329:2;21324:3;21320:12;21313:19;;20972:366;;;:::o;21344:::-;21486:3;21507:67;21571:2;21566:3;21507:67;:::i;:::-;21500:74;;21583:93;21672:3;21583:93;:::i;:::-;21701:2;21696:3;21692:12;21685:19;;21344:366;;;:::o;21716:::-;21858:3;21879:67;21943:2;21938:3;21879:67;:::i;:::-;21872:74;;21955:93;22044:3;21955:93;:::i;:::-;22073:2;22068:3;22064:12;22057:19;;21716:366;;;:::o;22088:::-;22230:3;22251:67;22315:2;22310:3;22251:67;:::i;:::-;22244:74;;22327:93;22416:3;22327:93;:::i;:::-;22445:2;22440:3;22436:12;22429:19;;22088:366;;;:::o;22460:::-;22602:3;22623:67;22687:2;22682:3;22623:67;:::i;:::-;22616:74;;22699:93;22788:3;22699:93;:::i;:::-;22817:2;22812:3;22808:12;22801:19;;22460:366;;;:::o;22832:::-;22974:3;22995:67;23059:2;23054:3;22995:67;:::i;:::-;22988:74;;23071:93;23160:3;23071:93;:::i;:::-;23189:2;23184:3;23180:12;23173:19;;22832:366;;;:::o;23204:::-;23346:3;23367:67;23431:2;23426:3;23367:67;:::i;:::-;23360:74;;23443:93;23532:3;23443:93;:::i;:::-;23561:2;23556:3;23552:12;23545:19;;23204:366;;;:::o;23576:::-;23718:3;23739:67;23803:2;23798:3;23739:67;:::i;:::-;23732:74;;23815:93;23904:3;23815:93;:::i;:::-;23933:2;23928:3;23924:12;23917:19;;23576:366;;;:::o;23948:::-;24090:3;24111:67;24175:2;24170:3;24111:67;:::i;:::-;24104:74;;24187:93;24276:3;24187:93;:::i;:::-;24305:2;24300:3;24296:12;24289:19;;23948:366;;;:::o;24320:108::-;24397:24;24415:5;24397:24;:::i;:::-;24392:3;24385:37;24320:108;;:::o;24434:118::-;24521:24;24539:5;24521:24;:::i;:::-;24516:3;24509:37;24434:118;;:::o;24558:112::-;24641:22;24657:5;24641:22;:::i;:::-;24636:3;24629:35;24558:112;;:::o;24676:416::-;24836:3;24851:75;24922:3;24913:6;24851:75;:::i;:::-;24951:2;24946:3;24942:12;24935:19;;24971:95;25062:3;25053:6;24971:95;:::i;:::-;24964:102;;25083:3;25076:10;;24676:416;;;;;:::o;25098:429::-;25275:3;25297:92;25385:3;25376:6;25297:92;:::i;:::-;25290:99;;25406:95;25497:3;25488:6;25406:95;:::i;:::-;25399:102;;25518:3;25511:10;;25098:429;;;;;:::o;25533:522::-;25746:3;25768:148;25912:3;25768:148;:::i;:::-;25761:155;;25926:75;25997:3;25988:6;25926:75;:::i;:::-;26026:2;26021:3;26017:12;26010:19;;26046:3;26039:10;;25533:522;;;;:::o;26061:222::-;26154:4;26192:2;26181:9;26177:18;26169:26;;26205:71;26273:1;26262:9;26258:17;26249:6;26205:71;:::i;:::-;26061:222;;;;:::o;26289:640::-;26484:4;26522:3;26511:9;26507:19;26499:27;;26536:71;26604:1;26593:9;26589:17;26580:6;26536:71;:::i;:::-;26617:72;26685:2;26674:9;26670:18;26661:6;26617:72;:::i;:::-;26699;26767:2;26756:9;26752:18;26743:6;26699:72;:::i;:::-;26818:9;26812:4;26808:20;26803:2;26792:9;26788:18;26781:48;26846:76;26917:4;26908:6;26846:76;:::i;:::-;26838:84;;26289:640;;;;;;;:::o;26935:373::-;27078:4;27116:2;27105:9;27101:18;27093:26;;27165:9;27159:4;27155:20;27151:1;27140:9;27136:17;27129:47;27193:108;27296:4;27287:6;27193:108;:::i;:::-;27185:116;;26935:373;;;;:::o;27314:210::-;27401:4;27439:2;27428:9;27424:18;27416:26;;27452:65;27514:1;27503:9;27499:17;27490:6;27452:65;:::i;:::-;27314:210;;;;:::o;27530:545::-;27703:4;27741:3;27730:9;27726:19;27718:27;;27755:71;27823:1;27812:9;27808:17;27799:6;27755:71;:::i;:::-;27836:68;27900:2;27889:9;27885:18;27876:6;27836:68;:::i;:::-;27914:72;27982:2;27971:9;27967:18;27958:6;27914:72;:::i;:::-;27996;28064:2;28053:9;28049:18;28040:6;27996:72;:::i;:::-;27530:545;;;;;;;:::o;28081:313::-;28194:4;28232:2;28221:9;28217:18;28209:26;;28281:9;28275:4;28271:20;28267:1;28256:9;28252:17;28245:47;28309:78;28382:4;28373:6;28309:78;:::i;:::-;28301:86;;28081:313;;;;:::o;28400:419::-;28566:4;28604:2;28593:9;28589:18;28581:26;;28653:9;28647:4;28643:20;28639:1;28628:9;28624:17;28617:47;28681:131;28807:4;28681:131;:::i;:::-;28673:139;;28400:419;;;:::o;28825:::-;28991:4;29029:2;29018:9;29014:18;29006:26;;29078:9;29072:4;29068:20;29064:1;29053:9;29049:17;29042:47;29106:131;29232:4;29106:131;:::i;:::-;29098:139;;28825:419;;;:::o;29250:::-;29416:4;29454:2;29443:9;29439:18;29431:26;;29503:9;29497:4;29493:20;29489:1;29478:9;29474:17;29467:47;29531:131;29657:4;29531:131;:::i;:::-;29523:139;;29250:419;;;:::o;29675:::-;29841:4;29879:2;29868:9;29864:18;29856:26;;29928:9;29922:4;29918:20;29914:1;29903:9;29899:17;29892:47;29956:131;30082:4;29956:131;:::i;:::-;29948:139;;29675:419;;;:::o;30100:::-;30266:4;30304:2;30293:9;30289:18;30281:26;;30353:9;30347:4;30343:20;30339:1;30328:9;30324:17;30317:47;30381:131;30507:4;30381:131;:::i;:::-;30373:139;;30100:419;;;:::o;30525:::-;30691:4;30729:2;30718:9;30714:18;30706:26;;30778:9;30772:4;30768:20;30764:1;30753:9;30749:17;30742:47;30806:131;30932:4;30806:131;:::i;:::-;30798:139;;30525:419;;;:::o;30950:::-;31116:4;31154:2;31143:9;31139:18;31131:26;;31203:9;31197:4;31193:20;31189:1;31178:9;31174:17;31167:47;31231:131;31357:4;31231:131;:::i;:::-;31223:139;;30950:419;;;:::o;31375:::-;31541:4;31579:2;31568:9;31564:18;31556:26;;31628:9;31622:4;31618:20;31614:1;31603:9;31599:17;31592:47;31656:131;31782:4;31656:131;:::i;:::-;31648:139;;31375:419;;;:::o;31800:::-;31966:4;32004:2;31993:9;31989:18;31981:26;;32053:9;32047:4;32043:20;32039:1;32028:9;32024:17;32017:47;32081:131;32207:4;32081:131;:::i;:::-;32073:139;;31800:419;;;:::o;32225:::-;32391:4;32429:2;32418:9;32414:18;32406:26;;32478:9;32472:4;32468:20;32464:1;32453:9;32449:17;32442:47;32506:131;32632:4;32506:131;:::i;:::-;32498:139;;32225:419;;;:::o;32650:::-;32816:4;32854:2;32843:9;32839:18;32831:26;;32903:9;32897:4;32893:20;32889:1;32878:9;32874:17;32867:47;32931:131;33057:4;32931:131;:::i;:::-;32923:139;;32650:419;;;:::o;33075:::-;33241:4;33279:2;33268:9;33264:18;33256:26;;33328:9;33322:4;33318:20;33314:1;33303:9;33299:17;33292:47;33356:131;33482:4;33356:131;:::i;:::-;33348:139;;33075:419;;;:::o;33500:::-;33666:4;33704:2;33693:9;33689:18;33681:26;;33753:9;33747:4;33743:20;33739:1;33728:9;33724:17;33717:47;33781:131;33907:4;33781:131;:::i;:::-;33773:139;;33500:419;;;:::o;33925:::-;34091:4;34129:2;34118:9;34114:18;34106:26;;34178:9;34172:4;34168:20;34164:1;34153:9;34149:17;34142:47;34206:131;34332:4;34206:131;:::i;:::-;34198:139;;33925:419;;;:::o;34350:::-;34516:4;34554:2;34543:9;34539:18;34531:26;;34603:9;34597:4;34593:20;34589:1;34578:9;34574:17;34567:47;34631:131;34757:4;34631:131;:::i;:::-;34623:139;;34350:419;;;:::o;34775:::-;34941:4;34979:2;34968:9;34964:18;34956:26;;35028:9;35022:4;35018:20;35014:1;35003:9;34999:17;34992:47;35056:131;35182:4;35056:131;:::i;:::-;35048:139;;34775:419;;;:::o;35200:::-;35366:4;35404:2;35393:9;35389:18;35381:26;;35453:9;35447:4;35443:20;35439:1;35428:9;35424:17;35417:47;35481:131;35607:4;35481:131;:::i;:::-;35473:139;;35200:419;;;:::o;35625:::-;35791:4;35829:2;35818:9;35814:18;35806:26;;35878:9;35872:4;35868:20;35864:1;35853:9;35849:17;35842:47;35906:131;36032:4;35906:131;:::i;:::-;35898:139;;35625:419;;;:::o;36050:::-;36216:4;36254:2;36243:9;36239:18;36231:26;;36303:9;36297:4;36293:20;36289:1;36278:9;36274:17;36267:47;36331:131;36457:4;36331:131;:::i;:::-;36323:139;;36050:419;;;:::o;36475:::-;36641:4;36679:2;36668:9;36664:18;36656:26;;36728:9;36722:4;36718:20;36714:1;36703:9;36699:17;36692:47;36756:131;36882:4;36756:131;:::i;:::-;36748:139;;36475:419;;;:::o;36900:::-;37066:4;37104:2;37093:9;37089:18;37081:26;;37153:9;37147:4;37143:20;37139:1;37128:9;37124:17;37117:47;37181:131;37307:4;37181:131;:::i;:::-;37173:139;;36900:419;;;:::o;37325:::-;37491:4;37529:2;37518:9;37514:18;37506:26;;37578:9;37572:4;37568:20;37564:1;37553:9;37549:17;37542:47;37606:131;37732:4;37606:131;:::i;:::-;37598:139;;37325:419;;;:::o;37750:::-;37916:4;37954:2;37943:9;37939:18;37931:26;;38003:9;37997:4;37993:20;37989:1;37978:9;37974:17;37967:47;38031:131;38157:4;38031:131;:::i;:::-;38023:139;;37750:419;;;:::o;38175:::-;38341:4;38379:2;38368:9;38364:18;38356:26;;38428:9;38422:4;38418:20;38414:1;38403:9;38399:17;38392:47;38456:131;38582:4;38456:131;:::i;:::-;38448:139;;38175:419;;;:::o;38600:::-;38766:4;38804:2;38793:9;38789:18;38781:26;;38853:9;38847:4;38843:20;38839:1;38828:9;38824:17;38817:47;38881:131;39007:4;38881:131;:::i;:::-;38873:139;;38600:419;;;:::o;39025:::-;39191:4;39229:2;39218:9;39214:18;39206:26;;39278:9;39272:4;39268:20;39264:1;39253:9;39249:17;39242:47;39306:131;39432:4;39306:131;:::i;:::-;39298:139;;39025:419;;;:::o;39450:::-;39616:4;39654:2;39643:9;39639:18;39631:26;;39703:9;39697:4;39693:20;39689:1;39678:9;39674:17;39667:47;39731:131;39857:4;39731:131;:::i;:::-;39723:139;;39450:419;;;:::o;39875:::-;40041:4;40079:2;40068:9;40064:18;40056:26;;40128:9;40122:4;40118:20;40114:1;40103:9;40099:17;40092:47;40156:131;40282:4;40156:131;:::i;:::-;40148:139;;39875:419;;;:::o;40300:::-;40466:4;40504:2;40493:9;40489:18;40481:26;;40553:9;40547:4;40543:20;40539:1;40528:9;40524:17;40517:47;40581:131;40707:4;40581:131;:::i;:::-;40573:139;;40300:419;;;:::o;40725:::-;40891:4;40929:2;40918:9;40914:18;40906:26;;40978:9;40972:4;40968:20;40964:1;40953:9;40949:17;40942:47;41006:131;41132:4;41006:131;:::i;:::-;40998:139;;40725:419;;;:::o;41150:222::-;41243:4;41281:2;41270:9;41266:18;41258:26;;41294:71;41362:1;41351:9;41347:17;41338:6;41294:71;:::i;:::-;41150:222;;;;:::o;41378:129::-;41412:6;41439:20;;:::i;:::-;41429:30;;41468:33;41496:4;41488:6;41468:33;:::i;:::-;41378:129;;;:::o;41513:75::-;41546:6;41579:2;41573:9;41563:19;;41513:75;:::o;41594:307::-;41655:4;41745:18;41737:6;41734:30;41731:56;;;41767:18;;:::i;:::-;41731:56;41805:29;41827:6;41805:29;:::i;:::-;41797:37;;41889:4;41883;41879:15;41871:23;;41594:307;;;:::o;41907:132::-;41974:4;41997:3;41989:11;;42027:4;42022:3;42018:14;42010:22;;41907:132;;;:::o;42045:141::-;42094:4;42117:3;42109:11;;42140:3;42137:1;42130:14;42174:4;42171:1;42161:18;42153:26;;42045:141;;;:::o;42192:114::-;42259:6;42293:5;42287:12;42277:22;;42192:114;;;:::o;42312:98::-;42363:6;42397:5;42391:12;42381:22;;42312:98;;;:::o;42416:99::-;42468:6;42502:5;42496:12;42486:22;;42416:99;;;:::o;42521:113::-;42591:4;42623;42618:3;42614:14;42606:22;;42521:113;;;:::o;42640:184::-;42739:11;42773:6;42768:3;42761:19;42813:4;42808:3;42804:14;42789:29;;42640:184;;;;:::o;42830:168::-;42913:11;42947:6;42942:3;42935:19;42987:4;42982:3;42978:14;42963:29;;42830:168;;;;:::o;43004:169::-;43088:11;43122:6;43117:3;43110:19;43162:4;43157:3;43153:14;43138:29;;43004:169;;;;:::o;43179:148::-;43281:11;43318:3;43303:18;;43179:148;;;;:::o;43333:305::-;43373:3;43392:20;43410:1;43392:20;:::i;:::-;43387:25;;43426:20;43444:1;43426:20;:::i;:::-;43421:25;;43580:1;43512:66;43508:74;43505:1;43502:81;43499:107;;;43586:18;;:::i;:::-;43499:107;43630:1;43627;43623:9;43616:16;;43333:305;;;;:::o;43644:185::-;43684:1;43701:20;43719:1;43701:20;:::i;:::-;43696:25;;43735:20;43753:1;43735:20;:::i;:::-;43730:25;;43774:1;43764:35;;43779:18;;:::i;:::-;43764:35;43821:1;43818;43814:9;43809:14;;43644:185;;;;:::o;43835:348::-;43875:7;43898:20;43916:1;43898:20;:::i;:::-;43893:25;;43932:20;43950:1;43932:20;:::i;:::-;43927:25;;44120:1;44052:66;44048:74;44045:1;44042:81;44037:1;44030:9;44023:17;44019:105;44016:131;;;44127:18;;:::i;:::-;44016:131;44175:1;44172;44168:9;44157:20;;43835:348;;;;:::o;44189:191::-;44229:4;44249:20;44267:1;44249:20;:::i;:::-;44244:25;;44283:20;44301:1;44283:20;:::i;:::-;44278:25;;44322:1;44319;44316:8;44313:34;;;44327:18;;:::i;:::-;44313:34;44372:1;44369;44365:9;44357:17;;44189:191;;;;:::o;44386:96::-;44423:7;44452:24;44470:5;44452:24;:::i;:::-;44441:35;;44386:96;;;:::o;44488:90::-;44522:7;44565:5;44558:13;44551:21;44540:32;;44488:90;;;:::o;44584:77::-;44621:7;44650:5;44639:16;;44584:77;;;:::o;44667:149::-;44703:7;44743:66;44736:5;44732:78;44721:89;;44667:149;;;:::o;44822:126::-;44859:7;44899:42;44892:5;44888:54;44877:65;;44822:126;;;:::o;44954:77::-;44991:7;45020:5;45009:16;;44954:77;;;:::o;45037:86::-;45072:7;45112:4;45105:5;45101:16;45090:27;;45037:86;;;:::o;45129:154::-;45213:6;45208:3;45203;45190:30;45275:1;45266:6;45261:3;45257:16;45250:27;45129:154;;;:::o;45289:307::-;45357:1;45367:113;45381:6;45378:1;45375:13;45367:113;;;45466:1;45461:3;45457:11;45451:18;45447:1;45442:3;45438:11;45431:39;45403:2;45400:1;45396:10;45391:15;;45367:113;;;45498:6;45495:1;45492:13;45489:101;;;45578:1;45569:6;45564:3;45560:16;45553:27;45489:101;45338:258;45289:307;;;:::o;45602:320::-;45646:6;45683:1;45677:4;45673:12;45663:22;;45730:1;45724:4;45720:12;45751:18;45741:81;;45807:4;45799:6;45795:17;45785:27;;45741:81;45869:2;45861:6;45858:14;45838:18;45835:38;45832:84;;;45888:18;;:::i;:::-;45832:84;45653:269;45602:320;;;:::o;45928:281::-;46011:27;46033:4;46011:27;:::i;:::-;46003:6;45999:40;46141:6;46129:10;46126:22;46105:18;46093:10;46090:34;46087:62;46084:88;;;46152:18;;:::i;:::-;46084:88;46192:10;46188:2;46181:22;45971:238;45928:281;;:::o;46215:233::-;46254:3;46277:24;46295:5;46277:24;:::i;:::-;46268:33;;46323:66;46316:5;46313:77;46310:103;;;46393:18;;:::i;:::-;46310:103;46440:1;46433:5;46429:13;46422:20;;46215:233;;;:::o;46454:100::-;46493:7;46522:26;46542:5;46522:26;:::i;:::-;46511:37;;46454:100;;;:::o;46560:79::-;46599:7;46628:5;46617:16;;46560:79;;;:::o;46645:94::-;46684:7;46713:20;46727:5;46713:20;:::i;:::-;46702:31;;46645:94;;;:::o;46745:176::-;46777:1;46794:20;46812:1;46794:20;:::i;:::-;46789:25;;46828:20;46846:1;46828:20;:::i;:::-;46823:25;;46867:1;46857:35;;46872:18;;:::i;:::-;46857:35;46913:1;46910;46906:9;46901:14;;46745:176;;;;:::o;46927:180::-;46975:77;46972:1;46965:88;47072:4;47069:1;47062:15;47096:4;47093:1;47086:15;47113:180;47161:77;47158:1;47151:88;47258:4;47255:1;47248:15;47282:4;47279:1;47272:15;47299:180;47347:77;47344:1;47337:88;47444:4;47441:1;47434:15;47468:4;47465:1;47458:15;47485:180;47533:77;47530:1;47523:88;47630:4;47627:1;47620:15;47654:4;47651:1;47644:15;47671:180;47719:77;47716:1;47709:88;47816:4;47813:1;47806:15;47840:4;47837:1;47830:15;47857:180;47905:77;47902:1;47895:88;48002:4;47999:1;47992:15;48026:4;48023:1;48016:15;48043:180;48091:77;48088:1;48081:88;48188:4;48185:1;48178:15;48212:4;48209:1;48202:15;48229:117;48338:1;48335;48328:12;48352:117;48461:1;48458;48451:12;48475:117;48584:1;48581;48574:12;48598:117;48707:1;48704;48697:12;48721:117;48830:1;48827;48820:12;48844:117;48953:1;48950;48943:12;48967:102;49008:6;49059:2;49055:7;49050:2;49043:5;49039:14;49035:28;49025:38;;48967:102;;;:::o;49075:94::-;49108:8;49156:5;49152:2;49148:14;49127:35;;49075:94;;;:::o;49175:174::-;49315:26;49311:1;49303:6;49299:14;49292:50;49175:174;:::o;49355:164::-;49495:16;49491:1;49483:6;49479:14;49472:40;49355:164;:::o;49525:172::-;49665:24;49661:1;49653:6;49649:14;49642:48;49525:172;:::o;49703:174::-;49843:26;49839:1;49831:6;49827:14;49820:50;49703:174;:::o;49883:181::-;50023:33;50019:1;50011:6;50007:14;50000:57;49883:181;:::o;50070:214::-;50210:66;50206:1;50198:6;50194:14;50187:90;50070:214;:::o;50290:230::-;50430:34;50426:1;50418:6;50414:14;50407:58;50499:13;50494:2;50486:6;50482:15;50475:38;50290:230;:::o;50526:237::-;50666:34;50662:1;50654:6;50650:14;50643:58;50735:20;50730:2;50722:6;50718:15;50711:45;50526:237;:::o;50769:225::-;50909:34;50905:1;50897:6;50893:14;50886:58;50978:8;50973:2;50965:6;50961:15;50954:33;50769:225;:::o;51000:178::-;51140:30;51136:1;51128:6;51124:14;51117:54;51000:178;:::o;51184:223::-;51324:34;51320:1;51312:6;51308:14;51301:58;51393:6;51388:2;51380:6;51376:15;51369:31;51184:223;:::o;51413:175::-;51553:27;51549:1;51541:6;51537:14;51530:51;51413:175;:::o;51594:221::-;51734:34;51730:1;51722:6;51718:14;51711:58;51803:4;51798:2;51790:6;51786:15;51779:29;51594:221;:::o;51821:161::-;51961:13;51957:1;51949:6;51945:14;51938:37;51821:161;:::o;51988:231::-;52128:34;52124:1;52116:6;52112:14;52105:58;52197:14;52192:2;52184:6;52180:15;52173:39;51988:231;:::o;52225:243::-;52365:34;52361:1;52353:6;52349:14;52342:58;52434:26;52429:2;52421:6;52417:15;52410:51;52225:243;:::o;52474:229::-;52614:34;52610:1;52602:6;52598:14;52591:58;52683:12;52678:2;52670:6;52666:15;52659:37;52474:229;:::o;52709:228::-;52849:34;52845:1;52837:6;52833:14;52826:58;52918:11;52913:2;52905:6;52901:15;52894:36;52709:228;:::o;52943:221::-;53083:34;53079:1;53071:6;53067:14;53060:58;53152:4;53147:2;53139:6;53135:15;53128:29;52943:221;:::o;53170:182::-;53310:34;53306:1;53298:6;53294:14;53287:58;53170:182;:::o;53358:231::-;53498:34;53494:1;53486:6;53482:14;53475:58;53567:14;53562:2;53554:6;53550:15;53543:39;53358:231;:::o;53595:182::-;53735:34;53731:1;53723:6;53719:14;53712:58;53595:182;:::o;53783:228::-;53923:34;53919:1;53911:6;53907:14;53900:58;53992:11;53987:2;53979:6;53975:15;53968:36;53783:228;:::o;54017:223::-;54157:34;54153:1;54145:6;54141:14;54134:58;54226:6;54221:2;54213:6;54209:15;54202:31;54017:223;:::o;54246:181::-;54386:33;54382:1;54374:6;54370:14;54363:57;54246:181;:::o;54433:220::-;54573:34;54569:1;54561:6;54557:14;54550:58;54642:3;54637:2;54629:6;54625:15;54618:28;54433:220;:::o;54659:160::-;54799:12;54795:1;54787:6;54783:14;54776:36;54659:160;:::o;54825:236::-;54965:34;54961:1;54953:6;54949:14;54942:58;55034:19;55029:2;55021:6;55017:15;55010:44;54825:236;:::o;55067:231::-;55207:34;55203:1;55195:6;55191:14;55184:58;55276:14;55271:2;55263:6;55259:15;55252:39;55067:231;:::o;55304:162::-;55444:14;55440:1;55432:6;55428:14;55421:38;55304:162;:::o;55472:166::-;55612:18;55608:1;55600:6;55596:14;55589:42;55472:166;:::o;55644:122::-;55717:24;55735:5;55717:24;:::i;:::-;55710:5;55707:35;55697:63;;55756:1;55753;55746:12;55697:63;55644:122;:::o;55772:116::-;55842:21;55857:5;55842:21;:::i;:::-;55835:5;55832:32;55822:60;;55878:1;55875;55868:12;55822:60;55772:116;:::o;55894:120::-;55966:23;55983:5;55966:23;:::i;:::-;55959:5;55956:34;55946:62;;56004:1;56001;55994:12;55946:62;55894:120;:::o;56020:122::-;56093:24;56111:5;56093:24;:::i;:::-;56086:5;56083:35;56073:63;;56132:1;56129;56122:12;56073:63;56020:122;:::o

Swarm Source

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