ETH Price: $2,602.21 (-0.04%)
Gas: 6 Gwei

Token

3 Cold Dishes (3CDS)
 

Overview

Max Total Supply

50 3CDS

Holders

20

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
miller72.eth
Balance
1 3CDS
0x41895cf5ec3faf9cf22992aeaba4f62f743e5b18
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
ColdDishes

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-02-27
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.4;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

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

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

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

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

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

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

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

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

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

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

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

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

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

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

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

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

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

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

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
    }

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

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

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

    bool public revealed = false;
    mapping(string => uint256) internal tribeMetadata;
    mapping (string => string) internal tribeBaseURI;
    mapping (string => uint256) internal mintedAmountOfTribe;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex times
        unchecked {
            return _currentIndex - _burnCounter;    
        }
    }

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

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

    function _numberMinted(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert MintedQueryForZeroAddress();
        return uint256(_addressData[owner].numberMinted);
    }

    function _numberBurned(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert BurnedQueryForZeroAddress();
        return uint256(_addressData[owner].numberBurned);
    }

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

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

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();
        
        TokenOwnership memory token = ownershipOf(tokenId);
        string memory tribe = token.tribe;

        if (revealed) {            
            uint256 metadata = ownershipOf(tokenId).metadata;
            string memory baseURI = _baseURI();
            return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, metadata.toString())) : '';
        }
        else {
            string memory baseURI = tribeBaseURI[tribe];
            return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI)) : '';   
        }
    }

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

            uint256 updatedIndex = startTokenId;

            for (uint256 i; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex);
                if (safe && !_checkOnERC721Received(address(0), to, updatedIndex, _data)) {
                    revert TransferToNonERC721ReceiverImplementer();
                }
                updatedIndex++;
            }

            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

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

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

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

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

            uint256 updatedIndex = startTokenId;
            uint256 startTribeMetadata = tribeMetadata[_tribe];
            uint256 mintedAmount = mintedAmountOfTribe[_tribe];

            for (uint256 i=0; i < quantity; i++) {
                _ownerships[updatedIndex].addr = to;
                _ownerships[updatedIndex].tribe = _tribe;
                _ownerships[updatedIndex].metadata = startTribeMetadata + mintedAmount + i + 1;
                emit Transfer(address(0), to, updatedIndex);
                if (safe && !_checkOnERC721Received(address(0), to, updatedIndex, _data)) {
                    revert TransferToNonERC721ReceiverImplementer();
                }
                updatedIndex++;
            }

            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

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

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

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

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

        _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

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

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

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

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

        emit Transfer(prevOwnership.addr, address(0), tokenId);
        _afterTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

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

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

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

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

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

contract ColdDishes is ERC721A, Ownable {
    uint256 public TOKEN_MAX_SUPPLY = 7555;

    // Tribes, Prices, Supply definition
    mapping (string => bool) private tribes;
    mapping (string => uint256) public priceOfTribe;
    mapping (string => uint256) public maxSupplyOfTribe;    

    string public baseURI = "ipfs://QmTV5j5ZfRL5XDEMcDmB3EWFMU9Xds6MuTikZhpaGFi4av?";

    // Protection
    bool public saleStatus = false;    
    uint256 public mintLimit = 5;
    mapping (address => uint256) public amountMinted;

    constructor () ERC721A("3 Cold Dishes", "3CDS") {
        tribes['militias'] = true;
        tribes['protectors'] = true;
        tribes['healers'] = true;
        tribes['leaders'] = true;
        tribes['legends'] = true;

        maxSupplyOfTribe['militias'] = 4000;
        maxSupplyOfTribe['protectors'] = 2500;
        maxSupplyOfTribe['healers'] = 1000;
        maxSupplyOfTribe['leaders'] = 50;
        maxSupplyOfTribe['legends'] = 5;

        priceOfTribe['militias'] = 0.1 ether;
        priceOfTribe['protectors'] = 0.1 ether;
        priceOfTribe['healers'] = 0.1 ether;
        priceOfTribe['leaders'] = 0.1 ether;
        priceOfTribe['legends'] = 40 ether;

        tribeMetadata['militias'] = 0;
        tribeMetadata['protectors'] = 4000;
        tribeMetadata['healers'] = 6500;
        tribeMetadata['leaders'] = 7500;
        tribeMetadata['legends'] = 7550;

        tribeBaseURI['militias'] = 'ipfs://Qma43sp9yq8QKX5Vw6MucposS9kTfZm1BotXKnUEgFaiDZ?';
        tribeBaseURI['protectors'] = 'ipfs://QmZHsocg5dBySWoSNKXTPi9h3DJibw4fKde9ua7P6ydq83?';
        tribeBaseURI['healers'] = 'ipfs://QmVzKChCEkhtMPg95DiqLhNsVCXoTsjpALogbGtmrEzFmS?';
        tribeBaseURI['leaders'] = 'ipfs://QmXkS1XTEVh8v6cYWGs5f2GX6TbZzAeSR4VHrAfR8kCv7G?';
        tribeBaseURI['legends'] = 'ipfs://Qmeu9M9codzddjXLQ85rKzwMNsXSLZqE1b6Foezck4WG27?';
    }

    function numberMinted(address owner) public view returns (uint256) {
        return _numberMinted(owner);
    }

    function getOwnershipData(uint256 tokenId) external view returns (TokenOwnership memory) {
        return ownershipOf(tokenId);
    }

    function getMintedAmountOfTribe(string memory tribe) external view returns (uint256) {
        return mintedAmountOfTribe[tribe];
    }

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

    function setBaseURI(string memory newBaseURI) external onlyOwner {
        baseURI = newBaseURI;
    }

    function reveal(bool value) external onlyOwner {
        require(revealed != value, "Already set the value");
        revealed = value;
    }

    function setSaleStatus(bool status) public onlyOwner {
        require(saleStatus != status, "Status is already set same value");
        saleStatus = status;
    }

    // Control over mint protection
    function setMintLimit(uint256 newLimit) public onlyOwner {
        mintLimit = newLimit;
    }

    function setMaxSupply(uint256 supply) public onlyOwner {
        TOKEN_MAX_SUPPLY = supply;
    }

    function setMaxSupplyOfTribe(string memory tribe, uint256 supply) public onlyOwner {
        maxSupplyOfTribe[tribe] = supply;
    }

    function setPriceOfTribe(string memory tribe, uint256 price) public onlyOwner {
        priceOfTribe[tribe] = price;
    }

    function setTribeBaseURI(string memory tribe, string memory uri) public onlyOwner {
        tribeBaseURI[tribe] = uri;
    }

    function setTribe(string memory tribe, bool value) public onlyOwner {
        tribes[tribe] = value;
    }

    function mint(string memory tribe, uint256 quantity) external payable {
        require(tx.origin == msg.sender, "The caller is another contract");
        require(quantity > 0, "Quantity should be more than zero.");
        require(quantity <= 5, "Max quantity is 5.");

        // Check if tribe exists
        require(tribes[tribe], "Incorrect tribe.");
        // Check Sale status
        require(saleStatus, "The sale is not active");
        // Check mint limit
        require(amountMinted[msg.sender] + quantity <= mintLimit, "You can't mint more than that for now");
        // Check total supply
        require(totalSupply() + quantity <= TOKEN_MAX_SUPPLY, "No more token left");
        // Check tribe supply
        require(mintedAmountOfTribe[tribe] + quantity <= maxSupplyOfTribe[tribe], "No more token left");
        // Check price
        uint256 tokenPrice = priceOfTribe[tribe];
        require(msg.value >= tokenPrice * quantity, "Wrong price");

        _mint(msg.sender, quantity, tribe, '', true);

        // Increment protection variable to make sure minter never goes over the set limit
        amountMinted[msg.sender] = amountMinted[msg.sender] + quantity;
        mintedAmountOfTribe[tribe] = mintedAmountOfTribe[tribe] + quantity;        
    }

    function airdrop(address account, string memory tribe, uint256 quantity) external onlyOwner {
        require(account != address(0), "Account is the zero address");
        require(quantity > 0, "Quantity should be more than zero.");
        require(quantity <= 5, "Max quantity is 5.");

        // Check if tribe exists
        require(tribes[tribe], "Incorrect tribe.");
        // Check total supply
        require(totalSupply() + quantity <= TOKEN_MAX_SUPPLY, "No more token left");
        // Check tribe supply
        require(mintedAmountOfTribe[tribe] + quantity <= maxSupplyOfTribe[tribe], "No more token left");
        // Check price
        
        _mint(account, quantity, tribe, '', true);

        // Increment protection variable to make sure minter never goes over the set limit
        mintedAmountOfTribe[tribe] = mintedAmountOfTribe[tribe] + quantity;
    }

    function withdraw() external onlyOwner {
        require(address(this).balance > 0, "No enough balance");

        (bool success, ) = owner().call{value: address(this).balance}("");

        require(success, "Unable to send eth");
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"MintedQueryForZeroAddress","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"TOKEN_MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"string","name":"tribe","type":"string"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"amountMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"tribe","type":"string"}],"name":"getMintedAmountOfTribe","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"string","name":"tribe","type":"string"},{"internalType":"uint256","name":"metadata","type":"uint256"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct ERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"maxSupplyOfTribe","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"tribe","type":"string"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"priceOfTribe","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleStatus","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":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"supply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"tribe","type":"string"},{"internalType":"uint256","name":"supply","type":"uint256"}],"name":"setMaxSupplyOfTribe","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLimit","type":"uint256"}],"name":"setMintLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"tribe","type":"string"},{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setPriceOfTribe","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"setSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"tribe","type":"string"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setTribe","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"tribe","type":"string"},{"internalType":"string","name":"uri","type":"string"}],"name":"setTribeBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6008805460ff19169055611d83600d5560e06040526036608081815290620031c760a0398051620000399160119160209091019062000682565b506012805460ff1916905560056013553480156200005657600080fd5b50604080518082018252600d81526c3320436f6c642044697368657360981b6020808301918252835180850190945260048452633343445360e01b908401528151919291620000a89160029162000682565b508051620000be90600390602084019062000682565b505050620000db620000d56200062c60201b60201c565b62000630565b6001600e604051620000fb90676d696c697469617360c01b815260080190565b908152604051908190036020018120805492151560ff19909316929092179091556970726f746563746f727360b01b8152600190600e90600a01908152604051908190036020018120805492151560ff1990931692909217909155666865616c65727360c81b8152600190600e90600701908152604051908190036020018120805492151560ff1990931692909217909155666c65616465727360c81b8152600190600e90600701908152604051908190036020018120805492151560ff1990931692909217909155666c6567656e647360c81b8152600190600e90600701908152604051908190036020018120805492151560ff1990931692909217909155676d696c697469617360c01b8152610fa090601090600801908152604051908190036020018120919091556970726f746563746f727360b01b81526109c490601090600a0190815260405190819003602001812091909155666865616c65727360c81b81526103e89060109060070190815260405190819003602001812091909155666c65616465727360c81b815260329060109060070190815260405190819003602001812091909155666c6567656e647360c81b815260059060109060070190815260405190819003602001812091909155676d696c697469617360c01b815267016345785d8a000090600f90600801908152604051908190036020018120919091556970726f746563746f727360b01b815267016345785d8a000090600f90600a0190815260405190819003602001812091909155666865616c65727360c81b815267016345785d8a000090600f9060070190815260405190819003602001812091909155666c65616465727360c81b815267016345785d8a000090600f9060070190815260405190819003602001812091909155666c6567656e647360c81b815268022b1c8c1227a0000090600f9060070190815260405190819003602001812091909155676d696c697469617360c01b8152600090600990600801908152604051908190036020018120919091556970726f746563746f727360b01b8152610fa090600990600a0190815260405190819003602001812091909155666865616c65727360c81b81526119649060099060070190815260405190819003602001812091909155666c65616465727360c81b8152611d4c9060099060070190815260405190819003602001812091909155666c6567656e647360c81b8152611d7e90600990600701908152602001604051809103902081905550604051806060016040528060368152602001620031fd6036913960408051676d696c697469617360c01b8152600a600882015290519081900360280190208151620004e7926020019062000682565b506040518060600160405280603681526020016200323360369139604080516970726f746563746f727360b01b8152600a80820152905190819003602a019020815162000538926020019062000682565b50604051806060016040528060368152602001620032696036913960408051666865616c65727360c81b8152600a60078201529051908190036027019020815162000587926020019062000682565b506040518060600160405280603681526020016200315b6036913960408051666c65616465727360c81b8152600a600782015290519081900360270190208151620005d6926020019062000682565b50604051806060016040528060368152602001620031916036913960408051666c6567656e647360c81b8152600a60078201529051908190036027019020815162000625926020019062000682565b5062000765565b3390565b600c80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620006909062000728565b90600052602060002090601f016020900481019282620006b45760008555620006ff565b82601f10620006cf57805160ff1916838001178555620006ff565b82800160010185558215620006ff579182015b82811115620006ff578251825591602001919060010190620006e2565b506200070d92915062000711565b5090565b5b808211156200070d576000815560010162000712565b600181811c908216806200073d57607f821691505b602082108114156200075f57634e487b7160e01b600052602260045260246000fd5b50919050565b6129e680620007756000396000f3fe60806040526004361061023b5760003560e01c80636f8b44b01161012e5780639e6a1d7d116100ab578063d897833e1161006f578063d897833e146106cd578063dc33e681146106ed578063e985e9c51461070d578063f2fde38b14610756578063f9020e331461077657600080fd5b80639e6a1d7d1461062d578063a22cb4651461064d578063b16c35fa1461066d578063b88d4fde1461068d578063c87b56dd146106ad57600080fd5b80639231ab2a116100f25780639231ab2a14610595578063933fe296146105c2578063940cd05b146105e257806395d89b4114610602578063996517cf1461061757600080fd5b80636f8b44b01461050c57806370a082311461052c578063715018a61461054c5780638da5cb5b146105615780638ee2c4b81461057f57600080fd5b806342842e0e116101bc57806359c180181161018057806359c180181461045f5780635e8a375a1461047f57806361954a4e146104b75780636352211e146104d75780636c0360eb146104f757600080fd5b806342842e0e146103b8578063438a67e7146103d8578063518302271461040557806355f804b31461041f578063588b357d1461043f57600080fd5b8063095ea7b311610203578063095ea7b31461030457806310ea63221461032457806318160ddd1461036a57806323b872dd146103835780633ccfd60b146103a357600080fd5b806301ffc9a714610240578063056b01ce1461027557806306fdde031461028a578063081812fc146102ac57806308c0e750146102e4575b600080fd5b34801561024c57600080fd5b5061026061025b366004612537565b610790565b60405190151581526020015b60405180910390f35b610288610283366004612643565b6107e2565b005b34801561029657600080fd5b5061029f610b6a565b60405161026c9190612747565b3480156102b857600080fd5b506102cc6102c7366004612685565b610bfc565b6040516001600160a01b03909116815260200161026c565b3480156102f057600080fd5b506102886102ff366004612643565b610c40565b34801561031057600080fd5b5061028861031f3660046124f4565b610c8f565b34801561033057600080fd5b5061035c61033f36600461256f565b8051602081830181018051600f8252928201919093012091525481565b60405190815260200161026c565b34801561037657600080fd5b506001546000540361035c565b34801561038f57600080fd5b5061028861039e3660046123c4565b610d1d565b3480156103af57600080fd5b50610288610d28565b3480156103c457600080fd5b506102886103d33660046123c4565b610e42565b3480156103e457600080fd5b5061035c6103f3366004612378565b60146020526000908152604090205481565b34801561041157600080fd5b506008546102609060ff1681565b34801561042b57600080fd5b5061028861043a36600461256f565b610e5d565b34801561044b57600080fd5b5061028861045a3660046125e3565b610e9e565b34801561046b57600080fd5b5061035c61047a36600461256f565b610efa565b34801561048b57600080fd5b5061035c61049a36600461256f565b805160208183018101805160108252928201919093012091525481565b3480156104c357600080fd5b506102886104d23660046125a1565b610f22565b3480156104e357600080fd5b506102cc6104f2366004612685565b610f81565b34801561050357600080fd5b5061029f610f93565b34801561051857600080fd5b50610288610527366004612685565b611021565b34801561053857600080fd5b5061035c610547366004612378565b611050565b34801561055857600080fd5b5061028861109e565b34801561056d57600080fd5b50600c546001600160a01b03166102cc565b34801561058b57600080fd5b5061035c600d5481565b3480156105a157600080fd5b506105b56105b0366004612685565b6110d4565b60405161026c91906127fd565b3480156105ce57600080fd5b506102886105dd3660046124a0565b6110e5565b3480156105ee57600080fd5b506102886105fd36600461251d565b611324565b34801561060e57600080fd5b5061029f6113b2565b34801561062357600080fd5b5061035c60135481565b34801561063957600080fd5b50610288610648366004612685565b6113c1565b34801561065957600080fd5b50610288610668366004612477565b6113f0565b34801561067957600080fd5b50610288610688366004612643565b611486565b34801561069957600080fd5b506102886106a83660046123ff565b6114c1565b3480156106b957600080fd5b5061029f6106c8366004612685565b6114fb565b3480156106d957600080fd5b506102886106e836600461251d565b6116a7565b3480156106f957600080fd5b5061035c610708366004612378565b61173d565b34801561071957600080fd5b50610260610728366004612392565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561076257600080fd5b50610288610771366004612378565b611748565b34801561078257600080fd5b506012546102609060ff1681565b60006001600160e01b031982166380ac58cd60e01b14806107c157506001600160e01b03198216635b5e139f60e01b145b806107dc57506301ffc9a760e01b6001600160e01b03198316145b92915050565b3233146108365760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e7472616374000060448201526064015b60405180910390fd5b600081116108565760405162461bcd60e51b815260040161082d90612786565b600581111561089c5760405162461bcd60e51b815260206004820152601260248201527126b0bc1038bab0b73a34ba3c9034b9901a9760711b604482015260640161082d565b600e826040516108ac91906126c9565b9081526040519081900360200190205460ff166108fe5760405162461bcd60e51b815260206004820152601060248201526f24b731b7b93932b1ba103a3934b1329760811b604482015260640161082d565b60125460ff166109495760405162461bcd60e51b81526020600482015260166024820152755468652073616c65206973206e6f742061637469766560501b604482015260640161082d565b60135433600090815260146020526040902054610967908390612860565b11156109c35760405162461bcd60e51b815260206004820152602560248201527f596f752063616e2774206d696e74206d6f7265207468616e207468617420666f60448201526472206e6f7760d81b606482015260840161082d565b600d54816109d46001546000540390565b6109de9190612860565b11156109fc5760405162461bcd60e51b815260040161082d9061275a565b601082604051610a0c91906126c9565b90815260200160405180910390205481600b84604051610a2c91906126c9565b908152602001604051809103902054610a459190612860565b1115610a635760405162461bcd60e51b815260040161082d9061275a565b6000600f83604051610a7591906126c9565b908152604051908190036020019020549050610a91828261288c565b341015610ace5760405162461bcd60e51b815260206004820152600b60248201526a57726f6e6720707269636560a81b604482015260640161082d565b610aeb3383856040518060200160405280600081525060016117e0565b33600090815260146020526040902054610b06908390612860565b336000908152601460205260409081902091909155518290600b90610b2c9086906126c9565b908152602001604051809103902054610b459190612860565b600b84604051610b5591906126c9565b90815260405190819003602001902055505050565b606060028054610b79906128ee565b80601f0160208091040260200160405190810160405280929190818152602001828054610ba5906128ee565b8015610bf25780601f10610bc757610100808354040283529160200191610bf2565b820191906000526020600020905b815481529060010190602001808311610bd557829003601f168201915b5050505050905090565b6000610c07826119f2565b610c24576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600c546001600160a01b03163314610c6a5760405162461bcd60e51b815260040161082d906127c8565b80601083604051610c7b91906126c9565b908152604051908190036020019020555050565b6000610c9a82610f81565b9050806001600160a01b0316836001600160a01b03161415610ccf5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610cef5750610ced8133610728565b155b15610d0d576040516367d9dca160e11b815260040160405180910390fd5b610d18838383611a20565b505050565b610d18838383611a7c565b600c546001600160a01b03163314610d525760405162461bcd60e51b815260040161082d906127c8565b60004711610d965760405162461bcd60e51b81526020600482015260116024820152704e6f20656e6f7567682062616c616e636560781b604482015260640161082d565b6000610daa600c546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114610df4576040519150601f19603f3d011682016040523d82523d6000602084013e610df9565b606091505b5050905080610e3f5760405162461bcd60e51b81526020600482015260126024820152710aadcc2c4d8ca40e8de40e6cadcc840cae8d60731b604482015260640161082d565b50565b610d18838383604051806020016040528060008152506114c1565b600c546001600160a01b03163314610e875760405162461bcd60e51b815260040161082d906127c8565b8051610e9a9060119060208401906121d5565b5050565b600c546001600160a01b03163314610ec85760405162461bcd60e51b815260040161082d906127c8565b80600a83604051610ed991906126c9565b90815260200160405180910390209080519060200190610d189291906121d5565b6000600b82604051610f0c91906126c9565b9081526020016040518091039020549050919050565b600c546001600160a01b03163314610f4c5760405162461bcd60e51b815260040161082d906127c8565b80600e83604051610f5d91906126c9565b908152604051908190036020019020805491151560ff199092169190911790555050565b6000610f8c82611c9f565b5192915050565b60118054610fa0906128ee565b80601f0160208091040260200160405190810160405280929190818152602001828054610fcc906128ee565b80156110195780601f10610fee57610100808354040283529160200191611019565b820191906000526020600020905b815481529060010190602001808311610ffc57829003601f168201915b505050505081565b600c546001600160a01b0316331461104b5760405162461bcd60e51b815260040161082d906127c8565b600d55565b60006001600160a01b038216611079576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b600c546001600160a01b031633146110c85760405162461bcd60e51b815260040161082d906127c8565b6110d26000611ef7565b565b6110dc612259565b6107dc82611c9f565b600c546001600160a01b0316331461110f5760405162461bcd60e51b815260040161082d906127c8565b6001600160a01b0383166111655760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320746865207a65726f20616464726573730000000000604482015260640161082d565b600081116111855760405162461bcd60e51b815260040161082d90612786565b60058111156111cb5760405162461bcd60e51b815260206004820152601260248201527126b0bc1038bab0b73a34ba3c9034b9901a9760711b604482015260640161082d565b600e826040516111db91906126c9565b9081526040519081900360200190205460ff1661122d5760405162461bcd60e51b815260206004820152601060248201526f24b731b7b93932b1ba103a3934b1329760811b604482015260640161082d565b600d548161123e6001546000540390565b6112489190612860565b11156112665760405162461bcd60e51b815260040161082d9061275a565b60108260405161127691906126c9565b90815260200160405180910390205481600b8460405161129691906126c9565b9081526020016040518091039020546112af9190612860565b11156112cd5760405162461bcd60e51b815260040161082d9061275a565b6112ea8382846040518060200160405280600081525060016117e0565b80600b836040516112fb91906126c9565b9081526020016040518091039020546113149190612860565b600b83604051610b5591906126c9565b600c546001600160a01b0316331461134e5760405162461bcd60e51b815260040161082d906127c8565b60085460ff161515811515141561139f5760405162461bcd60e51b8152602060048201526015602482015274416c726561647920736574207468652076616c756560581b604482015260640161082d565b6008805460ff1916911515919091179055565b606060038054610b79906128ee565b600c546001600160a01b031633146113eb5760405162461bcd60e51b815260040161082d906127c8565b601355565b6001600160a01b03821633141561141a5760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600c546001600160a01b031633146114b05760405162461bcd60e51b815260040161082d906127c8565b80600f83604051610c7b91906126c9565b6114cc848484611a7c565b6114d884848484611f49565b6114f5576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6060611506826119f2565b61152357604051630a14c4b560e41b815260040160405180910390fd5b600061152e83611c9f565b60208101516008549192509060ff16156115b357600061154d85611c9f565b604001519050600061155d612058565b905080516000141561157e57604051806020016040528060008152506115a9565b8061158883612067565b6040516020016115999291906126e5565b6040516020818303038152906040525b9695505050505050565b6000600a826040516115c591906126c9565b908152602001604051809103902080546115de906128ee565b80601f016020809104026020016040519081016040528092919081815260200182805461160a906128ee565b80156116575780601f1061162c57610100808354040283529160200191611657565b820191906000526020600020905b81548152906001019060200180831161163a57829003601f168201915b5050505050905080516000141561167d576040518060200160405280600081525061169e565b8060405160200161168e91906126c9565b6040516020818303038152906040525b95945050505050565b600c546001600160a01b031633146116d15760405162461bcd60e51b815260040161082d906127c8565b60125460ff161515811515141561172a5760405162461bcd60e51b815260206004820181905260248201527f53746174757320697320616c7265616479207365742073616d652076616c7565604482015260640161082d565b6012805460ff1916911515919091179055565b60006107dc82612180565b600c546001600160a01b031633146117725760405162461bcd60e51b815260040161082d906127c8565b6001600160a01b0381166117d75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161082d565b610e3f81611ef7565b6000546001600160a01b03861661180957604051622e076360e81b815260040160405180910390fd5b846118275760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03861660008181526005602090815260408083208054600160401b6001600160401b038083168d01811667ffffffffffffffff19808516821784900483168f0183169093026fffffffffffffffffffffffffffffffff199094161792909217909255868552600490935281842080546001600160a01b03191690951785556003909401805442909316929094169190911790925590518291906009906118d59088906126c9565b90815260200160405180910390205490506000600b876040516118f891906126c9565b908152602001604051809103902054905060005b888110156119e457600084815260046020908152604090912080546001600160a01b0319166001600160a01b038d161781558951611952926001909201918b01906121d5565b5060008481526004602052604080822060018686018501016002909101555185916001600160a01b038d16917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48580156119ba57506119b860008b868a611f49565b155b156119d8576040516368d2bf6b60e11b815260040160405180910390fd5b6001938401930161190c565b505050600055505050505050565b60008054821080156107dc575050600090815260046020526040902060030154600160401b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611a8782611c9f565b80519091506000906001600160a01b0316336001600160a01b03161480611ab557508151611ab59033610728565b80611ad0575033611ac584610bfc565b6001600160a01b0316145b905080611af057604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b031682600001516001600160a01b031614611b255760405162a1148160e81b815260040160405180910390fd5b6001600160a01b038416611b4c57604051633a954ecd60e21b815260040160405180910390fd5b611b5c6000848460000151611a20565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805480851690841660019081018516919091179091558a8752600490955283862080546001600160a01b0319169091178155600301805490921642909116179055908601808352912054909116611c5657600054811015611c56578251600082815260046020526040902080546001600160a01b0319166001600160a01b0390921691909117815560608401516003909101805467ffffffffffffffff19166001600160401b039092169190911790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050565b611ca7612259565b6000548290811015611ede576000818152600460209081526040808320815160a0810190925280546001600160a01b031682526001810180549293919291840191611cf1906128ee565b80601f0160208091040260200160405190810160405280929190818152602001828054611d1d906128ee565b8015611d6a5780601f10611d3f57610100808354040283529160200191611d6a565b820191906000526020600020905b815481529060010190602001808311611d4d57829003601f168201915b5050509183525050600282015460208201526003909101546001600160401b0381166040830152600160401b900460ff1615156060909101526080810151909150611edc5780516001600160a01b031615611dc6579392505050565b600019909101600081815260046020908152604091829020825160a0810190935280546001600160a01b031683526001810180549495949192840191611e0b906128ee565b80601f0160208091040260200160405190810160405280929190818152602001828054611e37906128ee565b8015611e845780601f10611e5957610100808354040283529160200191611e84565b820191906000526020600020905b815481529060010190602001808311611e6757829003601f168201915b5050509183525050600282015460208201526003909101546001600160401b0381166040830152600160401b900460ff16151560609091015280519091506001600160a01b031615611ed7579392505050565b611dc6565b505b604051636f96cda160e11b815260040160405180910390fd5b600c80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006001600160a01b0384163b1561204c57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611f8d903390899088908890600401612714565b602060405180830381600087803b158015611fa757600080fd5b505af1925050508015611fd7575060408051601f3d908101601f19168201909252611fd491810190612553565b60015b612032573d808015612005576040519150601f19603f3d011682016040523d82523d6000602084013e61200a565b606091505b50805161202a576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612050565b5060015b949350505050565b606060118054610b79906128ee565b60608161208b5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156120b5578061209f81612929565b91506120ae9050600a83612878565b915061208f565b6000816001600160401b038111156120dd57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612107576020820181803683370190505b5090505b84156120505761211c6001836128ab565b9150612129600a86612944565b612134906030612860565b60f81b81838151811061215757634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350612179600a86612878565b945061210b565b60006001600160a01b0382166121a9576040516335ebb31960e01b815260040160405180910390fd5b506001600160a01b0316600090815260056020526040902054600160401b90046001600160401b031690565b8280546121e1906128ee565b90600052602060002090601f0160209004810192826122035760008555612249565b82601f1061221c57805160ff1916838001178555612249565b82800160010185558215612249579182015b8281111561224957825182559160200191906001019061222e565b5061225592915061229c565b5090565b6040518060a0016040528060006001600160a01b03168152602001606081526020016000815260200160006001600160401b031681526020016000151581525090565b5b80821115612255576000815560010161229d565b60006001600160401b03808411156122cb576122cb612984565b604051601f8501601f19908116603f011681019082821181831017156122f3576122f3612984565b8160405280935085815286868601111561230c57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461233d57600080fd5b919050565b8035801515811461233d57600080fd5b600082601f830112612362578081fd5b612371838335602085016122b1565b9392505050565b600060208284031215612389578081fd5b61237182612326565b600080604083850312156123a4578081fd5b6123ad83612326565b91506123bb60208401612326565b90509250929050565b6000806000606084860312156123d8578081fd5b6123e184612326565b92506123ef60208501612326565b9150604084013590509250925092565b60008060008060808587031215612414578081fd5b61241d85612326565b935061242b60208601612326565b92506040850135915060608501356001600160401b0381111561244c578182fd5b8501601f8101871361245c578182fd5b61246b878235602084016122b1565b91505092959194509250565b60008060408385031215612489578182fd5b61249283612326565b91506123bb60208401612342565b6000806000606084860312156124b4578283fd5b6124bd84612326565b925060208401356001600160401b038111156124d7578283fd5b6124e386828701612352565b925050604084013590509250925092565b60008060408385031215612506578182fd5b61250f83612326565b946020939093013593505050565b60006020828403121561252e578081fd5b61237182612342565b600060208284031215612548578081fd5b81356123718161299a565b600060208284031215612564578081fd5b81516123718161299a565b600060208284031215612580578081fd5b81356001600160401b03811115612595578182fd5b61205084828501612352565b600080604083850312156125b3578182fd5b82356001600160401b038111156125c8578283fd5b6125d485828601612352565b9250506123bb60208401612342565b600080604083850312156125f5578182fd5b82356001600160401b038082111561260b578384fd5b61261786838701612352565b9350602085013591508082111561262c578283fd5b5061263985828601612352565b9150509250929050565b60008060408385031215612655578081fd5b82356001600160401b0381111561266a578182fd5b61267685828601612352565b95602094909401359450505050565b600060208284031215612696578081fd5b5035919050565b600081518084526126b58160208601602086016128c2565b601f01601f19169290920160200192915050565b600082516126db8184602087016128c2565b9190910192915050565b600083516126f78184602088016128c2565b83519083019061270b8183602088016128c2565b01949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906115a99083018461269d565b602081526000612371602083018461269d565b602080825260129082015271139bc81b5bdc99481d1bdad95b881b19599d60721b604082015260600190565b60208082526022908201527f5175616e746974792073686f756c64206265206d6f7265207468616e207a6572604082015261379760f11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b602080825282516001600160a01b03168282015282015160a0604083015260009061282b60c084018261269d565b9050604084015160608401526001600160401b0360608501511660808401526080840151151560a08401528091505092915050565b6000821982111561287357612873612958565b500190565b6000826128875761288761296e565b500490565b60008160001904831182151516156128a6576128a6612958565b500290565b6000828210156128bd576128bd612958565b500390565b60005b838110156128dd5781810151838201526020016128c5565b838111156114f55750506000910152565b600181811c9082168061290257607f821691505b6020821081141561292357634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561293d5761293d612958565b5060010190565b6000826129535761295361296e565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610e3f57600080fdfea2646970667358221220ff7dc702c71eae2bf6bd601d178bf47de58e56e56fed4b574d4c9292025ff12f64736f6c63430008040033697066733a2f2f516d586b53315854455668387636635957477335663247583654625a7a4165535234564872416652386b437637473f697066733a2f2f516d6575394d39636f647a64646a584c513835724b7a774d4e7358534c5a7145316236466f657a636b34574732373f697066733a2f2f516d5456356a355a66524c355844454d63446d42334557464d5539586473364d7554696b5a6870614746693461763f697066733a2f2f516d613433737039797138514b58355677364d7563706f7353396b54665a6d31426f74584b6e554567466169445a3f697066733a2f2f516d5a48736f63673564427953576f534e4b58545069396833444a69627734664b646539756137503679647138333f697066733a2f2f516d567a4b436843456b68744d506739354469714c684e735643586f54736a70414c6f676247746d72457a466d533f

Deployed Bytecode

0x60806040526004361061023b5760003560e01c80636f8b44b01161012e5780639e6a1d7d116100ab578063d897833e1161006f578063d897833e146106cd578063dc33e681146106ed578063e985e9c51461070d578063f2fde38b14610756578063f9020e331461077657600080fd5b80639e6a1d7d1461062d578063a22cb4651461064d578063b16c35fa1461066d578063b88d4fde1461068d578063c87b56dd146106ad57600080fd5b80639231ab2a116100f25780639231ab2a14610595578063933fe296146105c2578063940cd05b146105e257806395d89b4114610602578063996517cf1461061757600080fd5b80636f8b44b01461050c57806370a082311461052c578063715018a61461054c5780638da5cb5b146105615780638ee2c4b81461057f57600080fd5b806342842e0e116101bc57806359c180181161018057806359c180181461045f5780635e8a375a1461047f57806361954a4e146104b75780636352211e146104d75780636c0360eb146104f757600080fd5b806342842e0e146103b8578063438a67e7146103d8578063518302271461040557806355f804b31461041f578063588b357d1461043f57600080fd5b8063095ea7b311610203578063095ea7b31461030457806310ea63221461032457806318160ddd1461036a57806323b872dd146103835780633ccfd60b146103a357600080fd5b806301ffc9a714610240578063056b01ce1461027557806306fdde031461028a578063081812fc146102ac57806308c0e750146102e4575b600080fd5b34801561024c57600080fd5b5061026061025b366004612537565b610790565b60405190151581526020015b60405180910390f35b610288610283366004612643565b6107e2565b005b34801561029657600080fd5b5061029f610b6a565b60405161026c9190612747565b3480156102b857600080fd5b506102cc6102c7366004612685565b610bfc565b6040516001600160a01b03909116815260200161026c565b3480156102f057600080fd5b506102886102ff366004612643565b610c40565b34801561031057600080fd5b5061028861031f3660046124f4565b610c8f565b34801561033057600080fd5b5061035c61033f36600461256f565b8051602081830181018051600f8252928201919093012091525481565b60405190815260200161026c565b34801561037657600080fd5b506001546000540361035c565b34801561038f57600080fd5b5061028861039e3660046123c4565b610d1d565b3480156103af57600080fd5b50610288610d28565b3480156103c457600080fd5b506102886103d33660046123c4565b610e42565b3480156103e457600080fd5b5061035c6103f3366004612378565b60146020526000908152604090205481565b34801561041157600080fd5b506008546102609060ff1681565b34801561042b57600080fd5b5061028861043a36600461256f565b610e5d565b34801561044b57600080fd5b5061028861045a3660046125e3565b610e9e565b34801561046b57600080fd5b5061035c61047a36600461256f565b610efa565b34801561048b57600080fd5b5061035c61049a36600461256f565b805160208183018101805160108252928201919093012091525481565b3480156104c357600080fd5b506102886104d23660046125a1565b610f22565b3480156104e357600080fd5b506102cc6104f2366004612685565b610f81565b34801561050357600080fd5b5061029f610f93565b34801561051857600080fd5b50610288610527366004612685565b611021565b34801561053857600080fd5b5061035c610547366004612378565b611050565b34801561055857600080fd5b5061028861109e565b34801561056d57600080fd5b50600c546001600160a01b03166102cc565b34801561058b57600080fd5b5061035c600d5481565b3480156105a157600080fd5b506105b56105b0366004612685565b6110d4565b60405161026c91906127fd565b3480156105ce57600080fd5b506102886105dd3660046124a0565b6110e5565b3480156105ee57600080fd5b506102886105fd36600461251d565b611324565b34801561060e57600080fd5b5061029f6113b2565b34801561062357600080fd5b5061035c60135481565b34801561063957600080fd5b50610288610648366004612685565b6113c1565b34801561065957600080fd5b50610288610668366004612477565b6113f0565b34801561067957600080fd5b50610288610688366004612643565b611486565b34801561069957600080fd5b506102886106a83660046123ff565b6114c1565b3480156106b957600080fd5b5061029f6106c8366004612685565b6114fb565b3480156106d957600080fd5b506102886106e836600461251d565b6116a7565b3480156106f957600080fd5b5061035c610708366004612378565b61173d565b34801561071957600080fd5b50610260610728366004612392565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561076257600080fd5b50610288610771366004612378565b611748565b34801561078257600080fd5b506012546102609060ff1681565b60006001600160e01b031982166380ac58cd60e01b14806107c157506001600160e01b03198216635b5e139f60e01b145b806107dc57506301ffc9a760e01b6001600160e01b03198316145b92915050565b3233146108365760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e7472616374000060448201526064015b60405180910390fd5b600081116108565760405162461bcd60e51b815260040161082d90612786565b600581111561089c5760405162461bcd60e51b815260206004820152601260248201527126b0bc1038bab0b73a34ba3c9034b9901a9760711b604482015260640161082d565b600e826040516108ac91906126c9565b9081526040519081900360200190205460ff166108fe5760405162461bcd60e51b815260206004820152601060248201526f24b731b7b93932b1ba103a3934b1329760811b604482015260640161082d565b60125460ff166109495760405162461bcd60e51b81526020600482015260166024820152755468652073616c65206973206e6f742061637469766560501b604482015260640161082d565b60135433600090815260146020526040902054610967908390612860565b11156109c35760405162461bcd60e51b815260206004820152602560248201527f596f752063616e2774206d696e74206d6f7265207468616e207468617420666f60448201526472206e6f7760d81b606482015260840161082d565b600d54816109d46001546000540390565b6109de9190612860565b11156109fc5760405162461bcd60e51b815260040161082d9061275a565b601082604051610a0c91906126c9565b90815260200160405180910390205481600b84604051610a2c91906126c9565b908152602001604051809103902054610a459190612860565b1115610a635760405162461bcd60e51b815260040161082d9061275a565b6000600f83604051610a7591906126c9565b908152604051908190036020019020549050610a91828261288c565b341015610ace5760405162461bcd60e51b815260206004820152600b60248201526a57726f6e6720707269636560a81b604482015260640161082d565b610aeb3383856040518060200160405280600081525060016117e0565b33600090815260146020526040902054610b06908390612860565b336000908152601460205260409081902091909155518290600b90610b2c9086906126c9565b908152602001604051809103902054610b459190612860565b600b84604051610b5591906126c9565b90815260405190819003602001902055505050565b606060028054610b79906128ee565b80601f0160208091040260200160405190810160405280929190818152602001828054610ba5906128ee565b8015610bf25780601f10610bc757610100808354040283529160200191610bf2565b820191906000526020600020905b815481529060010190602001808311610bd557829003601f168201915b5050505050905090565b6000610c07826119f2565b610c24576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600c546001600160a01b03163314610c6a5760405162461bcd60e51b815260040161082d906127c8565b80601083604051610c7b91906126c9565b908152604051908190036020019020555050565b6000610c9a82610f81565b9050806001600160a01b0316836001600160a01b03161415610ccf5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610cef5750610ced8133610728565b155b15610d0d576040516367d9dca160e11b815260040160405180910390fd5b610d18838383611a20565b505050565b610d18838383611a7c565b600c546001600160a01b03163314610d525760405162461bcd60e51b815260040161082d906127c8565b60004711610d965760405162461bcd60e51b81526020600482015260116024820152704e6f20656e6f7567682062616c616e636560781b604482015260640161082d565b6000610daa600c546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114610df4576040519150601f19603f3d011682016040523d82523d6000602084013e610df9565b606091505b5050905080610e3f5760405162461bcd60e51b81526020600482015260126024820152710aadcc2c4d8ca40e8de40e6cadcc840cae8d60731b604482015260640161082d565b50565b610d18838383604051806020016040528060008152506114c1565b600c546001600160a01b03163314610e875760405162461bcd60e51b815260040161082d906127c8565b8051610e9a9060119060208401906121d5565b5050565b600c546001600160a01b03163314610ec85760405162461bcd60e51b815260040161082d906127c8565b80600a83604051610ed991906126c9565b90815260200160405180910390209080519060200190610d189291906121d5565b6000600b82604051610f0c91906126c9565b9081526020016040518091039020549050919050565b600c546001600160a01b03163314610f4c5760405162461bcd60e51b815260040161082d906127c8565b80600e83604051610f5d91906126c9565b908152604051908190036020019020805491151560ff199092169190911790555050565b6000610f8c82611c9f565b5192915050565b60118054610fa0906128ee565b80601f0160208091040260200160405190810160405280929190818152602001828054610fcc906128ee565b80156110195780601f10610fee57610100808354040283529160200191611019565b820191906000526020600020905b815481529060010190602001808311610ffc57829003601f168201915b505050505081565b600c546001600160a01b0316331461104b5760405162461bcd60e51b815260040161082d906127c8565b600d55565b60006001600160a01b038216611079576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b600c546001600160a01b031633146110c85760405162461bcd60e51b815260040161082d906127c8565b6110d26000611ef7565b565b6110dc612259565b6107dc82611c9f565b600c546001600160a01b0316331461110f5760405162461bcd60e51b815260040161082d906127c8565b6001600160a01b0383166111655760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320746865207a65726f20616464726573730000000000604482015260640161082d565b600081116111855760405162461bcd60e51b815260040161082d90612786565b60058111156111cb5760405162461bcd60e51b815260206004820152601260248201527126b0bc1038bab0b73a34ba3c9034b9901a9760711b604482015260640161082d565b600e826040516111db91906126c9565b9081526040519081900360200190205460ff1661122d5760405162461bcd60e51b815260206004820152601060248201526f24b731b7b93932b1ba103a3934b1329760811b604482015260640161082d565b600d548161123e6001546000540390565b6112489190612860565b11156112665760405162461bcd60e51b815260040161082d9061275a565b60108260405161127691906126c9565b90815260200160405180910390205481600b8460405161129691906126c9565b9081526020016040518091039020546112af9190612860565b11156112cd5760405162461bcd60e51b815260040161082d9061275a565b6112ea8382846040518060200160405280600081525060016117e0565b80600b836040516112fb91906126c9565b9081526020016040518091039020546113149190612860565b600b83604051610b5591906126c9565b600c546001600160a01b0316331461134e5760405162461bcd60e51b815260040161082d906127c8565b60085460ff161515811515141561139f5760405162461bcd60e51b8152602060048201526015602482015274416c726561647920736574207468652076616c756560581b604482015260640161082d565b6008805460ff1916911515919091179055565b606060038054610b79906128ee565b600c546001600160a01b031633146113eb5760405162461bcd60e51b815260040161082d906127c8565b601355565b6001600160a01b03821633141561141a5760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600c546001600160a01b031633146114b05760405162461bcd60e51b815260040161082d906127c8565b80600f83604051610c7b91906126c9565b6114cc848484611a7c565b6114d884848484611f49565b6114f5576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6060611506826119f2565b61152357604051630a14c4b560e41b815260040160405180910390fd5b600061152e83611c9f565b60208101516008549192509060ff16156115b357600061154d85611c9f565b604001519050600061155d612058565b905080516000141561157e57604051806020016040528060008152506115a9565b8061158883612067565b6040516020016115999291906126e5565b6040516020818303038152906040525b9695505050505050565b6000600a826040516115c591906126c9565b908152602001604051809103902080546115de906128ee565b80601f016020809104026020016040519081016040528092919081815260200182805461160a906128ee565b80156116575780601f1061162c57610100808354040283529160200191611657565b820191906000526020600020905b81548152906001019060200180831161163a57829003601f168201915b5050505050905080516000141561167d576040518060200160405280600081525061169e565b8060405160200161168e91906126c9565b6040516020818303038152906040525b95945050505050565b600c546001600160a01b031633146116d15760405162461bcd60e51b815260040161082d906127c8565b60125460ff161515811515141561172a5760405162461bcd60e51b815260206004820181905260248201527f53746174757320697320616c7265616479207365742073616d652076616c7565604482015260640161082d565b6012805460ff1916911515919091179055565b60006107dc82612180565b600c546001600160a01b031633146117725760405162461bcd60e51b815260040161082d906127c8565b6001600160a01b0381166117d75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161082d565b610e3f81611ef7565b6000546001600160a01b03861661180957604051622e076360e81b815260040160405180910390fd5b846118275760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03861660008181526005602090815260408083208054600160401b6001600160401b038083168d01811667ffffffffffffffff19808516821784900483168f0183169093026fffffffffffffffffffffffffffffffff199094161792909217909255868552600490935281842080546001600160a01b03191690951785556003909401805442909316929094169190911790925590518291906009906118d59088906126c9565b90815260200160405180910390205490506000600b876040516118f891906126c9565b908152602001604051809103902054905060005b888110156119e457600084815260046020908152604090912080546001600160a01b0319166001600160a01b038d161781558951611952926001909201918b01906121d5565b5060008481526004602052604080822060018686018501016002909101555185916001600160a01b038d16917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48580156119ba57506119b860008b868a611f49565b155b156119d8576040516368d2bf6b60e11b815260040160405180910390fd5b6001938401930161190c565b505050600055505050505050565b60008054821080156107dc575050600090815260046020526040902060030154600160401b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611a8782611c9f565b80519091506000906001600160a01b0316336001600160a01b03161480611ab557508151611ab59033610728565b80611ad0575033611ac584610bfc565b6001600160a01b0316145b905080611af057604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b031682600001516001600160a01b031614611b255760405162a1148160e81b815260040160405180910390fd5b6001600160a01b038416611b4c57604051633a954ecd60e21b815260040160405180910390fd5b611b5c6000848460000151611a20565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805480851690841660019081018516919091179091558a8752600490955283862080546001600160a01b0319169091178155600301805490921642909116179055908601808352912054909116611c5657600054811015611c56578251600082815260046020526040902080546001600160a01b0319166001600160a01b0390921691909117815560608401516003909101805467ffffffffffffffff19166001600160401b039092169190911790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050565b611ca7612259565b6000548290811015611ede576000818152600460209081526040808320815160a0810190925280546001600160a01b031682526001810180549293919291840191611cf1906128ee565b80601f0160208091040260200160405190810160405280929190818152602001828054611d1d906128ee565b8015611d6a5780601f10611d3f57610100808354040283529160200191611d6a565b820191906000526020600020905b815481529060010190602001808311611d4d57829003601f168201915b5050509183525050600282015460208201526003909101546001600160401b0381166040830152600160401b900460ff1615156060909101526080810151909150611edc5780516001600160a01b031615611dc6579392505050565b600019909101600081815260046020908152604091829020825160a0810190935280546001600160a01b031683526001810180549495949192840191611e0b906128ee565b80601f0160208091040260200160405190810160405280929190818152602001828054611e37906128ee565b8015611e845780601f10611e5957610100808354040283529160200191611e84565b820191906000526020600020905b815481529060010190602001808311611e6757829003601f168201915b5050509183525050600282015460208201526003909101546001600160401b0381166040830152600160401b900460ff16151560609091015280519091506001600160a01b031615611ed7579392505050565b611dc6565b505b604051636f96cda160e11b815260040160405180910390fd5b600c80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006001600160a01b0384163b1561204c57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611f8d903390899088908890600401612714565b602060405180830381600087803b158015611fa757600080fd5b505af1925050508015611fd7575060408051601f3d908101601f19168201909252611fd491810190612553565b60015b612032573d808015612005576040519150601f19603f3d011682016040523d82523d6000602084013e61200a565b606091505b50805161202a576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612050565b5060015b949350505050565b606060118054610b79906128ee565b60608161208b5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156120b5578061209f81612929565b91506120ae9050600a83612878565b915061208f565b6000816001600160401b038111156120dd57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612107576020820181803683370190505b5090505b84156120505761211c6001836128ab565b9150612129600a86612944565b612134906030612860565b60f81b81838151811061215757634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350612179600a86612878565b945061210b565b60006001600160a01b0382166121a9576040516335ebb31960e01b815260040160405180910390fd5b506001600160a01b0316600090815260056020526040902054600160401b90046001600160401b031690565b8280546121e1906128ee565b90600052602060002090601f0160209004810192826122035760008555612249565b82601f1061221c57805160ff1916838001178555612249565b82800160010185558215612249579182015b8281111561224957825182559160200191906001019061222e565b5061225592915061229c565b5090565b6040518060a0016040528060006001600160a01b03168152602001606081526020016000815260200160006001600160401b031681526020016000151581525090565b5b80821115612255576000815560010161229d565b60006001600160401b03808411156122cb576122cb612984565b604051601f8501601f19908116603f011681019082821181831017156122f3576122f3612984565b8160405280935085815286868601111561230c57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461233d57600080fd5b919050565b8035801515811461233d57600080fd5b600082601f830112612362578081fd5b612371838335602085016122b1565b9392505050565b600060208284031215612389578081fd5b61237182612326565b600080604083850312156123a4578081fd5b6123ad83612326565b91506123bb60208401612326565b90509250929050565b6000806000606084860312156123d8578081fd5b6123e184612326565b92506123ef60208501612326565b9150604084013590509250925092565b60008060008060808587031215612414578081fd5b61241d85612326565b935061242b60208601612326565b92506040850135915060608501356001600160401b0381111561244c578182fd5b8501601f8101871361245c578182fd5b61246b878235602084016122b1565b91505092959194509250565b60008060408385031215612489578182fd5b61249283612326565b91506123bb60208401612342565b6000806000606084860312156124b4578283fd5b6124bd84612326565b925060208401356001600160401b038111156124d7578283fd5b6124e386828701612352565b925050604084013590509250925092565b60008060408385031215612506578182fd5b61250f83612326565b946020939093013593505050565b60006020828403121561252e578081fd5b61237182612342565b600060208284031215612548578081fd5b81356123718161299a565b600060208284031215612564578081fd5b81516123718161299a565b600060208284031215612580578081fd5b81356001600160401b03811115612595578182fd5b61205084828501612352565b600080604083850312156125b3578182fd5b82356001600160401b038111156125c8578283fd5b6125d485828601612352565b9250506123bb60208401612342565b600080604083850312156125f5578182fd5b82356001600160401b038082111561260b578384fd5b61261786838701612352565b9350602085013591508082111561262c578283fd5b5061263985828601612352565b9150509250929050565b60008060408385031215612655578081fd5b82356001600160401b0381111561266a578182fd5b61267685828601612352565b95602094909401359450505050565b600060208284031215612696578081fd5b5035919050565b600081518084526126b58160208601602086016128c2565b601f01601f19169290920160200192915050565b600082516126db8184602087016128c2565b9190910192915050565b600083516126f78184602088016128c2565b83519083019061270b8183602088016128c2565b01949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906115a99083018461269d565b602081526000612371602083018461269d565b602080825260129082015271139bc81b5bdc99481d1bdad95b881b19599d60721b604082015260600190565b60208082526022908201527f5175616e746974792073686f756c64206265206d6f7265207468616e207a6572604082015261379760f11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b602080825282516001600160a01b03168282015282015160a0604083015260009061282b60c084018261269d565b9050604084015160608401526001600160401b0360608501511660808401526080840151151560a08401528091505092915050565b6000821982111561287357612873612958565b500190565b6000826128875761288761296e565b500490565b60008160001904831182151516156128a6576128a6612958565b500290565b6000828210156128bd576128bd612958565b500390565b60005b838110156128dd5781810151838201526020016128c5565b838111156114f55750506000910152565b600181811c9082168061290257607f821691505b6020821081141561292357634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561293d5761293d612958565b5060010190565b6000826129535761295361296e565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610e3f57600080fdfea2646970667358221220ff7dc702c71eae2bf6bd601d178bf47de58e56e56fed4b574d4c9292025ff12f64736f6c63430008040033

Deployed Bytecode Sourcemap

52450:6123:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33601:305;;;;;;;;;;-1:-1:-1;33601:305:0;;;;;:::i;:::-;;:::i;:::-;;;8537:14:1;;8530:22;8512:41;;8500:2;8485:18;33601:305:0;;;;;;;;56115:1300;;;;;;:::i;:::-;;:::i;:::-;;36144:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;38059:204::-;;;;;;;;;;-1:-1:-1;38059:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7835:32:1;;;7817:51;;7805:2;7790:18;38059:204:0;7772:102:1;55591:134:0;;;;;;;;;;-1:-1:-1;55591:134:0;;;;;:::i;:::-;;:::i;37622:371::-;;;;;;;;;;-1:-1:-1;37622:371:0;;;;;:::i;:::-;;:::i;52632:47::-;;;;;;;;;;-1:-1:-1;52632:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15054:25:1;;;15042:2;15027:18;52632:47:0;15009:76:1;33258:271:0;;;;;;;;;;-1:-1:-1;33494:12:0;;33302:7;33478:13;:28;33258:271;;38916:170;;;;;;;;;;-1:-1:-1;38916:170:0;;;;;:::i;:::-;;:::i;58328:242::-;;;;;;;;;;;;;:::i;39157:185::-;;;;;;;;;;-1:-1:-1;39157:185:0;;;;;:::i;:::-;;:::i;52934:48::-;;;;;;;;;;-1:-1:-1;52934:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;32855:28;;;;;;;;;;-1:-1:-1;32855:28:0;;;;;;;;54904:104;;;;;;;;;;-1:-1:-1;54904:104:0;;;;;:::i;:::-;;:::i;55865:126::-;;;;;;;;;;-1:-1:-1;55865:126:0;;;;;:::i;:::-;;:::i;54643:137::-;;;;;;;;;;-1:-1:-1;54643:137:0;;;;;:::i;:::-;;:::i;52686:51::-;;;;;;;;;;-1:-1:-1;52686:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;55999:108;;;;;;;;;;-1:-1:-1;55999:108:0;;;;;:::i;:::-;;:::i;35953:124::-;;;;;;;;;;-1:-1:-1;35953:124:0;;;;;:::i;:::-;;:::i;52750:80::-;;;;;;;;;;;;;:::i;55484:99::-;;;;;;;;;;-1:-1:-1;55484:99:0;;;;;:::i;:::-;;:::i;33970:206::-;;;;;;;;;;-1:-1:-1;33970:206:0;;;;;:::i;:::-;;:::i;20426:103::-;;;;;;;;;;;;;:::i;19775:87::-;;;;;;;;;;-1:-1:-1;19848:6:0;;-1:-1:-1;;;;;19848:6:0;19775:87;;52497:38;;;;;;;;;;;;;;;;54500:135;;;;;;;;;;-1:-1:-1;54500:135:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;57423:897::-;;;;;;;;;;-1:-1:-1;57423:897:0;;;;;:::i;:::-;;:::i;55016:144::-;;;;;;;;;;-1:-1:-1;55016:144:0;;;;;:::i;:::-;;:::i;36313:104::-;;;;;;;;;;;;;:::i;52899:28::-;;;;;;;;;;;;;;;;55380:96;;;;;;;;;;-1:-1:-1;55380:96:0;;;;;:::i;:::-;;:::i;38335:279::-;;;;;;;;;;-1:-1:-1;38335:279:0;;;;;:::i;:::-;;:::i;55733:124::-;;;;;;;;;;-1:-1:-1;55733:124:0;;;;;:::i;:::-;;:::i;39413:342::-;;;;;;;;;;-1:-1:-1;39413:342:0;;;;;:::i;:::-;;:::i;36488:730::-;;;;;;;;;;-1:-1:-1;36488:730:0;;;;;:::i;:::-;;:::i;55168:167::-;;;;;;;;;;-1:-1:-1;55168:167:0;;;;;:::i;:::-;;:::i;54379:113::-;;;;;;;;;;-1:-1:-1;54379:113:0;;;;;:::i;:::-;;:::i;38685:164::-;;;;;;;;;;-1:-1:-1;38685:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;38806:25:0;;;38782:4;38806:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;38685:164;20684:201;;;;;;;;;;-1:-1:-1;20684:201:0;;;;;:::i;:::-;;:::i;52858:30::-;;;;;;;;;;-1:-1:-1;52858:30:0;;;;;;;;33601:305;33703:4;-1:-1:-1;;;;;;33740:40:0;;-1:-1:-1;;;33740:40:0;;:105;;-1:-1:-1;;;;;;;33797:48:0;;-1:-1:-1;;;33797:48:0;33740:105;:158;;;-1:-1:-1;;;;;;;;;;29865:40:0;;;33862:36;33720:178;33601:305;-1:-1:-1;;33601:305:0:o;56115:1300::-;56204:9;56217:10;56204:23;56196:66;;;;-1:-1:-1;;;56196:66:0;;10841:2:1;56196:66:0;;;10823:21:1;10880:2;10860:18;;;10853:30;10919:32;10899:18;;;10892:60;10969:18;;56196:66:0;;;;;;;;;56292:1;56281:8;:12;56273:59;;;;-1:-1:-1;;;56273:59:0;;;;;;;:::i;:::-;56363:1;56351:8;:13;;56343:44;;;;-1:-1:-1;;;56343:44:0;;9744:2:1;56343:44:0;;;9726:21:1;9783:2;9763:18;;;9756:30;-1:-1:-1;;;9802:18:1;;;9795:48;9860:18;;56343:44:0;9716:168:1;56343:44:0;56442:6;56449:5;56442:13;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;56434:42;;;;-1:-1:-1;;;56434:42:0;;14071:2:1;56434:42:0;;;14053:21:1;14110:2;14090:18;;;14083:30;-1:-1:-1;;;14129:18:1;;;14122:46;14185:18;;56434:42:0;14043:166:1;56434:42:0;56525:10;;;;56517:45;;;;-1:-1:-1;;;56517:45:0;;12317:2:1;56517:45:0;;;12299:21:1;12356:2;12336:18;;;12329:30;-1:-1:-1;;;12375:18:1;;;12368:52;12437:18;;56517:45:0;12289:172:1;56517:45:0;56649:9;;56623:10;56610:24;;;;:12;:24;;;;;;:35;;56637:8;;56610:35;:::i;:::-;:48;;56602:98;;;;-1:-1:-1;;;56602:98:0;;11200:2:1;56602:98:0;;;11182:21:1;11239:2;11219:18;;;11212:30;11278:34;11258:18;;;11251:62;-1:-1:-1;;;11329:18:1;;;11322:35;11374:19;;56602:98:0;11172:227:1;56602:98:0;56778:16;;56766:8;56750:13;33494:12;;33302:7;33478:13;:28;;33258:271;56750:13;:24;;;;:::i;:::-;:44;;56742:75;;;;-1:-1:-1;;;56742:75:0;;;;;;;:::i;:::-;56908:16;56925:5;56908:23;;;;;;:::i;:::-;;;;;;;;;;;;;;56896:8;56867:19;56887:5;56867:26;;;;;;:::i;:::-;;;;;;;;;;;;;;:37;;;;:::i;:::-;:64;;56859:95;;;;-1:-1:-1;;;56859:95:0;;;;;;;:::i;:::-;56989:18;57010:12;57023:5;57010:19;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;57061:21:0;57074:8;57010:19;57061:21;:::i;:::-;57048:9;:34;;57040:58;;;;-1:-1:-1;;;57040:58:0;;13731:2:1;57040:58:0;;;13713:21:1;13770:2;13750:18;;;13743:30;-1:-1:-1;;;13789:18:1;;;13782:41;13840:18;;57040:58:0;13703:161:1;57040:58:0;57111:44;57117:10;57129:8;57139:5;57111:44;;;;;;;;;;;;57150:4;57111:5;:44::i;:::-;57300:10;57287:24;;;;:12;:24;;;;;;:35;;57314:8;;57287:35;:::i;:::-;57273:10;57260:24;;;;:12;:24;;;;;;;:62;;;;57362:26;57391:8;;57362:19;;:26;;57382:5;;57362:26;:::i;:::-;;;;;;;;;;;;;;:37;;;;:::i;:::-;57333:19;57353:5;57333:26;;;;;;:::i;:::-;;;;;;;;;;;;;;:66;-1:-1:-1;;;56115:1300:0:o;36144:100::-;36198:13;36231:5;36224:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36144:100;:::o;38059:204::-;38127:7;38152:16;38160:7;38152;:16::i;:::-;38147:64;;38177:34;;-1:-1:-1;;;38177:34:0;;;;;;;;;;;38147:64;-1:-1:-1;38231:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;38231:24:0;;38059:204::o;55591:134::-;19848:6;;-1:-1:-1;;;;;19848:6:0;18722:10;19995:23;19987:68;;;;-1:-1:-1;;;19987:68:0;;;;;;;:::i;:::-;55711:6:::1;55685:16;55702:5;55685:23;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:32;-1:-1:-1;;55591:134:0:o;37622:371::-;37695:13;37711:24;37727:7;37711:15;:24::i;:::-;37695:40;;37756:5;-1:-1:-1;;;;;37750:11:0;:2;-1:-1:-1;;;;;37750:11:0;;37746:48;;;37770:24;;-1:-1:-1;;;37770:24:0;;;;;;;;;;;37746:48;18722:10;-1:-1:-1;;;;;37811:21:0;;;;;;:63;;-1:-1:-1;37837:37:0;37854:5;18722:10;38685:164;:::i;37837:37::-;37836:38;37811:63;37807:138;;;37898:35;;-1:-1:-1;;;37898:35:0;;;;;;;;;;;37807:138;37957:28;37966:2;37970:7;37979:5;37957:8;:28::i;:::-;37622:371;;;:::o;38916:170::-;39050:28;39060:4;39066:2;39070:7;39050:9;:28::i;58328:242::-;19848:6;;-1:-1:-1;;;;;19848:6:0;18722:10;19995:23;19987:68;;;;-1:-1:-1;;;19987:68:0;;;;;;;:::i;:::-;58410:1:::1;58386:21;:25;58378:55;;;::::0;-1:-1:-1;;;58378:55:0;;12668:2:1;58378:55:0::1;::::0;::::1;12650:21:1::0;12707:2;12687:18;;;12680:30;-1:-1:-1;;;12726:18:1;;;12719:47;12783:18;;58378:55:0::1;12640:167:1::0;58378:55:0::1;58447:12;58465:7;19848:6:::0;;-1:-1:-1;;;;;19848:6:0;;19775:87;58465:7:::1;-1:-1:-1::0;;;;;58465:12:0::1;58485:21;58465:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58446:65;;;58532:7;58524:38;;;::::0;-1:-1:-1;;;58524:38:0;;10091:2:1;58524:38:0::1;::::0;::::1;10073:21:1::0;10130:2;10110:18;;;10103:30;-1:-1:-1;;;10149:18:1;;;10142:48;10207:18;;58524:38:0::1;10063:168:1::0;58524:38:0::1;20066:1;58328:242::o:0;39157:185::-;39295:39;39312:4;39318:2;39322:7;39295:39;;;;;;;;;;;;:16;:39::i;54904:104::-;19848:6;;-1:-1:-1;;;;;19848:6:0;18722:10;19995:23;19987:68;;;;-1:-1:-1;;;19987:68:0;;;;;;;:::i;:::-;54980:20;;::::1;::::0;:7:::1;::::0;:20:::1;::::0;::::1;::::0;::::1;:::i;:::-;;54904:104:::0;:::o;55865:126::-;19848:6;;-1:-1:-1;;;;;19848:6:0;18722:10;19995:23;19987:68;;;;-1:-1:-1;;;19987:68:0;;;;;;;:::i;:::-;55980:3:::1;55958:12;55971:5;55958:19;;;;;;:::i;:::-;;;;;;;;;;;;;:25;;;;;;;;;;;;:::i;54643:137::-:0;54719:7;54746:19;54766:5;54746:26;;;;;;:::i;:::-;;;;;;;;;;;;;;54739:33;;54643:137;;;:::o;55999:108::-;19848:6;;-1:-1:-1;;;;;19848:6:0;18722:10;19995:23;19987:68;;;;-1:-1:-1;;;19987:68:0;;;;;;;:::i;:::-;56094:5:::1;56078:6;56085:5;56078:13;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:21;;;::::1;;-1:-1:-1::0;;56078:21:0;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;55999:108:0:o;35953:124::-;36017:7;36044:20;36056:7;36044:11;:20::i;:::-;:25;;35953:124;-1:-1:-1;;35953:124:0:o;52750:80::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;55484:99::-;19848:6;;-1:-1:-1;;;;;19848:6:0;18722:10;19995:23;19987:68;;;;-1:-1:-1;;;19987:68:0;;;;;;;:::i;:::-;55550:16:::1;:25:::0;55484:99::o;33970:206::-;34034:7;-1:-1:-1;;;;;34058:19:0;;34054:60;;34086:28;;-1:-1:-1;;;34086:28:0;;;;;;;;;;;34054:60;-1:-1:-1;;;;;;34140:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;34140:27:0;;33970:206::o;20426:103::-;19848:6;;-1:-1:-1;;;;;19848:6:0;18722:10;19995:23;19987:68;;;;-1:-1:-1;;;19987:68:0;;;;;;;:::i;:::-;20491:30:::1;20518:1;20491:18;:30::i;:::-;20426:103::o:0;54500:135::-;54566:21;;:::i;:::-;54607:20;54619:7;54607:11;:20::i;57423:897::-;19848:6;;-1:-1:-1;;;;;19848:6:0;18722:10;19995:23;19987:68;;;;-1:-1:-1;;;19987:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;57534:21:0;::::1;57526:61;;;::::0;-1:-1:-1;;;57526:61:0;;13375:2:1;57526:61:0::1;::::0;::::1;13357:21:1::0;13414:2;13394:18;;;13387:30;13453:29;13433:18;;;13426:57;13500:18;;57526:61:0::1;13347:177:1::0;57526:61:0::1;57617:1;57606:8;:12;57598:59;;;;-1:-1:-1::0;;;57598:59:0::1;;;;;;;:::i;:::-;57688:1;57676:8;:13;;57668:44;;;::::0;-1:-1:-1;;;57668:44:0;;9744:2:1;57668:44:0::1;::::0;::::1;9726:21:1::0;9783:2;9763:18;;;9756:30;-1:-1:-1;;;9802:18:1;;;9795:48;9860:18;;57668:44:0::1;9716:168:1::0;57668:44:0::1;57767:6;57774:5;57767:13;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;;::::1;;57759:42;;;::::0;-1:-1:-1;;;57759:42:0;;14071:2:1;57759:42:0::1;::::0;::::1;14053:21:1::0;14110:2;14090:18;;;14083:30;-1:-1:-1;;;14129:18:1;;;14122:46;14185:18;;57759:42:0::1;14043:166:1::0;57759:42:0::1;57879:16;;57867:8;57851:13;33494:12:::0;;33302:7;33478:13;:28;;33258:271;57851:13:::1;:24;;;;:::i;:::-;:44;;57843:75;;;;-1:-1:-1::0;;;57843:75:0::1;;;;;;;:::i;:::-;58009:16;58026:5;58009:23;;;;;;:::i;:::-;;;;;;;;;;;;;;57997:8;57968:19;57988:5;57968:26;;;;;;:::i;:::-;;;;;;;;;;;;;;:37;;;;:::i;:::-;:64;;57960:95;;;;-1:-1:-1::0;;;57960:95:0::1;;;;;;;:::i;:::-;58100:41;58106:7;58115:8;58125:5;58100:41;;;;;;;;;;;::::0;58136:4:::1;58100:5;:41::i;:::-;58304:8;58275:19;58295:5;58275:26;;;;;;:::i;:::-;;;;;;;;;;;;;;:37;;;;:::i;:::-;58246:19;58266:5;58246:26;;;;;;:::i;55016:144::-:0;19848:6;;-1:-1:-1;;;;;19848:6:0;18722:10;19995:23;19987:68;;;;-1:-1:-1;;;19987:68:0;;;;;;;:::i;:::-;55082:8:::1;::::0;::::1;;:17;;::::0;::::1;;;;55074:51;;;::::0;-1:-1:-1;;;55074:51:0;;11606:2:1;55074:51:0::1;::::0;::::1;11588:21:1::0;11645:2;11625:18;;;11618:30;-1:-1:-1;;;11664:18:1;;;11657:51;11725:18;;55074:51:0::1;11578:171:1::0;55074:51:0::1;55136:8;:16:::0;;-1:-1:-1;;55136:16:0::1;::::0;::::1;;::::0;;;::::1;::::0;;55016:144::o;36313:104::-;36369:13;36402:7;36395:14;;;;;:::i;55380:96::-;19848:6;;-1:-1:-1;;;;;19848:6:0;18722:10;19995:23;19987:68;;;;-1:-1:-1;;;19987:68:0;;;;;;;:::i;:::-;55448:9:::1;:20:::0;55380:96::o;38335:279::-;-1:-1:-1;;;;;38426:24:0;;18722:10;38426:24;38422:54;;;38459:17;;-1:-1:-1;;;38459:17:0;;;;;;;;;;;38422:54;18722:10;38489:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;38489:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;38489:53:0;;;;;;;;;;38558:48;;8512:41:1;;;38489:42:0;;18722:10;38558:48;;8485:18:1;38558:48:0;;;;;;;38335:279;;:::o;55733:124::-;19848:6;;-1:-1:-1;;;;;19848:6:0;18722:10;19995:23;19987:68;;;;-1:-1:-1;;;19987:68:0;;;;;;;:::i;:::-;55844:5:::1;55822:12;55835:5;55822:19;;;;;;:::i;39413:342::-:0;39580:28;39590:4;39596:2;39600:7;39580:9;:28::i;:::-;39624:48;39647:4;39653:2;39657:7;39666:5;39624:22;:48::i;:::-;39619:129;;39696:40;;-1:-1:-1;;;39696:40:0;;;;;;;;;;;39619:129;39413:342;;;;:::o;36488:730::-;36561:13;36592:16;36600:7;36592;:16::i;:::-;36587:59;;36617:29;;-1:-1:-1;;;36617:29:0;;;;;;;;;;;36587:59;36667:27;36697:20;36709:7;36697:11;:20::i;:::-;36750:11;;;;36778:8;;36667:50;;-1:-1:-1;36750:11:0;36778:8;;36774:437;;;36815:16;36834:20;36846:7;36834:11;:20::i;:::-;:29;;;36815:48;;36878:21;36902:10;:8;:10::i;:::-;36878:34;;36940:7;36934:21;36959:1;36934:26;;:88;;;;;;;;;;;;;;;;;36987:7;36996:19;:8;:17;:19::i;:::-;36970:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;36934:88;36927:95;36488:730;-1:-1:-1;;;;;;36488:730:0:o;36774:437::-;37064:21;37088:12;37101:5;37088:19;;;;;;:::i;:::-;;;;;;;;;;;;;37064:43;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37135:7;37129:21;37154:1;37129:26;;:67;;;;;;;;;;;;;;;;;37182:7;37165:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;37129:67;37122:74;36488:730;-1:-1:-1;;;;;36488:730:0:o;55168:167::-;19848:6;;-1:-1:-1;;;;;19848:6:0;18722:10;19995:23;19987:68;;;;-1:-1:-1;;;19987:68:0;;;;;;;:::i;:::-;55240:10:::1;::::0;::::1;;:20;;::::0;::::1;;;;55232:65;;;::::0;-1:-1:-1;;;55232:65:0;;11956:2:1;55232:65:0::1;::::0;::::1;11938:21:1::0;;;11975:18;;;11968:30;12034:34;12014:18;;;12007:62;12086:18;;55232:65:0::1;11928:182:1::0;55232:65:0::1;55308:10;:19:::0;;-1:-1:-1;;55308:19:0::1;::::0;::::1;;::::0;;;::::1;::::0;;55168:167::o;54379:113::-;54437:7;54464:20;54478:5;54464:13;:20::i;20684:201::-;19848:6;;-1:-1:-1;;;;;19848:6:0;18722:10;19995:23;19987:68;;;;-1:-1:-1;;;19987:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;20773:22:0;::::1;20765:73;;;::::0;-1:-1:-1;;;20765:73:0;;8990:2:1;20765:73:0::1;::::0;::::1;8972:21:1::0;9029:2;9009:18;;;9002:30;9068:34;9048:18;;;9041:62;-1:-1:-1;;;9119:18:1;;;9112:36;9165:19;;20765:73:0::1;8962:228:1::0;20765:73:0::1;20849:28;20868:8;20849:18;:28::i;42722:1793::-:0;42892:20;42915:13;-1:-1:-1;;;;;42943:16:0;;42939:48;;42968:19;;-1:-1:-1;;;42968:19:0;;;;;;;;;;;42939:48;43002:13;42998:44;;43024:18;;-1:-1:-1;;;43024:18:0;;;;;;;;;;;42998:44;-1:-1:-1;;;;;43401:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;;;;;;;43401:44:0;;;;;;;-1:-1:-1;;43401:44:0;;;;;43460:49;;;;;;;;;;;;-1:-1:-1;;43460:49:0;;;;;;;;;;;43526:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;43526:35:0;;;;;;43576:40;;;;:66;;43626:15;43576:66;;;;;;;;;;;;;;43738:21;;43538:12;;43401:16;43738:13;;:21;;43752:6;;43738:21;:::i;:::-;;;;;;;;;;;;;;43709:50;;43774:20;43797:19;43817:6;43797:27;;;;;;:::i;:::-;;;;;;;;;;;;;;43774:50;;43846:9;43841:540;43863:8;43859:1;:12;43841:540;;;43897:25;;;;:11;:25;;;;;;;;:35;;-1:-1:-1;;;;;;43897:35:0;-1:-1:-1;;;;;43897:35:0;;;;;43951:40;;;;-1:-1:-1;43951:31:0;;;;:40;;;;:::i;:::-;-1:-1:-1;44010:25:0;;;;:11;:25;;;;;;44087:1;44047:33;;;:37;;:41;44010:34;;;;:78;44112:38;44022:12;;-1:-1:-1;;;;;44112:38:0;;;;;44010:25;;44112:38;44173:4;:68;;;;;44182:59;44213:1;44217:2;44221:12;44235:5;44182:22;:59::i;:::-;44181:60;44173:68;44169:164;;;44273:40;;-1:-1:-1;;;44273:40:0;;;;;;;;;;;44169:164;44351:14;;;;;43873:3;43841:540;;;-1:-1:-1;;;44397:13:0;:28;42722:1793;;;;;;:::o;40010:144::-;40067:4;40101:13;;40091:7;:23;:55;;;;-1:-1:-1;;40119:20:0;;;;:11;:20;;;;;:27;;;-1:-1:-1;;;40119:27:0;;;;40118:28;;40010:144::o;49268:196::-;49383:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;49383:29:0;-1:-1:-1;;;;;49383:29:0;;;;;;;;;49428:28;;49383:24;;49428:28;;;;;;;49268:196;;;:::o;44769:2112::-;44884:35;44922:20;44934:7;44922:11;:20::i;:::-;44997:18;;44884:58;;-1:-1:-1;44955:22:0;;-1:-1:-1;;;;;44981:34:0;18722:10;-1:-1:-1;;;;;44981:34:0;;:101;;;-1:-1:-1;45049:18:0;;45032:50;;18722:10;38685:164;:::i;45032:50::-;44981:154;;;-1:-1:-1;18722:10:0;45099:20;45111:7;45099:11;:20::i;:::-;-1:-1:-1;;;;;45099:36:0;;44981:154;44955:181;;45154:17;45149:66;;45180:35;;-1:-1:-1;;;45180:35:0;;;;;;;;;;;45149:66;45252:4;-1:-1:-1;;;;;45230:26:0;:13;:18;;;-1:-1:-1;;;;;45230:26:0;;45226:67;;45265:28;;-1:-1:-1;;;45265:28:0;;;;;;;;;;;45226:67;-1:-1:-1;;;;;45308:16:0;;45304:52;;45333:23;;-1:-1:-1;;;45333:23:0;;;;;;;;;;;45304:52;45477:49;45494:1;45498:7;45507:13;:18;;;45477:8;:49::i;:::-;-1:-1:-1;;;;;45822:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;45822:31:0;;;-1:-1:-1;;;;;45822:31:0;;;-1:-1:-1;;45822:31:0;;;;;;;45868:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;45868:29:0;;;;;;;;;;;;45914:20;;;:11;:20;;;;;;:30;;-1:-1:-1;;;;;;45914:30:0;;;;;;45959:35;;:61;;;;;46004:15;45959:61;;;;;;46294:11;;;46324:24;;;;;:29;46294:11;;46324:29;46320:445;;46549:13;;46535:11;:27;46531:219;;;46619:18;;;46587:24;;;:11;:24;;;;;:50;;-1:-1:-1;;;;;;46587:50:0;-1:-1:-1;;;;;46587:50:0;;;;;;;;;46702:28;;;;46660:39;;;;:70;;-1:-1:-1;;46660:70:0;-1:-1:-1;;;;;46660:70:0;;;;;;;;;46531:219;44769:2112;46812:7;46808:2;-1:-1:-1;;;;;46793:27:0;46802:4;-1:-1:-1;;;;;46793:27:0;;;;;;;;;;;44769:2112;;;;;:::o;34808:1083::-;34869:21;;:::i;:::-;34903:12;34974:13;34918:7;;34967:20;;34963:861;;;35008:31;35042:17;;;:11;:17;;;;;;;;35008:51;;;;;;;;;;-1:-1:-1;;;;;35008:51:0;;;;;;;;;;35042:17;;35008:51;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;35008:51:0;;;-1:-1:-1;;35008:51:0;;;;;;;;;;;;;-1:-1:-1;;;;;35008:51:0;;;;;;-1:-1:-1;;;35008:51:0;;;;;;;;;;;35083:16;;;;;;-1:-1:-1;35078:731:0;;35128:14;;-1:-1:-1;;;;;35128:28:0;;35124:101;;35192:9;34808:1083;-1:-1:-1;;;34808:1083:0:o;35124:101::-;-1:-1:-1;;35569:6:0;;;35614:17;;;;:11;:17;;;;;;;;;35602:29;;;;;;;;;;-1:-1:-1;;;;;35602:29:0;;;35569:6;35602:29;;;;35569:6;;-1:-1:-1;35614:17:0;;35602:29;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;35602:29:0;;;-1:-1:-1;;35602:29:0;;;;;;;;;;;;;-1:-1:-1;;;;;35602:29:0;;;;;;-1:-1:-1;;;35602:29:0;;;;;;;;;;;35662:14;;;;-1:-1:-1;;;;;;35662:28:0;;35658:109;;35730:9;34808:1083;-1:-1:-1;;;34808:1083:0:o;35658:109::-;35529:261;;;34963:861;;35852:31;;-1:-1:-1;;;35852:31:0;;;;;;;;;;;21045:191;21138:6;;;-1:-1:-1;;;;;21155:17:0;;;-1:-1:-1;;;;;;21155:17:0;;;;;;;21188:40;;21138:6;;;21155:17;21138:6;;21188:40;;21119:16;;21188:40;21045:191;;:::o;50029:790::-;50184:4;-1:-1:-1;;;;;50205:13:0;;1066:20;1114:8;50201:611;;50241:72;;-1:-1:-1;;;50241:72:0;;-1:-1:-1;;;;;50241:36:0;;;;;:72;;18722:10;;50292:4;;50298:7;;50307:5;;50241:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50241:72:0;;;;;;;;-1:-1:-1;;50241:72:0;;;;;;;;;;;;:::i;:::-;;;50237:520;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50487:13:0;;50483:259;;50537:40;;-1:-1:-1;;;50537:40:0;;;;;;;;;;;50483:259;50692:6;50686:13;50677:6;50673:2;50669:15;50662:38;50237:520;-1:-1:-1;;;;;;50364:55:0;-1:-1:-1;;;50364:55:0;;-1:-1:-1;50357:62:0;;50201:611;-1:-1:-1;50796:4:0;50201:611;50029:790;;;;;;:::o;54788:108::-;54848:13;54881:7;54874:14;;;;;:::i;8300:723::-;8356:13;8577:10;8573:53;;-1:-1:-1;;8604:10:0;;;;;;;;;;;;-1:-1:-1;;;8604:10:0;;;;;8300:723::o;8573:53::-;8651:5;8636:12;8692:78;8699:9;;8692:78;;8725:8;;;;:::i;:::-;;-1:-1:-1;8748:10:0;;-1:-1:-1;8756:2:0;8748:10;;:::i;:::-;;;8692:78;;;8780:19;8812:6;-1:-1:-1;;;;;8802:17:0;;;;;-1:-1:-1;;;8802:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8802:17:0;;8780:39;;8830:154;8837:10;;8830:154;;8864:11;8874:1;8864:11;;:::i;:::-;;-1:-1:-1;8933:10:0;8941:2;8933:5;:10;:::i;:::-;8920:24;;:2;:24;:::i;:::-;8907:39;;8890:6;8897;8890:14;;;;;;-1:-1:-1;;;8890:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;8890:56:0;;;;;;;;-1:-1:-1;8961:11:0;8970:2;8961:11;;:::i;:::-;;;8830:154;;34184:207;34245:7;-1:-1:-1;;;;;34269:19:0;;34265:59;;34297:27;;-1:-1:-1;;;34297:27:0;;;;;;;;;;;34265:59;-1:-1:-1;;;;;;34350:19:0;;;;;:12;:19;;;;;:32;-1:-1:-1;;;34350:32:0;;-1:-1:-1;;;;;34350:32:0;;34184:207::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;78:5;-1:-1:-1;;;;;149:2:1;141:6;138:14;135:2;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:2;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:2;;;532:1;529;522:12;491:2;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;88:557;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:2;;813:1;810;803:12;747:2;699:124;;;:::o;828:160::-;893:20;;949:13;;942:21;932:32;;922:2;;978:1;975;968:12;993:229;1036:5;1089:3;1082:4;1074:6;1070:17;1066:27;1056:2;;1111:5;1104;1097:20;1056:2;1137:79;1212:3;1203:6;1190:20;1183:4;1175:6;1171:17;1137:79;:::i;:::-;1128:88;1046:176;-1:-1:-1;;;1046:176:1:o;1227:196::-;1286:6;1339:2;1327:9;1318:7;1314:23;1310:32;1307:2;;;1360:6;1352;1345:22;1307:2;1388:29;1407:9;1388:29;:::i;1428:270::-;1496:6;1504;1557:2;1545:9;1536:7;1532:23;1528:32;1525:2;;;1578:6;1570;1563:22;1525:2;1606:29;1625:9;1606:29;:::i;:::-;1596:39;;1654:38;1688:2;1677:9;1673:18;1654:38;:::i;:::-;1644:48;;1515:183;;;;;:::o;1703:338::-;1780:6;1788;1796;1849:2;1837:9;1828:7;1824:23;1820:32;1817:2;;;1870:6;1862;1855:22;1817:2;1898:29;1917:9;1898:29;:::i;:::-;1888:39;;1946:38;1980:2;1969:9;1965:18;1946:38;:::i;:::-;1936:48;;2031:2;2020:9;2016:18;2003:32;1993:42;;1807:234;;;;;:::o;2046:696::-;2141:6;2149;2157;2165;2218:3;2206:9;2197:7;2193:23;2189:33;2186:2;;;2240:6;2232;2225:22;2186:2;2268:29;2287:9;2268:29;:::i;:::-;2258:39;;2316:38;2350:2;2339:9;2335:18;2316:38;:::i;:::-;2306:48;;2401:2;2390:9;2386:18;2373:32;2363:42;;2456:2;2445:9;2441:18;2428:32;-1:-1:-1;;;;;2475:6:1;2472:30;2469:2;;;2520:6;2512;2505:22;2469:2;2548:22;;2601:4;2593:13;;2589:27;-1:-1:-1;2579:2:1;;2635:6;2627;2620:22;2579:2;2663:73;2728:7;2723:2;2710:16;2705:2;2701;2697:11;2663:73;:::i;:::-;2653:83;;;2176:566;;;;;;;:::o;2747:264::-;2812:6;2820;2873:2;2861:9;2852:7;2848:23;2844:32;2841:2;;;2894:6;2886;2879:22;2841:2;2922:29;2941:9;2922:29;:::i;:::-;2912:39;;2970:35;3001:2;2990:9;2986:18;2970:35;:::i;3016:484::-;3103:6;3111;3119;3172:2;3160:9;3151:7;3147:23;3143:32;3140:2;;;3193:6;3185;3178:22;3140:2;3221:29;3240:9;3221:29;:::i;:::-;3211:39;;3301:2;3290:9;3286:18;3273:32;-1:-1:-1;;;;;3320:6:1;3317:30;3314:2;;;3365:6;3357;3350:22;3314:2;3393:50;3435:7;3426:6;3415:9;3411:22;3393:50;:::i;:::-;3383:60;;;3490:2;3479:9;3475:18;3462:32;3452:42;;3130:370;;;;;:::o;3505:264::-;3573:6;3581;3634:2;3622:9;3613:7;3609:23;3605:32;3602:2;;;3655:6;3647;3640:22;3602:2;3683:29;3702:9;3683:29;:::i;:::-;3673:39;3759:2;3744:18;;;;3731:32;;-1:-1:-1;;;3592:177:1:o;3774:190::-;3830:6;3883:2;3871:9;3862:7;3858:23;3854:32;3851:2;;;3904:6;3896;3889:22;3851:2;3932:26;3948:9;3932:26;:::i;3969:255::-;4027:6;4080:2;4068:9;4059:7;4055:23;4051:32;4048:2;;;4101:6;4093;4086:22;4048:2;4145:9;4132:23;4164:30;4188:5;4164:30;:::i;4229:259::-;4298:6;4351:2;4339:9;4330:7;4326:23;4322:32;4319:2;;;4372:6;4364;4357:22;4319:2;4409:9;4403:16;4428:30;4452:5;4428:30;:::i;4493:342::-;4562:6;4615:2;4603:9;4594:7;4590:23;4586:32;4583:2;;;4636:6;4628;4621:22;4583:2;4681:9;4668:23;-1:-1:-1;;;;;4706:6:1;4703:30;4700:2;;;4751:6;4743;4736:22;4700:2;4779:50;4821:7;4812:6;4801:9;4797:22;4779:50;:::i;4840:410::-;4915:6;4923;4976:2;4964:9;4955:7;4951:23;4947:32;4944:2;;;4997:6;4989;4982:22;4944:2;5042:9;5029:23;-1:-1:-1;;;;;5067:6:1;5064:30;5061:2;;;5112:6;5104;5097:22;5061:2;5140:50;5182:7;5173:6;5162:9;5158:22;5140:50;:::i;:::-;5130:60;;;5209:35;5240:2;5229:9;5225:18;5209:35;:::i;5255:573::-;5343:6;5351;5404:2;5392:9;5383:7;5379:23;5375:32;5372:2;;;5425:6;5417;5410:22;5372:2;5470:9;5457:23;-1:-1:-1;;;;;5540:2:1;5532:6;5529:14;5526:2;;;5561:6;5553;5546:22;5526:2;5589:50;5631:7;5622:6;5611:9;5607:22;5589:50;:::i;:::-;5579:60;;5692:2;5681:9;5677:18;5664:32;5648:48;;5721:2;5711:8;5708:16;5705:2;;;5742:6;5734;5727:22;5705:2;;5770:52;5814:7;5803:8;5792:9;5788:24;5770:52;:::i;:::-;5760:62;;;5362:466;;;;;:::o;5833:410::-;5911:6;5919;5972:2;5960:9;5951:7;5947:23;5943:32;5940:2;;;5993:6;5985;5978:22;5940:2;6038:9;6025:23;-1:-1:-1;;;;;6063:6:1;6060:30;6057:2;;;6108:6;6100;6093:22;6057:2;6136:50;6178:7;6169:6;6158:9;6154:22;6136:50;:::i;:::-;6126:60;6233:2;6218:18;;;;6205:32;;-1:-1:-1;;;;5930:313:1:o;6248:190::-;6307:6;6360:2;6348:9;6339:7;6335:23;6331:32;6328:2;;;6381:6;6373;6366:22;6328:2;-1:-1:-1;6409:23:1;;6318:120;-1:-1:-1;6318:120:1:o;6443:257::-;6484:3;6522:5;6516:12;6549:6;6544:3;6537:19;6565:63;6621:6;6614:4;6609:3;6605:14;6598:4;6591:5;6587:16;6565:63;:::i;:::-;6682:2;6661:15;-1:-1:-1;;6657:29:1;6648:39;;;;6689:4;6644:50;;6492:208;-1:-1:-1;;6492:208:1:o;6705:276::-;6836:3;6874:6;6868:13;6890:53;6936:6;6931:3;6924:4;6916:6;6912:17;6890:53;:::i;:::-;6959:16;;;;;6844:137;-1:-1:-1;;6844:137:1:o;6986:470::-;7165:3;7203:6;7197:13;7219:53;7265:6;7260:3;7253:4;7245:6;7241:17;7219:53;:::i;:::-;7335:13;;7294:16;;;;7357:57;7335:13;7294:16;7391:4;7379:17;;7357:57;:::i;:::-;7430:20;;7173:283;-1:-1:-1;;;;7173:283:1:o;7879:488::-;-1:-1:-1;;;;;8148:15:1;;;8130:34;;8200:15;;8195:2;8180:18;;8173:43;8247:2;8232:18;;8225:34;;;8295:3;8290:2;8275:18;;8268:31;;;8073:4;;8316:45;;8341:19;;8333:6;8316:45;:::i;8564:219::-;8713:2;8702:9;8695:21;8676:4;8733:44;8773:2;8762:9;8758:18;8750:6;8733:44;:::i;9195:342::-;9397:2;9379:21;;;9436:2;9416:18;;;9409:30;-1:-1:-1;;;9470:2:1;9455:18;;9448:48;9528:2;9513:18;;9369:168::o;10236:398::-;10438:2;10420:21;;;10477:2;10457:18;;;10450:30;10516:34;10511:2;10496:18;;10489:62;-1:-1:-1;;;10582:2:1;10567:18;;10560:32;10624:3;10609:19;;10410:224::o;12812:356::-;13014:2;12996:21;;;13033:18;;;13026:30;13092:34;13087:2;13072:18;;13065:62;13159:2;13144:18;;12986:182::o;14214:689::-;14407:2;14389:21;;;14450:13;;-1:-1:-1;;;;;14446:39:1;14426:18;;;14419:67;14521:15;;14515:22;14473:3;14568:2;14553:18;;14546:32;-1:-1:-1;;14601:51:1;14647:3;14632:19;;14515:22;14601:51;:::i;:::-;14587:65;;14706:2;14698:6;14694:15;14688:22;14683:2;14672:9;14668:18;14661:50;-1:-1:-1;;;;;14770:2:1;14762:6;14758:15;14752:22;14748:47;14742:3;14731:9;14727:19;14720:76;14866:3;14858:6;14854:16;14848:23;14841:31;14834:39;14827:4;14816:9;14812:20;14805:69;14891:6;14883:14;;;14379:524;;;;:::o;15090:128::-;15130:3;15161:1;15157:6;15154:1;15151:13;15148:2;;;15167:18;;:::i;:::-;-1:-1:-1;15203:9:1;;15138:80::o;15223:120::-;15263:1;15289;15279:2;;15294:18;;:::i;:::-;-1:-1:-1;15328:9:1;;15269:74::o;15348:168::-;15388:7;15454:1;15450;15446:6;15442:14;15439:1;15436:21;15431:1;15424:9;15417:17;15413:45;15410:2;;;15461:18;;:::i;:::-;-1:-1:-1;15501:9:1;;15400:116::o;15521:125::-;15561:4;15589:1;15586;15583:8;15580:2;;;15594:18;;:::i;:::-;-1:-1:-1;15631:9:1;;15570:76::o;15651:258::-;15723:1;15733:113;15747:6;15744:1;15741:13;15733:113;;;15823:11;;;15817:18;15804:11;;;15797:39;15769:2;15762:10;15733:113;;;15864:6;15861:1;15858:13;15855:2;;;-1:-1:-1;;15899:1:1;15881:16;;15874:27;15704:205::o;15914:380::-;15993:1;15989:12;;;;16036;;;16057:2;;16111:4;16103:6;16099:17;16089:27;;16057:2;16164;16156:6;16153:14;16133:18;16130:38;16127:2;;;16210:10;16205:3;16201:20;16198:1;16191:31;16245:4;16242:1;16235:15;16273:4;16270:1;16263:15;16127:2;;15969:325;;;:::o;16299:135::-;16338:3;-1:-1:-1;;16359:17:1;;16356:2;;;16379:18;;:::i;:::-;-1:-1:-1;16426:1:1;16415:13;;16346:88::o;16439:112::-;16471:1;16497;16487:2;;16502:18;;:::i;:::-;-1:-1:-1;16536:9:1;;16477:74::o;16556:127::-;16617:10;16612:3;16608:20;16605:1;16598:31;16648:4;16645:1;16638:15;16672:4;16669:1;16662:15;16688:127;16749:10;16744:3;16740:20;16737:1;16730:31;16780:4;16777:1;16770:15;16804:4;16801:1;16794:15;16820:127;16881:10;16876:3;16872:20;16869:1;16862:31;16912:4;16909:1;16902:15;16936:4;16933:1;16926:15;16952:131;-1:-1:-1;;;;;;17026:32:1;;17016:43;;17006:2;;17073:1;17070;17063:12

Swarm Source

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