ETH Price: $2,526.81 (+0.36%)

Token

gmdegens (GMD)
 

Overview

Max Total Supply

577 GMD

Holders

247

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 GMD
0xecdc1c32e4b0bff00aff1d8f809bdd8b33a58969
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:
Degens

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-10-29
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

/// @title IERC2981Royalties
/// @dev Interface for the ERC2981 - Token Royalty standard
interface IERC2981Royalties {
    /// @notice Called with the sale price to determine how much royalty
    //          is owed and to whom.
    /// @param _tokenId - the NFT asset queried for royalty information
    /// @param _value - the sale price of the NFT asset specified by _tokenId
    /// @return _receiver - address of who should be sent the royalty payment
    /// @return _royaltyAmount - the royalty payment amount for value sale price
    function royaltyInfo(uint256 _tokenId, uint256 _value)
        external
        view
        returns (address _receiver, uint256 _royaltyAmount);
}

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

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


    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, 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 Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

/// @dev This is a contract used to add ERC2981 support to ERC721 and 1155
/// @dev This implementation has the same royalties for each and every tokens
abstract contract ERC2981ContractWideRoyalties is ERC165, IERC2981Royalties {
    address private _royaltiesRecipient;
    uint256 private _royaltiesValue;

    /// @inheritdoc	ERC165
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override
        returns (bool)
    {
        return
            interfaceId == type(IERC2981Royalties).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /// @dev Sets token royalties
    /// @param recipient recipient of the royalties
    /// @param value percentage (using 2 decimals - 10000 = 100, 0 = 0)
    function _setRoyalties(address recipient, uint256 value) internal {
        require(value <= 10000, 'ERC2981Royalties: Too high');
        _royaltiesRecipient = recipient;
        _royaltiesValue = value;
    }

    /// @inheritdoc	IERC2981Royalties
    function royaltyInfo(uint256, uint256 value)
        external
        view
        override
        returns (address receiver, uint256 royaltyAmount)
    {
        return (_royaltiesRecipient, (value * _royaltiesValue) / 10000);
    }
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



contract Degens is ERC721Enumerable, ERC2981ContractWideRoyalties, ReentrancyGuard, Ownable {
    using Strings for uint256;

    uint256 public constant MINT_COST = 50000000000000000; // 0.05 ETH
    uint256 public constant MAX_SUPPLY = 10000;
    uint256 public constant MAX_RESERVE = 150;
    uint256 public constant MAX_PER_MINT = 20;
    uint256 public constant ROYALTY_BASIS_PTS = 1000; // 10%

    address public contractDev = 0x2533798d5f1386bbA9101387Ff3342FFFC220E27;

    string public PROVENANCE;
    string private baseDegenURI;
    uint256 public tokenOffset = MAX_SUPPLY;
    bool public mintingActive = false;
    bool public earlyMintingActive = false;

    mapping(address => uint256) whitelist;

    constructor() ERC721("gmdegens", "GMD") Ownable() {
        _setRoyalties(owner(), ROYALTY_BASIS_PTS);

        // snapshot of mint pass and founders pass holders
        whitelist[0xff88bD69dc4D42B292B4ACADe8E24A20979C0098] = 2;
        whitelist[0xfF3aB8989bf275CE128Ca69481bdabbe93055876] = 2;
        whitelist[0xfDF0eaDE0C4ba947999e7885b60099985347eE7A] = 2;
        whitelist[0xfa2Ff875d5DED2d6702e3d35678aB9fe674bd68B] = 2;
        whitelist[0xF8038FD7DF0862faA5708c174b485F519698d628] = 2;
        whitelist[0xF641e2800a94b49B8b428353ea71aAE85865decE] = 2;
        whitelist[0xf33f4dF9d5693EC35Be246557E52bA250cF437Dd] = 2;
        whitelist[0xeba06532a72bec44A1d33130aaa7C45c31e502F6] = 2;
        whitelist[0xeA3AC159b6a623D503e48E3c1726072f20c73089] = 2;
        whitelist[0xe8f596d68aEfc6aDdF7E0b4a3A1c5f462F6AF1E0] = 2;
        whitelist[0xe8514Ba313Fb227Da83103BbcF57ec0eD710a325] = 2;
        whitelist[0xE5e2a3E8fc49De0F2Fd7b87d6D88daA5A305ead9] = 2;
        whitelist[0xE53008a668836514B6AC7E4039c788De7850d438] = 2;
        whitelist[0xE0cD6DbcbAbc6aA967D1Dc318F7526090d47606C] = 2;
        whitelist[0xDAc4f4356E9F92ed39427bb96A47E6981C7B3375] = 2;
        whitelist[0xD3b129F1F796f5C26210Eb8f39a938175bDbe215] = 2;
        whitelist[0xcEfa22191E49d3D501c57c9a831D01a09f7c1112] = 2;
        whitelist[0xc9fbb3a7869aF25aefA08914021520cd05aF0E1D] = 2;
        whitelist[0xBDB0Dd845E95d2E24B77D9bEf54d4dF82bAF8335] = 2;
        whitelist[0xBD9dDf4b73aa454CC6D47E7C504eb73157BCf35D] = 2;
        whitelist[0xbC6e70CB9b89851E6Cff7cE198a774549f4c0F0C] = 2;
        whitelist[0xb7D7cE36de85E0E080b1F94Fa7cd8A47378B1b4c] = 2;
        whitelist[0xB4e69092a6EB310559e50Bb160ae36f7193b6A99] = 2;
        whitelist[0xB1b18bDE5DF9b447727c985e3942Ea937fb0C430] = 2;
        whitelist[0xA54E54567c001F3D9f1259665d4E93De8A151A5e] = 2;
        whitelist[0xa32f008Cb5Ae34a91abe833A64b13E4E58969B76] = 2;
        whitelist[0x9D9Fa64Bd35F06c9F0e9598a7dF93c31d72D14Ce] = 2;
        whitelist[0x99e0a9e19775b61b50C690E8F713a588eA3F28bF] = 2;
        whitelist[0x9996e496a36B42897b44a5b0Df62A376C3390098] = 2;
        whitelist[0x98938eDFfA707492A6E76420d2F42458CC1AC15B] = 2;
        whitelist[0x95aF39507c413c12E33ACc34f044d12e5F86f551] = 2;
        whitelist[0x946eC68B81f439b490b489F645c4D73bC8f9414c] = 2;
        whitelist[0x92a7BD65c8b2a9c9d98be8eAa92de46d1fbdefaF] = 2;
        whitelist[0x9260ae742F44b7a2e9472f5C299aa0432B3502FA] = 2;
        whitelist[0x90ee9AF63F5d1dC23EfEE15f1598e3852165E195] = 2;
        whitelist[0x906a2C11B033d0799107Ae1eFEDA2bd422133D7d] = 2;
        whitelist[0x8Fb2A5d8736776291388827E9787F221a1d3633a] = 2;
        whitelist[0x8cC140E41f064079F921f53A1c36e765DB4B7e59] = 2;
        whitelist[0x889C97c24be9bBD5Fab464ba89D47f621Fbe019c] = 2;
        whitelist[0x87b895F37A93E76CF1C27ed68B38d77fEE0f7867] = 2;
        whitelist[0x8297A5971a05903D4d33453425D1B800730B10e7] = 2;
        whitelist[0x7EFB9007074BBe3047c607531e77D6eF840D8FD5] = 2;
        whitelist[0x774363d02e2C8FbBEB5b6B37DAA590317d5C4152] = 2;
        whitelist[0x7305ce3A245168dDc87c3009F0B4b719BC4519F5] = 2;
        whitelist[0x723D5453Fc08769cb454B5B95DB106Bf396C73B3] = 2;
        whitelist[0x6D1fd99F6749C175F72441b04277eC50056A6ABE] = 2;
        whitelist[0x691b7e59EA6E8569aBC4C2fE6a8bCAe49D802924] = 2;
        whitelist[0x64211c2B214Ee2543AaA224EAdd9715818f085Ed] = 2;
        whitelist[0x63E0bD39F6EAd960E2C6317D4540DECaf7ab53bA] = 2;
        whitelist[0x6325178265892Ab382bf4f2BcF3745D2c4A987e6] = 2;
        whitelist[0x5b046272cB9fDe317aB73a836546E52B1F2d81F3] = 3;
        whitelist[0x4f368Dfb630Ba2107e51BABD062657DC7cb6381f] = 2;
        whitelist[0x4D92A462e97443a72524664fC2300d07c208b4aF] = 2;
        whitelist[0x4D4e5506C75642E2cB4C9b07CCcE305E71e30c15] = 2;
        whitelist[0x487d0c7553c8d88500085A805d316eD5b18357f8] = 4;
        whitelist[0x486843aD8adb101584FCcE56E88a09e6f25D16d1] = 4;
        whitelist[0x41A88a01987174d49bBc72b6Ef46b58727aDc4d0] = 2;
        whitelist[0x4115E41D52C6769C4f6D00B9aA6046dF92D41870] = 2;
        whitelist[0x402112921222090851acbE280bB68b44bfe3eeB2] = 2;
        whitelist[0x3a86FD7949F1bD3b2Bfb8dA3f5e86cFEDC79e0Fb] = 2;
        whitelist[0x38D0401941d794D245d41870FcdD9f8Ec61C1352] = 2;
        whitelist[0x383b8F1B11812E81D78f945ac344CbF9DD329316] = 2;
        whitelist[0x332552959a4d437F2Eecdce021E650ED1F343E63] = 2;
        whitelist[0x324Edc2211EF542792588de7A50D9A7E56d95C3a] = 2;
        whitelist[0x3020d185B7c6dAE2C2248763Cc0EAB2b48BEb743] = 2;
        whitelist[0x2CdbF64c0327a731b53bDD6ce715c3aD6BA099C7] = 2;
        whitelist[0x2b8b26ceF820911E18db996396e8053cA1A4459C] = 2;
        whitelist[0x25eA8dB35eb9F34cC4e3e1e7261096Fe86b006D2] = 2;
        whitelist[0x24D10De50DCFcB21d9620bE3042Ee70aDF69d1D4] = 2;
        whitelist[0x229a6A5Da12Ca0d134Fc8AeC58F3359E8eE247b6] = 2;
        whitelist[0x1b7B45A9dBE2cc3df954bF52D49D5453a357c196] = 2;
        whitelist[0x121b37caDb25A2e7D0c8389aae256144fE0f89A8] = 2;
        whitelist[0x1200a40C18804F6B5e01f465D5489E53340d61EC] = 2;
        whitelist[0x11aE298E74A77ec562A5Ff262eE0586568eb03c5] = 2;
        whitelist[0x0dC83606A23cA9dd1a161CC7B95764b7E7424093] = 2;
        whitelist[0x0CB7A06ec845EDCA1AF6DB6b6538C4Ca0942019A] = 2;
        whitelist[0x05c232CE5BCC9bFDB838B41A7870Aea5E4fA0fA8] = 2;
        whitelist[0x038c275A365b7bF84fbc5C86156619943DF1c123] = 2;
        whitelist[0x010edAFA8a3C464413A680a1F6a7115B4eE4c74d] = 2;
        whitelist[0xF547Ce1247D3F3959794Ca6Ccad99bf56b7CE52c] = 4;
        whitelist[0xe6Fda5F67ebA9dE2cfb0fB2a0734969C951653be] = 4;
        whitelist[0xe3E55Fae5B27f1Ec658d3808ecc6137E8F466F1f] = 4;
        whitelist[0xcB724B38D476cd8e39bA12B1D06c34b8Be0E0B32] = 4;
        whitelist[0x29D5cea7D511810f3Ff754886B898FcE16A6D8fD] = 4;
        whitelist[0x17E31bf839acB700e0F584797574A2C1FDe46d0b] = 4;
        whitelist[0x10b54d8e8E7EA708E5C71915401261F92E03B376] = 4;
        whitelist[0xEF3feA2aB12C822dc3437bE195A1BFFc67f2AD08] = 6;
        whitelist[0x230FCac06ae171309ea2E0D826cb021A0F786b81] = 6;
        whitelist[0xBD9E322303Fa0EE764d8Efb497Ca4b81589A281a] = 10;
        whitelist[0x0c2DFdDdeEF2deBBE58fEC8cf93D2daaCDBe1c1e] = 2;
        whitelist[0x48c61D3aB04537448a16F52cF508Bc0dd71316b5] = 2;
        whitelist[0x3094cf9A360Fb98ca7a9Dc666751DA9C16E45394] = 3;
        whitelist[0xEcDC1c32E4b0bFf00afF1d8f809bDD8b33A58969] = 2;
        whitelist[0x46c72258ef3266BD874e391E7A55666A532aeCbA] = 2;
        whitelist[0x20f3C88d39c03262eFDDAEE16768e7a334Ff2A3d] = 2;
        whitelist[0xB31999Ca48Bd9EFC065eB3E2676badD21dfa17b6] = 5;
        whitelist[0x3AaA6A59f89de6419E9392e6F94B57c98573Ae05] = 2;
        whitelist[0xA76E80209610480aafd8807a20325e7a9030ed55] = 2;
        whitelist[0x7b5585D844A5af06e274C7D66Ce12A2a3d2469f0] = 2;
        whitelist[0x6562A7e32a35c479B9044A75D96Ae38a9fe12aB7] = 2;
        whitelist[0x7309e1582d611D3ef9DBA6FCe709F177240E0fd9] = 2;
        whitelist[0x2d52538486de12CC3Ce00F60DE3CD84fD75597eE] = 2;
        whitelist[0x4574F2AEbfa00B9489fad168d2530c1AB0dA94aF] = 2;
        whitelist[0xDa56B1ae899Fab58cbB0EEDA7D667aF0DcAe5572] = 2;
        whitelist[0xdc96fd721474C3632D6dd5774280a7E1650a3b00] = 2;
        whitelist[0xd85Cc97FFC3b8Dc315F983f1bE00D916EF59e2cB] = 2;
        whitelist[0x00b6852E20Cd924e536eD94Be2140B3728989cFc] = 2;
        whitelist[0xcA1bCc5AfDcc45E87B1B73AdCCa5863f01C46629] = 5;
        whitelist[0xe7733E30360B98677DA67F406b23327cA96A4750] = 2;
        whitelist[0x3Cd9C90E94850BFfC6C1b7f8fF0Cbd151740Ef5b] = 2;
        whitelist[0x59811762A399b4eCED3248406cE5412f5F2b6cb2] = 3;
        whitelist[0xB0b8D3345A7276170de955bD8c1c9Bc787d62519] = 2;
        whitelist[0x3b8b35D37aBC65CcF7C78Bd677241870417c8451] = 2;
        whitelist[0x52D1c62020208dFF40eaAe4f1C41c51D82AB3A4e] = 2;
        whitelist[0xB8221D5fb33C317CfBD912b8cE4Bd7C7740fAF88] = 2;
        whitelist[0x20A32b6266febb861E0771116FB7B4a7dd6014cE] = 2;
        whitelist[0xBD3fD7b44CA24741Db067ace1decEe9B164e31CA] = 2;
        whitelist[0xfAcEAA25C46c84F3eE20F979A8bcB6d8deC0Ed78] = 3;
        whitelist[0x7ad3d35f3D0970AE97D638C5d461E82401344e67] = 3;
        whitelist[0x46e5a4b4721AD087680dC6c2EAE5E4Aa93F8f848] = 2;
        whitelist[0x5220CD067677bc7aE6016bd0C8c4eb58B118B77b] = 1;
        whitelist[0x52D4E9c6b23cFAfA13938034814AcdAB895B6848] = 1;
        whitelist[0xB6B402de2B7fE014500C7e07dFE1eD5c291FFCa8] = 1;
        whitelist[0x376a61DC5B30C805089eB027A49F9CA7c21a6c3F] = 1;
        whitelist[0x0663C5cD5F11DdDE32630EE929ac00f0C3d4dB9F] = 1;
        whitelist[0x70817f848cC79ACB114F606685E8751943fB02C2] = 1;
        whitelist[0x95dC53A380D5AbB83438b9308f8219D603543Eed] = 1;
        whitelist[0x9Da3f811143ED2208085f460754b32788913a788] = 1;
        whitelist[0x36bBA2955490f46396E87f6DB052e1106dEAAcA1] = 1;
        whitelist[0xb59C86A4c28bd2663855E02Be15d5a31d1C4eb0b] = 1;
        whitelist[0xcF1e264B0B8Fa3cd014Cd7d32A81f5b46Bc06250] = 2;
        whitelist[0x29aC2D2A79Dfc7B29277E328235F572C7E626b9C] = 1;
        whitelist[0xCCdf62316CA146Ee87AbB2B2c6Fe686A2319466c] = 1;
        whitelist[0x1E5139c78050D014f05968Dc5c0755dAe958481B] = 1;
        whitelist[0x5eaF958de68f09E7b18D9dc3e424c01ca9136e3e] = 1;
        whitelist[0x75321Bc4b5A2aA044C33f1f51e0Ec6e282E91e25] = 1;
        whitelist[0x60ef47a7A264818797Ea298d045e7Ef8bA6ac16B] = 1;
        whitelist[0xA7cA01E775Dd42ef73f1F87d08e774a9235d516d] = 1;
        whitelist[0x8d7c651b9CFfFb23B98c533F11d10ea0BbA8Dd9B] = 2;
        whitelist[0x8d4dAbA34C92E581F928fCA40e018382f7A0282a] = 1;
        whitelist[0x54ad9d40414eD047067ae04C6faFc199A5bb90bB] = 1;
    }

    function mintDegens(uint256 mintCount) public payable nonReentrant {
        uint256 lastTokenId = super.totalSupply();
        require(mintingActive, 'minting not enabled yet');
        require(mintCount <= MAX_PER_MINT, 'max 20 per mint');
        require(lastTokenId + mintCount <= MAX_SUPPLY, 'sold out');
        require(MINT_COST * mintCount <= msg.value, 'not enough ETH');

        for (uint256 i = 1; i <= mintCount; i++) {
            _mintDegen(_msgSender(), lastTokenId + i);
        }
    }

    function reserveDegens(uint256 reserveCount) public nonReentrant onlyOwner {
        uint256 lastTokenId = super.totalSupply();
        require(lastTokenId + reserveCount <= MAX_RESERVE, 'max reserves reached.');

        for (uint256 i = 1; i <= reserveCount; i++) {
            _mintDegen(owner(), lastTokenId + i);
        }
    }

    function mintDegensFromWhitelist(uint256 mintCount) public nonReentrant {
        uint256 lastTokenId = super.totalSupply();
        uint256 freePasses = whitelist[_msgSender()];

        require(earlyMintingActive, 'early minting not enabled yet');
        require(lastTokenId + mintCount <= MAX_SUPPLY, 'sold out');
        require(mintCount <= freePasses, 'mintCount exceeds passes for this wallet');

        whitelist[_msgSender()] = freePasses - mintCount;

        for (uint256 i = 1; i <= mintCount; i++) {
            _mintDegen(_msgSender(), lastTokenId + i);
        }
    }

    function _mintDegen(address minter, uint256 tokenId) private {
        _safeMint(minter, tokenId);
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        uint256 tokenIdOffset = 1 + (tokenId + tokenOffset) % MAX_SUPPLY;
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenIdOffset.toString())) : "";
    }

    function setProvenance(string memory provenance) public onlyOwner {
        PROVENANCE = provenance;
    }

    function toggleMinting() public onlyOwner {
        mintingActive = !mintingActive;
    }

    function toggleEarlyMinting() public onlyOwner {
        earlyMintingActive = !earlyMintingActive;
    }

    function setTokenOffset(uint256 offset) external onlyOwner() {
        require(tokenOffset == MAX_SUPPLY, 'tokenOffset can only be set once');
        tokenOffset = offset % MAX_SUPPLY;
    }

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

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

    function withdraw() public onlyOwner {
        uint256 balance = address(this).balance;
        uint256 contractFee = balance / 40; // 2.5%

        // send contractFee to contractDev
        require(payable(contractDev).send(contractFee), "failed to send contractFee");

        // send everything else to owner
        balance = address(this).balance;
        require(payable(owner()).send(balance), "failed to withdraw");
    }

    function emergencyWithdraw() public onlyOwner {
        uint256 balance = address(this).balance;
        payable(owner()).transfer(balance);
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(ERC721Enumerable, ERC2981ContractWideRoyalties)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_PER_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_RESERVE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_COST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROYALTY_BASIS_PTS","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":"contractDev","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"earlyMintingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintCount","type":"uint256"}],"name":"mintDegens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintCount","type":"uint256"}],"name":"mintDegensFromWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"reserveCount","type":"uint256"}],"name":"reserveDegens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenance","type":"string"}],"name":"setProvenance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"offset","type":"uint256"}],"name":"setTokenOffset","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleEarlyMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenOffset","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600e80546001600160a01b031916732533798d5f1386bba9101387ff3342fffc220e271790556127106011556012805461ffff191690553480156200004857600080fd5b506040805180820182526008815267676d646567656e7360c01b60208083019182528351808501909452600384526211d35160ea1b9084015281519192916200009491600091620015a6565b508051620000aa906001906020840190620015a6565b50506001600c5550620000bd33620014d7565b620000dd620000d4600d546001600160a01b031690565b6103e862001529565b601360205260027fdef3e0c4b9530a5bfdd0c2181c71e588468f7fbbd8b79b44f6cd9deaec4fce6f8190557f70a74721532e96a6b4ec5844511b5e986bb129ecddd0493e54235e375ae762318190557fc6cf7145078f9fb3bc79d1288a54bfbdb0a58655286e412887f041b8b33398a68190557fcccbd9a3a01f9d9c54d683780c92fc5e177ebb0a0b24080ad57676989a4988318190557ff23ed20d55c4ca0c10a07e20ccaa63b40c3742fbb91e1e516584e7daa643d99b8190557f6ef140086455889b2a05038c1326aa75c9c82f2fa30239d00dba08c38369ed198190557f438f6025f46d2af0caf6f9e8b11e963a7aa1834b9fadee07b2cb8361b315bbde8190557fd429b0be503e770a30b4309b2b9de0fae6bb68e6d288099bd3add4adbe1230808190557fba53482f0e0b5bddc69cec502e7c9f0f9047e8f5ed054f49b5036aa7a111ce178190557fc61bb48a7e6bb4d3854693fe8af2950fa199dd44fbf18998bd474ba902979aa98190557ffcbb8330684d4cecaef585526ff57138cc0d8cb26e3f21deb9a697c24a3d83ae8190557f5b4f8d455ee92050216f04e98862465c4ce34a4e7a4d3e42e8f10be1c1af6ebe8190557fc1c44b96ba9705bb6d8acf50f85769823d2f99dd5fe25a015ebb9ad127c9f2e38190557f5c44d8aea85ad9b957c5bd36a141e2e53e90f193727b3203024e3507e63d6ce68190557fe7fa27ca3b18bc89956deffa612cb01521e6220a4776421c22bc9cf928e5cf4d8190557f2ea4bb596beb2c57abb4bda93bbae2be360336eb9aef09b884a3b1cf02205ac98190557f04324a65f5057756cac264380c883f1e85e175ccc92a6579cea5a991c91c0f048190557f2e3fbdc080838a0a4b8058b9d456e90bb085c2c9db747b76185203cf1a607b3e8190557f5d8e4efd3ed5558bbeb770983b8b1087da101966ceb7f179f7b65100397272aa8190557f7e10d1acab00885773346550ee28febd770de37ed55da20fb24f217be0bd574b8190557fc30baf71caa388cc8844938b896455ecafc864b16079d5ec000bfb704ba2de428190557fc13ec3ade5d695ab774495b0c79c8fb5d31d3053f10ea0054965304910e18bdf8190557f2784d8295059414aac992b9674d7909d69958206a7da15505826e17dcdf88f958190557f9d91840019733cb4f235eb56b79730afe04e57f6564d6f1f3a90928b1efe220b8190557fd679344fe9ee7b10370ff577e840f78393872f83d224ad05fec12ebce76feaae8190557f256af6226adf14c72e9f09b9e1a426213411968d76f8eeb334b00d6d873fda0c8190557f86560bde9cbdfc3a44d280dc17cf1961be1b7e43f70a9809d056482f02745ecd8190557fb05bec28974ba5cd66e5c318bcecb581910a37ba6c4f140614b767b0e09825ca8190557fb0cfa3b4cd5f81cb6d6c9f243d5f1f6d8bd5a862cec61353befd9c9096e20d838190557fb7bcfaf6aa3e82234308e3e44abc1241f6c551b8991458273a246f03bf4b9edd8190557fd73841808055a6d993dc8c4fd809d5b7eaeda4955eaf2d3f86fe3ae9f329e25f8190557f01afdf0a34835fe579518c190d7b99a81cfbd0ad94236dad4e326861ba87be878190557f1b9edc7c9f2aead1a510f6b3a5cb780050de4a4afb993cc50bafa994f8371d648190557f2851e10049ad54d11aea553383ee0fab14609991466442d7a3b2a0a1ea036cf08190557fe5051516dc3a043540d9e541dca85391cbb70e46f983cae51fe330e7195b50448190557f1df5bacf980c3ae31bff88be157e70cbec3f8d8a36733927cc499417b5ed2b4a8190557f2958c3b430c9ea8d1067ace58f8321b958e86bf56d73851ee7fc6457b28d996e8190557fe49f5a3d84de4e775731ef99774ff82a3a94ea6e4f6ccf15cacd45dd1d1343108190557f949c5cc381be3c93fb6fefa5154dbeed0b733718f5976698af381b9aa0be98918190557f041c420118165a1844823e7dacd0d59d3f9ed90a2818a3e99cb8a53b91d1992f8190557f1befa0ec8fa1852a3038aa15904c6411e7ddd5dd443f13dee05c4ef0e0b5af618190557f51d827fd786782b572202139757235173a3cd9e8c9e1e9a49237da398364cdee8190557ffc13aba509848b0e6d3b9c56319b101acf6d94304c795e1c3eba64b3c5e5ba748190557f1bbe4736dc57f3926d330277e4201b10f400063c74d2079b44be789eead0a9078190557fe573e1fe0a64d8e149b28f7ed9e5cc1903138b1a7cc6aa4d390f14edcf1693138190557f277047f793ae83fc4c4aac5db5ed38620b2808bcaadf4997651ed3fc3e46238e8190557fdacafb600a97b2989468b7f6f54bfcf18f56bbbbd577f02c3f220787f4be58338190557ff8706548a103103fe72a278460ea8ef99941e98e027d1743452cea41239313aa8190557f82cc5f5a1c6403460bcce0bf78c93cdceb08be9fde8b06962c4fc5a333e6910b8190557fccfc6be0dfe768fca8532d0105e5253f6db37617b5519552ec0f5b9d6df42fbf81905560037f8540cf0a31f032b7f138f7e2340602914973c39c772bf810302541872cc587df8190557f05d0f6cd496633eb2ff7d96106362121d3ceecd2650469803403fed07b69a80b8290557f7f0fffa16496f8781ee8fc8099c4fed581a5786eafd28130c74a09e57cb148d08290557f421e7f8d5d71b30a0671e35d8e077391b50e42fb0754cc142c25bae874c85d8882905560047fa7aec0033d5dddfa4f5dca6d5306d62bb750f3e2065e5e68b9511ad79d85c40e8190557f5a5a6872d18d3b4a87d624f5ab2fcb5d5c1cbdb8b49457d2d2dce4857fab97088190557f035e19b983b72c67c5125d8efaf6c67a6c5416bf5c9e7c0563f2d3a6e836f7f98390557f6389b34ad6a8a1c0ed2e56507f2c20616c0c4bafe06377465a0679d76049d5ee8390557f47ffc3a02ea2c012cfc1e9b65544353072ddbf960a213cf0b71e996e6c4164a78390557f1dea251c4e393e8d8f14df65fc507de2f6d87ca95c2b8b0c410125401a4225598390557f3875e8dcc2f8d235eb7f02b0e2caf094990871f1d1dc58671ea13770f934041e8390557fb18e71aad9a7cc110c452bfcec790af9b3bea2a0d1e5f5f0fb70e3a64b7d33028390557f39c6e8287462c9cc5e4e98a0df04e86226b800b73079429e525caa6f11a0ca178390557f1d1627b81bfbe8374f5744d46b9f26793ed37259a4d6dcb98537d1d18f4310988390557f44272cd4f68a26997f6acb65a14a20fcfd60f6c4acef3cd91a02d6bcfdaed5288390557f8663a089e0813728a4e1e3bff8c6eb3949a060584f0c5c31f3c03715ee0e49dc8390557ff1511eda415c0a97c97c6448bda607ea98dc4e9490dd92777dc1b3333795d05c8390557fa6ff67f8eb0dc605e02a6062cadd585a09b4f169dfc7416f656b96f2080f58be8390557f3c67f06d3d69d9c82266f31ee51557340a339dd08a06a0317a7333517df0bb208390557f0ed6477784e2539b1ddb81644b29b4bd7cd056363db6cf982590af19119a98118390557fda76f0c384e15886e8d1ddd01fab4c9141a5ef05002499c12ddef11dd24f35298390557f6195f56ccff9bc5391b1d6f982f2fa9d5e83653496e6ebcbacecd83c8f8d82ad8390557fffbe6a11d6130217bc6423f4f90eea6d8c03cfd37fa04b3a3d3a1053fa3ef8278390557fb6d8a45d11faa3c3d9411d6e32493e7fa040fc7f61c588ed499efe6731f3c2378390557fb4d741f9471e5d862def54c9bcd179eba09cd7badae13902b28cff0172ca65e08390557f33a1ff86bfb3adaf651281421b716419fef39eeac5f7155f5b4d39a66d1e78028390557fc5d1a1bb0f323e720bf124ea0482693a3a33d4faf7402c9420022060a075babf8390557f0e822ecd1873557c96bee9e872604f590633ac679b8fc364f69de01d4e8e2e878390557f078928a4222f0bda1edc1deb97542440221b7a2037b62ea72f28816f0248e2d58390557fd4c802103d9e2c300a332f01e347b5cd00372e037aaee130ed82a45d8bf2f46b8190557fed097a11902d76d612353d790b5c247b5a304658f08520f9dd1e998dd38162f58190557f0f9cc79b18d8834bd940dde614ac60b439087a7c19e0f12d4d7636a62e561df88190557f8ab8c953b90b704d4e1fcfae03f4539a5ff471e5e332d9df64b7b9627ba5e0c08190557fd2af8a3129d9103ecf8c13bac4e0735415c280d5a35fb0533c291aea7bfe87fe8190557f54750dea07c787dd53030221737c34aeefc8c3e175685cb0c2af3b31ecee636d8190557f8d03f61fcbdd3c5643eb492a4ce4c6610dc0de186b9d9437abee7ad52c50269d5560067fa853f2482c8147819073e8ef144690b99b589ff7e2f2807f5ba20dab6663f5ff8190557f63e7d10f4f7822f0f9a6318c64660665c1ba6f5462bf2364ce6e9da8874361fa55600a7ffad1632dd365bc838ce20107fb79610dd2034f336017674d62c1f275653f2006557f514c8690de7d6b617aa7b583f7fa8ddc32b651e9568d5034708951536065303f8290557fcf83a7728ff424d7e7d19c56343f6064d0fbceb94b64766eebe90418c75a04868290557f4b9160710dab8975007dd1f7eb7c95e87d87e296fd58a6b2eb12126de3007bd68190557f5e8fedeacf4dca60050387d4a63f58b008f02a8560c4298270b2298a5cb11fc08290557f622f36232f2558d633d2092c18021ea93a788d06dbb637abf3e7b2a10ab777918290557fc5e57b8eefd4a553d0e81fe2bd009d890f2de1a07d151fe13e940a7fb76361f682905560057ff7af81d54f00363a46434d27b1cb151c1d1e324f4029673bda87588ad25eb4ff8190557f060fc779165d208f1234af64d32f26c280ebf25b156a401e5f9dd16863a1b2f08390557f4a56fbcf64c6f813285cb7217c59a2e70c81733dc32c348dd589db59b71591cf8390557f4cad21f851d0674790a103e70a178a4e697c2551a5e376985b2a34007966dd768390557fe9e147071d0e90a760926c3907a89ed48d8117c804daaaab2c08a573f4dbae808390557fae33b957c61cfa5e89fe8650fd444a7ad4d775081df49ee857d825df017a8dc78390557fa8e584f27d9fe9eb61008e57d46d7b4a7f7123dde4729e89ffd82fd26e1e5dd68390557fce409b2e4e861d000fd560275e4ca29385f5fccc882fe4bff4a652f77c8ce74f8390557f92f281a1151807dfbbd770aa4d9b2119f1d110b72211cbe77c2c8e0724dcddbb8390557f212056203f9110c19a9dfa61959f7ccdd8d57a747c7a1e3d7c58d8b95f6ec3ac8390557f022dd0d4f4a10268ebb2b3caf74a868de878d292ce513f52929d68035b81443b8390557fcb42e2a6ebc89c926089d63fd4abdc5c4b1500968027fab229b2a7a514b3f6b28390557fcc77a991d4bb674ba2d0f346519dfe60f41b6f782753366f69840d63929259ad557f7f78e830930983a5ed203e1a6ba41ee2f7187931b129c3229dbb92ff15b5b75c8290557f6f1757df097e4d53b78072f6623f4fd62a8bb4766009ca308ea108d6b7471f8a8290557f71cc79da03f980d15775b50f4931d90960093802ecaa6e48858454f5229b36c38190557f8ed9e710e5cca48fcc03de589f22acc4e55297e909497bcf6009b31bcb07f8318290557fe83f5001fb4d51c8a95156d27fa0e00f5bb66dc30f42914c564a1cc6a723aef28290557f133e542380ca81703ac1587eaee81623395ee198a9550f5318c7e72b431025068290557f2d54f2ef75bed28d43caee7d8fd7250c5f4f77c7a0951b9ba1d0825ca7a91dac8290557f32d92735d46b1396c59d3e681e61795432ee46c8f98d4ff88d067a1f7a0dd5458290557f7e334570594d239548100c92e2e00d192cb6be7f0add7704ff6583bb336cbb848290557fe58f204ff809ae2b9aa8c07e6c18b4c1cbe63732b4ee01568545b8c05bdc87b28190557f9bc0e2702824e3b8ab12f874f91be0fcd9727e070ae869dbd6241a1ab8811b46557fee887cab4b20435232c5b2f952f6c799399a89aec297f1aa336e1300ef7e142a81905560017f07a1279b71fcc09b920cd11d68781acf20ad177452d6636560728448b6ada1798190557f551fc78f3bff38ce55d9666ab11bf97d6501e1ef26bae7f6c5e2e61138bcfdbb8190557fbb33dd97e15b95c32c8aec3f7c729bc3416b2e059f2ee7fd013679552050f3c78190557f1764fa1743812aea660c1c947416f96221eb555f1666a0cdd7948e8c93e0a3cd8190557f07f2a39fdab52b177aa70b5dbcbd6085e3b05554a809b2b89e27361887f975a88190557fcb3067d8ee8fed1fe9bad64d059df8d1170d6f43c9751c4b284e0173f80cb9f88190557fd9c899cdf3abb7e957032c1c34767e8eef3c02468ee53f1f5ccf988f3d9360558190557f1a1c91207169b23211bb4cccdc47fd14a454acaf0fea531b948d08dc5c50f28b8190557fc15db7784400fa02cbcddd643992050eb4bf5574345e7cc6fa821252a4d9aa558190557f2ca906d437e8470a411183a34c72dee25417fe24ab109217502ef85267b851798190557fc5544fe0c09fd5ba7a4338adf231cb05d8875c6a8875538ef659c6276c7a610f8290557fb3f003f2afbe4f2dd7ea4fc8af628433d1cfb971fe6b69b9756fe6fbb038cd4a8190557f8101ff8327dd0f2ba53888896204ab75a189229d0c2700f1281b815d5d3d7c488190557fa5f91b25bf5c01c7a8b4def3221d6dfefbf7dd65217e854ccd3b19b668fa86458190557fbafa048411ea0f6dfe287cb46d8fa90e6fcb86046bfb0b965530b468872a743d8190557f2f94da09bee890876876d1a32e5c345175cff3b1cba7cb8927857f102446a1948190557fde101a188fa72f07cd401e6c0ecd862200aece60a899f256ec73b3b5fcf9e22e8190557f6b08eca4f9dfd4d4cbe02272a7e44b31b431c5a4693c86fbabf8d729fde9e3458190557f85f27715e7bc301f6b4dfe8cb455d1fdc84feffe150d6f285c6f22edf7e04427919091557f89ef2268a80b346041f0aaad1834d62bc7ccaaf70028fdb2ec70b71a6d071db48190557354ad9d40414ed047067ae04c6fafc199a5bb90bb6000527fd3b7775a1973e173d4705649de883722524426acf99bb0db88ab853af1a8edc75562001689565b600d80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b612710811115620015805760405162461bcd60e51b815260206004820152601a60248201527f45524332393831526f79616c746965733a20546f6f2068696768000000000000604482015260640160405180910390fd5b600a80546001600160a01b0319166001600160a01b039390931692909217909155600b55565b828054620015b4906200164c565b90600052602060002090601f016020900481019282620015d8576000855562001623565b82601f10620015f357805160ff191683800117855562001623565b8280016001018555821562001623579182015b828111156200162357825182559160200191906001019062001606565b506200163192915062001635565b5090565b5b8082111562001631576000815560010162001636565b600181811c908216806200166157607f821691505b602082108114156200168357634e487b7160e01b600052602260045260246000fd5b50919050565b6127bf80620016996000396000f3fe60806040526004361061023b5760003560e01c80636373a6b11161012e578063ba67de57116100ab578063dc8c57b41161006f578063dc8c57b41461066c578063e985e9c514610682578063eff31e9e146106cb578063f2fde38b146106e0578063ffe630b51461070057600080fd5b8063ba67de57146105e6578063c662e481146105fc578063c87b56dd14610617578063d4c2cf9e14610637578063db2e21bc1461065757600080fd5b80637d55094d116100f25780637d55094d1461055e5780638da5cb5b1461057357806395d89b4114610591578063a22cb465146105a6578063b88d4fde146105c657600080fd5b80636373a6b1146104df5780636ca46f07146104f457806370a0823114610509578063715018a6146105295780637724bad81461053e57600080fd5b806331f9c919116101bc5780634f6ccce7116101805780634f6ccce71461043f57806355ae9a061461045f57806355f804b31461047f5780635a47c9a91461049f5780636352211e146104bf57600080fd5b806331f9c919146103bb57806332cb6b0c146103d55780633ccfd60b146103eb57806342842e0e146104005780634e12eb0d1461042057600080fd5b806310d8883b1161020357806310d8883b1461031457806318160ddd1461032757806323b872dd1461033c5780632a55205a1461035c5780632f745c591461039b57600080fd5b806301ffc9a71461024057806306fdde0314610275578063081812fc14610297578063095ea7b3146102cf57806309d42b30146102f1575b600080fd5b34801561024c57600080fd5b5061026061025b366004612395565b610720565b60405190151581526020015b60405180910390f35b34801561028157600080fd5b5061028a610731565b60405161026c91906124eb565b3480156102a357600080fd5b506102b76102b2366004612418565b6107c3565b6040516001600160a01b03909116815260200161026c565b3480156102db57600080fd5b506102ef6102ea36600461236b565b61085d565b005b3480156102fd57600080fd5b50610306601481565b60405190815260200161026c565b6102ef610322366004612418565b610973565b34801561033357600080fd5b50600854610306565b34801561034857600080fd5b506102ef610357366004612277565b610b0f565b34801561036857600080fd5b5061037c610377366004612431565b610b40565b604080516001600160a01b03909316835260208301919091520161026c565b3480156103a757600080fd5b506103066103b636600461236b565b610b7a565b3480156103c757600080fd5b506012546102609060ff1681565b3480156103e157600080fd5b5061030661271081565b3480156103f757600080fd5b506102ef610c10565b34801561040c57600080fd5b506102ef61041b366004612277565b610d2f565b34801561042c57600080fd5b5060125461026090610100900460ff1681565b34801561044b57600080fd5b5061030661045a366004612418565b610d4a565b34801561046b57600080fd5b506102ef61047a366004612418565b610ddd565b34801561048b57600080fd5b506102ef61049a3660046123cf565b610ebf565b3480156104ab57600080fd5b506102ef6104ba366004612418565b610efc565b3480156104cb57600080fd5b506102b76104da366004612418565b610f8b565b3480156104eb57600080fd5b5061028a611002565b34801561050057600080fd5b506102ef611090565b34801561051557600080fd5b50610306610524366004612222565b6110d7565b34801561053557600080fd5b506102ef61115e565b34801561054a57600080fd5b50600e546102b7906001600160a01b031681565b34801561056a57600080fd5b506102ef611194565b34801561057f57600080fd5b50600d546001600160a01b03166102b7565b34801561059d57600080fd5b5061028a6111d2565b3480156105b257600080fd5b506102ef6105c136600461232f565b6111e1565b3480156105d257600080fd5b506102ef6105e13660046122b3565b6112a6565b3480156105f257600080fd5b506103066103e881565b34801561060857600080fd5b5061030666b1a2bc2ec5000081565b34801561062357600080fd5b5061028a610632366004612418565b6112de565b34801561064357600080fd5b506102ef610652366004612418565b6113e4565b34801561066357600080fd5b506102ef611578565b34801561067857600080fd5b5061030660115481565b34801561068e57600080fd5b5061026061069d366004612244565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156106d757600080fd5b50610306609681565b3480156106ec57600080fd5b506102ef6106fb366004612222565b6115ed565b34801561070c57600080fd5b506102ef61071b3660046123cf565b611688565b600061072b826116c5565b92915050565b6060600080546107409061269b565b80601f016020809104026020016040519081016040528092919081815260200182805461076c9061269b565b80156107b95780601f1061078e576101008083540402835291602001916107b9565b820191906000526020600020905b81548152906001019060200180831161079c57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166108415760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061086882610f8b565b9050806001600160a01b0316836001600160a01b031614156108d65760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610838565b336001600160a01b03821614806108f257506108f2813361069d565b6109645760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610838565b61096e83836116ea565b505050565b6002600c5414156109965760405162461bcd60e51b8152600401610838906125d6565b6002600c5560006109a660085490565b60125490915060ff166109fb5760405162461bcd60e51b815260206004820152601760248201527f6d696e74696e67206e6f7420656e61626c6564207965740000000000000000006044820152606401610838565b6014821115610a3e5760405162461bcd60e51b815260206004820152600f60248201526e1b585e080c8c081c195c881b5a5b9d608a1b6044820152606401610838565b612710610a4b838361260d565b1115610a845760405162461bcd60e51b81526020600482015260086024820152671cdbdb19081bdd5d60c21b6044820152606401610838565b34610a968366b1a2bc2ec50000612639565b1115610ad55760405162461bcd60e51b815260206004820152600e60248201526d0dcdee840cadcdeeaced0408aa8960931b6044820152606401610838565b60015b828111610b0557610af3335b610aee838561260d565b611758565b80610afd816126d6565b915050610ad8565b50506001600c5550565b610b193382611762565b610b355760405162461bcd60e51b815260040161083890612585565b61096e838383611855565b600a54600b5460009182916001600160a01b039091169061271090610b659086612639565b610b6f9190612625565b915091509250929050565b6000610b85836110d7565b8210610be75760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610838565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600d546001600160a01b03163314610c3a5760405162461bcd60e51b815260040161083890612550565b476000610c48602883612625565b600e546040519192506001600160a01b03169082156108fc029083906000818181858888f19350505050610cbe5760405162461bcd60e51b815260206004820152601a60248201527f6661696c656420746f2073656e6420636f6e74726163744665650000000000006044820152606401610838565b600d546040514793506001600160a01b039091169083156108fc029084906000818181858888f19350505050610d2b5760405162461bcd60e51b81526020600482015260126024820152716661696c656420746f20776974686472617760701b6044820152606401610838565b5050565b61096e838383604051806020016040528060008152506112a6565b6000610d5560085490565b8210610db85760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610838565b60088281548110610dcb57610dcb612747565b90600052602060002001549050919050565b6002600c541415610e005760405162461bcd60e51b8152600401610838906125d6565b6002600c55600d546001600160a01b03163314610e2f5760405162461bcd60e51b815260040161083890612550565b6000610e3a60085490565b90506096610e48838361260d565b1115610e8e5760405162461bcd60e51b815260206004820152601560248201527436b0bc103932b9b2b93b32b9903932b0b1b432b21760591b6044820152606401610838565b60015b828111610b0557610ead610ae4600d546001600160a01b031690565b80610eb7816126d6565b915050610e91565b600d546001600160a01b03163314610ee95760405162461bcd60e51b815260040161083890612550565b8051610d2b9060109060208401906120f7565b600d546001600160a01b03163314610f265760405162461bcd60e51b815260040161083890612550565b61271060115414610f795760405162461bcd60e51b815260206004820181905260248201527f746f6b656e4f66667365742063616e206f6e6c7920626520736574206f6e63656044820152606401610838565b610f85612710826126f1565b60115550565b6000818152600260205260408120546001600160a01b03168061072b5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610838565b600f805461100f9061269b565b80601f016020809104026020016040519081016040528092919081815260200182805461103b9061269b565b80156110885780601f1061105d57610100808354040283529160200191611088565b820191906000526020600020905b81548152906001019060200180831161106b57829003601f168201915b505050505081565b600d546001600160a01b031633146110ba5760405162461bcd60e51b815260040161083890612550565b6012805461ff001981166101009182900460ff1615909102179055565b60006001600160a01b0382166111425760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610838565b506001600160a01b031660009081526003602052604090205490565b600d546001600160a01b031633146111885760405162461bcd60e51b815260040161083890612550565b6111926000611a00565b565b600d546001600160a01b031633146111be5760405162461bcd60e51b815260040161083890612550565b6012805460ff19811660ff90911615179055565b6060600180546107409061269b565b6001600160a01b03821633141561123a5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610838565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6112b03383611762565b6112cc5760405162461bcd60e51b815260040161083890612585565b6112d884848484611a52565b50505050565b6000818152600260205260409020546060906001600160a01b031661135d5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610838565b6000611367611a85565b905060006127106011548561137c919061260d565b61138691906126f1565b61139190600161260d565b905060008251116113b157604051806020016040528060008152506113dc565b816113bb82611a94565b6040516020016113cc92919061247f565b6040516020818303038152906040525b949350505050565b6002600c5414156114075760405162461bcd60e51b8152600401610838906125d6565b6002600c55600061141760085490565b3360009081526013602052604090205460125491925090610100900460ff166114825760405162461bcd60e51b815260206004820152601d60248201527f6561726c79206d696e74696e67206e6f7420656e61626c6564207965740000006044820152606401610838565b61271061148f848461260d565b11156114c85760405162461bcd60e51b81526020600482015260086024820152671cdbdb19081bdd5d60c21b6044820152606401610838565b808311156115295760405162461bcd60e51b815260206004820152602860248201527f6d696e74436f756e7420657863656564732070617373657320666f72207468696044820152671cc81dd85b1b195d60c21b6064820152608401610838565b6115338382612658565b3360009081526013602052604090205560015b83811161156d5761155b33610aee838661260d565b80611565816126d6565b915050611546565b50506001600c555050565b600d546001600160a01b031633146115a25760405162461bcd60e51b815260040161083890612550565b476115b5600d546001600160a01b031690565b6001600160a01b03166108fc829081150290604051600060405180830381858888f19350505050158015610d2b573d6000803e3d6000fd5b600d546001600160a01b031633146116175760405162461bcd60e51b815260040161083890612550565b6001600160a01b03811661167c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610838565b61168581611a00565b50565b600d546001600160a01b031633146116b25760405162461bcd60e51b815260040161083890612550565b8051610d2b90600f9060208401906120f7565b60006001600160e01b0319821663152a902d60e11b148061072b575061072b82611b92565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061171f82610f8b565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b610d2b8282611bb7565b6000818152600260205260408120546001600160a01b03166117db5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610838565b60006117e683610f8b565b9050806001600160a01b0316846001600160a01b031614806118215750836001600160a01b0316611816846107c3565b6001600160a01b0316145b806113dc57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff166113dc565b826001600160a01b031661186882610f8b565b6001600160a01b0316146118d05760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610838565b6001600160a01b0382166119325760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610838565b61193d838383611bd1565b6119486000826116ea565b6001600160a01b0383166000908152600360205260408120805460019290611971908490612658565b90915550506001600160a01b038216600090815260036020526040812080546001929061199f90849061260d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600d80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611a5d848484611855565b611a6984848484611c89565b6112d85760405162461bcd60e51b8152600401610838906124fe565b6060601080546107409061269b565b606081611ab85750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611ae25780611acc816126d6565b9150611adb9050600a83612625565b9150611abc565b60008167ffffffffffffffff811115611afd57611afd61275d565b6040519080825280601f01601f191660200182016040528015611b27576020820181803683370190505b5090505b84156113dc57611b3c600183612658565b9150611b49600a866126f1565b611b5490603061260d565b60f81b818381518110611b6957611b69612747565b60200101906001600160f81b031916908160001a905350611b8b600a86612625565b9450611b2b565b60006001600160e01b0319821663780e9d6360e01b148061072b575061072b82611d96565b610d2b828260405180602001604052806000815250611de6565b6001600160a01b038316611c2c57611c2781600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611c4f565b816001600160a01b0316836001600160a01b031614611c4f57611c4f8382611e19565b6001600160a01b038216611c665761096e81611eb6565b826001600160a01b0316826001600160a01b03161461096e5761096e8282611f65565b60006001600160a01b0384163b15611d8b57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611ccd9033908990889088906004016124ae565b602060405180830381600087803b158015611ce757600080fd5b505af1925050508015611d17575060408051601f3d908101601f19168201909252611d14918101906123b2565b60015b611d71573d808015611d45576040519150601f19603f3d011682016040523d82523d6000602084013e611d4a565b606091505b508051611d695760405162461bcd60e51b8152600401610838906124fe565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506113dc565b506001949350505050565b60006001600160e01b031982166380ac58cd60e01b1480611dc757506001600160e01b03198216635b5e139f60e01b145b8061072b57506301ffc9a760e01b6001600160e01b031983161461072b565b611df08383611fa9565b611dfd6000848484611c89565b61096e5760405162461bcd60e51b8152600401610838906124fe565b60006001611e26846110d7565b611e309190612658565b600083815260076020526040902054909150808214611e83576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090611ec890600190612658565b60008381526009602052604081205460088054939450909284908110611ef057611ef0612747565b906000526020600020015490508060088381548110611f1157611f11612747565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480611f4957611f49612731565b6001900381819060005260206000200160009055905550505050565b6000611f70836110d7565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b038216611fff5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610838565b6000818152600260205260409020546001600160a01b0316156120645760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610838565b61207060008383611bd1565b6001600160a01b038216600090815260036020526040812080546001929061209990849061260d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546121039061269b565b90600052602060002090601f016020900481019282612125576000855561216b565b82601f1061213e57805160ff191683800117855561216b565b8280016001018555821561216b579182015b8281111561216b578251825591602001919060010190612150565b5061217792915061217b565b5090565b5b80821115612177576000815560010161217c565b600067ffffffffffffffff808411156121ab576121ab61275d565b604051601f8501601f19908116603f011681019082821181831017156121d3576121d361275d565b816040528093508581528686860111156121ec57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461221d57600080fd5b919050565b60006020828403121561223457600080fd5b61223d82612206565b9392505050565b6000806040838503121561225757600080fd5b61226083612206565b915061226e60208401612206565b90509250929050565b60008060006060848603121561228c57600080fd5b61229584612206565b92506122a360208501612206565b9150604084013590509250925092565b600080600080608085870312156122c957600080fd5b6122d285612206565b93506122e060208601612206565b925060408501359150606085013567ffffffffffffffff81111561230357600080fd5b8501601f8101871361231457600080fd5b61232387823560208401612190565b91505092959194509250565b6000806040838503121561234257600080fd5b61234b83612206565b91506020830135801515811461236057600080fd5b809150509250929050565b6000806040838503121561237e57600080fd5b61238783612206565b946020939093013593505050565b6000602082840312156123a757600080fd5b813561223d81612773565b6000602082840312156123c457600080fd5b815161223d81612773565b6000602082840312156123e157600080fd5b813567ffffffffffffffff8111156123f857600080fd5b8201601f8101841361240957600080fd5b6113dc84823560208401612190565b60006020828403121561242a57600080fd5b5035919050565b6000806040838503121561244457600080fd5b50508035926020909101359150565b6000815180845261246b81602086016020860161266f565b601f01601f19169290920160200192915050565b6000835161249181846020880161266f565b8351908301906124a581836020880161266f565b01949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906124e190830184612453565b9695505050505050565b60208152600061223d6020830184612453565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6000821982111561262057612620612705565b500190565b6000826126345761263461271b565b500490565b600081600019048311821515161561265357612653612705565b500290565b60008282101561266a5761266a612705565b500390565b60005b8381101561268a578181015183820152602001612672565b838111156112d85750506000910152565b600181811c908216806126af57607f821691505b602082108114156126d057634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156126ea576126ea612705565b5060010190565b6000826127005761270061271b565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461168557600080fdfea2646970667358221220ec383f8c1b76e82631bdf137c964cdd23f3007183ab44203877da3232bb0295464736f6c63430008070033

Deployed Bytecode

0x60806040526004361061023b5760003560e01c80636373a6b11161012e578063ba67de57116100ab578063dc8c57b41161006f578063dc8c57b41461066c578063e985e9c514610682578063eff31e9e146106cb578063f2fde38b146106e0578063ffe630b51461070057600080fd5b8063ba67de57146105e6578063c662e481146105fc578063c87b56dd14610617578063d4c2cf9e14610637578063db2e21bc1461065757600080fd5b80637d55094d116100f25780637d55094d1461055e5780638da5cb5b1461057357806395d89b4114610591578063a22cb465146105a6578063b88d4fde146105c657600080fd5b80636373a6b1146104df5780636ca46f07146104f457806370a0823114610509578063715018a6146105295780637724bad81461053e57600080fd5b806331f9c919116101bc5780634f6ccce7116101805780634f6ccce71461043f57806355ae9a061461045f57806355f804b31461047f5780635a47c9a91461049f5780636352211e146104bf57600080fd5b806331f9c919146103bb57806332cb6b0c146103d55780633ccfd60b146103eb57806342842e0e146104005780634e12eb0d1461042057600080fd5b806310d8883b1161020357806310d8883b1461031457806318160ddd1461032757806323b872dd1461033c5780632a55205a1461035c5780632f745c591461039b57600080fd5b806301ffc9a71461024057806306fdde0314610275578063081812fc14610297578063095ea7b3146102cf57806309d42b30146102f1575b600080fd5b34801561024c57600080fd5b5061026061025b366004612395565b610720565b60405190151581526020015b60405180910390f35b34801561028157600080fd5b5061028a610731565b60405161026c91906124eb565b3480156102a357600080fd5b506102b76102b2366004612418565b6107c3565b6040516001600160a01b03909116815260200161026c565b3480156102db57600080fd5b506102ef6102ea36600461236b565b61085d565b005b3480156102fd57600080fd5b50610306601481565b60405190815260200161026c565b6102ef610322366004612418565b610973565b34801561033357600080fd5b50600854610306565b34801561034857600080fd5b506102ef610357366004612277565b610b0f565b34801561036857600080fd5b5061037c610377366004612431565b610b40565b604080516001600160a01b03909316835260208301919091520161026c565b3480156103a757600080fd5b506103066103b636600461236b565b610b7a565b3480156103c757600080fd5b506012546102609060ff1681565b3480156103e157600080fd5b5061030661271081565b3480156103f757600080fd5b506102ef610c10565b34801561040c57600080fd5b506102ef61041b366004612277565b610d2f565b34801561042c57600080fd5b5060125461026090610100900460ff1681565b34801561044b57600080fd5b5061030661045a366004612418565b610d4a565b34801561046b57600080fd5b506102ef61047a366004612418565b610ddd565b34801561048b57600080fd5b506102ef61049a3660046123cf565b610ebf565b3480156104ab57600080fd5b506102ef6104ba366004612418565b610efc565b3480156104cb57600080fd5b506102b76104da366004612418565b610f8b565b3480156104eb57600080fd5b5061028a611002565b34801561050057600080fd5b506102ef611090565b34801561051557600080fd5b50610306610524366004612222565b6110d7565b34801561053557600080fd5b506102ef61115e565b34801561054a57600080fd5b50600e546102b7906001600160a01b031681565b34801561056a57600080fd5b506102ef611194565b34801561057f57600080fd5b50600d546001600160a01b03166102b7565b34801561059d57600080fd5b5061028a6111d2565b3480156105b257600080fd5b506102ef6105c136600461232f565b6111e1565b3480156105d257600080fd5b506102ef6105e13660046122b3565b6112a6565b3480156105f257600080fd5b506103066103e881565b34801561060857600080fd5b5061030666b1a2bc2ec5000081565b34801561062357600080fd5b5061028a610632366004612418565b6112de565b34801561064357600080fd5b506102ef610652366004612418565b6113e4565b34801561066357600080fd5b506102ef611578565b34801561067857600080fd5b5061030660115481565b34801561068e57600080fd5b5061026061069d366004612244565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156106d757600080fd5b50610306609681565b3480156106ec57600080fd5b506102ef6106fb366004612222565b6115ed565b34801561070c57600080fd5b506102ef61071b3660046123cf565b611688565b600061072b826116c5565b92915050565b6060600080546107409061269b565b80601f016020809104026020016040519081016040528092919081815260200182805461076c9061269b565b80156107b95780601f1061078e576101008083540402835291602001916107b9565b820191906000526020600020905b81548152906001019060200180831161079c57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166108415760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061086882610f8b565b9050806001600160a01b0316836001600160a01b031614156108d65760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610838565b336001600160a01b03821614806108f257506108f2813361069d565b6109645760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610838565b61096e83836116ea565b505050565b6002600c5414156109965760405162461bcd60e51b8152600401610838906125d6565b6002600c5560006109a660085490565b60125490915060ff166109fb5760405162461bcd60e51b815260206004820152601760248201527f6d696e74696e67206e6f7420656e61626c6564207965740000000000000000006044820152606401610838565b6014821115610a3e5760405162461bcd60e51b815260206004820152600f60248201526e1b585e080c8c081c195c881b5a5b9d608a1b6044820152606401610838565b612710610a4b838361260d565b1115610a845760405162461bcd60e51b81526020600482015260086024820152671cdbdb19081bdd5d60c21b6044820152606401610838565b34610a968366b1a2bc2ec50000612639565b1115610ad55760405162461bcd60e51b815260206004820152600e60248201526d0dcdee840cadcdeeaced0408aa8960931b6044820152606401610838565b60015b828111610b0557610af3335b610aee838561260d565b611758565b80610afd816126d6565b915050610ad8565b50506001600c5550565b610b193382611762565b610b355760405162461bcd60e51b815260040161083890612585565b61096e838383611855565b600a54600b5460009182916001600160a01b039091169061271090610b659086612639565b610b6f9190612625565b915091509250929050565b6000610b85836110d7565b8210610be75760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610838565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600d546001600160a01b03163314610c3a5760405162461bcd60e51b815260040161083890612550565b476000610c48602883612625565b600e546040519192506001600160a01b03169082156108fc029083906000818181858888f19350505050610cbe5760405162461bcd60e51b815260206004820152601a60248201527f6661696c656420746f2073656e6420636f6e74726163744665650000000000006044820152606401610838565b600d546040514793506001600160a01b039091169083156108fc029084906000818181858888f19350505050610d2b5760405162461bcd60e51b81526020600482015260126024820152716661696c656420746f20776974686472617760701b6044820152606401610838565b5050565b61096e838383604051806020016040528060008152506112a6565b6000610d5560085490565b8210610db85760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610838565b60088281548110610dcb57610dcb612747565b90600052602060002001549050919050565b6002600c541415610e005760405162461bcd60e51b8152600401610838906125d6565b6002600c55600d546001600160a01b03163314610e2f5760405162461bcd60e51b815260040161083890612550565b6000610e3a60085490565b90506096610e48838361260d565b1115610e8e5760405162461bcd60e51b815260206004820152601560248201527436b0bc103932b9b2b93b32b9903932b0b1b432b21760591b6044820152606401610838565b60015b828111610b0557610ead610ae4600d546001600160a01b031690565b80610eb7816126d6565b915050610e91565b600d546001600160a01b03163314610ee95760405162461bcd60e51b815260040161083890612550565b8051610d2b9060109060208401906120f7565b600d546001600160a01b03163314610f265760405162461bcd60e51b815260040161083890612550565b61271060115414610f795760405162461bcd60e51b815260206004820181905260248201527f746f6b656e4f66667365742063616e206f6e6c7920626520736574206f6e63656044820152606401610838565b610f85612710826126f1565b60115550565b6000818152600260205260408120546001600160a01b03168061072b5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610838565b600f805461100f9061269b565b80601f016020809104026020016040519081016040528092919081815260200182805461103b9061269b565b80156110885780601f1061105d57610100808354040283529160200191611088565b820191906000526020600020905b81548152906001019060200180831161106b57829003601f168201915b505050505081565b600d546001600160a01b031633146110ba5760405162461bcd60e51b815260040161083890612550565b6012805461ff001981166101009182900460ff1615909102179055565b60006001600160a01b0382166111425760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610838565b506001600160a01b031660009081526003602052604090205490565b600d546001600160a01b031633146111885760405162461bcd60e51b815260040161083890612550565b6111926000611a00565b565b600d546001600160a01b031633146111be5760405162461bcd60e51b815260040161083890612550565b6012805460ff19811660ff90911615179055565b6060600180546107409061269b565b6001600160a01b03821633141561123a5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610838565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6112b03383611762565b6112cc5760405162461bcd60e51b815260040161083890612585565b6112d884848484611a52565b50505050565b6000818152600260205260409020546060906001600160a01b031661135d5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610838565b6000611367611a85565b905060006127106011548561137c919061260d565b61138691906126f1565b61139190600161260d565b905060008251116113b157604051806020016040528060008152506113dc565b816113bb82611a94565b6040516020016113cc92919061247f565b6040516020818303038152906040525b949350505050565b6002600c5414156114075760405162461bcd60e51b8152600401610838906125d6565b6002600c55600061141760085490565b3360009081526013602052604090205460125491925090610100900460ff166114825760405162461bcd60e51b815260206004820152601d60248201527f6561726c79206d696e74696e67206e6f7420656e61626c6564207965740000006044820152606401610838565b61271061148f848461260d565b11156114c85760405162461bcd60e51b81526020600482015260086024820152671cdbdb19081bdd5d60c21b6044820152606401610838565b808311156115295760405162461bcd60e51b815260206004820152602860248201527f6d696e74436f756e7420657863656564732070617373657320666f72207468696044820152671cc81dd85b1b195d60c21b6064820152608401610838565b6115338382612658565b3360009081526013602052604090205560015b83811161156d5761155b33610aee838661260d565b80611565816126d6565b915050611546565b50506001600c555050565b600d546001600160a01b031633146115a25760405162461bcd60e51b815260040161083890612550565b476115b5600d546001600160a01b031690565b6001600160a01b03166108fc829081150290604051600060405180830381858888f19350505050158015610d2b573d6000803e3d6000fd5b600d546001600160a01b031633146116175760405162461bcd60e51b815260040161083890612550565b6001600160a01b03811661167c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610838565b61168581611a00565b50565b600d546001600160a01b031633146116b25760405162461bcd60e51b815260040161083890612550565b8051610d2b90600f9060208401906120f7565b60006001600160e01b0319821663152a902d60e11b148061072b575061072b82611b92565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061171f82610f8b565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b610d2b8282611bb7565b6000818152600260205260408120546001600160a01b03166117db5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610838565b60006117e683610f8b565b9050806001600160a01b0316846001600160a01b031614806118215750836001600160a01b0316611816846107c3565b6001600160a01b0316145b806113dc57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff166113dc565b826001600160a01b031661186882610f8b565b6001600160a01b0316146118d05760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610838565b6001600160a01b0382166119325760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610838565b61193d838383611bd1565b6119486000826116ea565b6001600160a01b0383166000908152600360205260408120805460019290611971908490612658565b90915550506001600160a01b038216600090815260036020526040812080546001929061199f90849061260d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600d80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611a5d848484611855565b611a6984848484611c89565b6112d85760405162461bcd60e51b8152600401610838906124fe565b6060601080546107409061269b565b606081611ab85750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611ae25780611acc816126d6565b9150611adb9050600a83612625565b9150611abc565b60008167ffffffffffffffff811115611afd57611afd61275d565b6040519080825280601f01601f191660200182016040528015611b27576020820181803683370190505b5090505b84156113dc57611b3c600183612658565b9150611b49600a866126f1565b611b5490603061260d565b60f81b818381518110611b6957611b69612747565b60200101906001600160f81b031916908160001a905350611b8b600a86612625565b9450611b2b565b60006001600160e01b0319821663780e9d6360e01b148061072b575061072b82611d96565b610d2b828260405180602001604052806000815250611de6565b6001600160a01b038316611c2c57611c2781600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611c4f565b816001600160a01b0316836001600160a01b031614611c4f57611c4f8382611e19565b6001600160a01b038216611c665761096e81611eb6565b826001600160a01b0316826001600160a01b03161461096e5761096e8282611f65565b60006001600160a01b0384163b15611d8b57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611ccd9033908990889088906004016124ae565b602060405180830381600087803b158015611ce757600080fd5b505af1925050508015611d17575060408051601f3d908101601f19168201909252611d14918101906123b2565b60015b611d71573d808015611d45576040519150601f19603f3d011682016040523d82523d6000602084013e611d4a565b606091505b508051611d695760405162461bcd60e51b8152600401610838906124fe565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506113dc565b506001949350505050565b60006001600160e01b031982166380ac58cd60e01b1480611dc757506001600160e01b03198216635b5e139f60e01b145b8061072b57506301ffc9a760e01b6001600160e01b031983161461072b565b611df08383611fa9565b611dfd6000848484611c89565b61096e5760405162461bcd60e51b8152600401610838906124fe565b60006001611e26846110d7565b611e309190612658565b600083815260076020526040902054909150808214611e83576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090611ec890600190612658565b60008381526009602052604081205460088054939450909284908110611ef057611ef0612747565b906000526020600020015490508060088381548110611f1157611f11612747565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480611f4957611f49612731565b6001900381819060005260206000200160009055905550505050565b6000611f70836110d7565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b038216611fff5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610838565b6000818152600260205260409020546001600160a01b0316156120645760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610838565b61207060008383611bd1565b6001600160a01b038216600090815260036020526040812080546001929061209990849061260d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546121039061269b565b90600052602060002090601f016020900481019282612125576000855561216b565b82601f1061213e57805160ff191683800117855561216b565b8280016001018555821561216b579182015b8281111561216b578251825591602001919060010190612150565b5061217792915061217b565b5090565b5b80821115612177576000815560010161217c565b600067ffffffffffffffff808411156121ab576121ab61275d565b604051601f8501601f19908116603f011681019082821181831017156121d3576121d361275d565b816040528093508581528686860111156121ec57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461221d57600080fd5b919050565b60006020828403121561223457600080fd5b61223d82612206565b9392505050565b6000806040838503121561225757600080fd5b61226083612206565b915061226e60208401612206565b90509250929050565b60008060006060848603121561228c57600080fd5b61229584612206565b92506122a360208501612206565b9150604084013590509250925092565b600080600080608085870312156122c957600080fd5b6122d285612206565b93506122e060208601612206565b925060408501359150606085013567ffffffffffffffff81111561230357600080fd5b8501601f8101871361231457600080fd5b61232387823560208401612190565b91505092959194509250565b6000806040838503121561234257600080fd5b61234b83612206565b91506020830135801515811461236057600080fd5b809150509250929050565b6000806040838503121561237e57600080fd5b61238783612206565b946020939093013593505050565b6000602082840312156123a757600080fd5b813561223d81612773565b6000602082840312156123c457600080fd5b815161223d81612773565b6000602082840312156123e157600080fd5b813567ffffffffffffffff8111156123f857600080fd5b8201601f8101841361240957600080fd5b6113dc84823560208401612190565b60006020828403121561242a57600080fd5b5035919050565b6000806040838503121561244457600080fd5b50508035926020909101359150565b6000815180845261246b81602086016020860161266f565b601f01601f19169290920160200192915050565b6000835161249181846020880161266f565b8351908301906124a581836020880161266f565b01949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906124e190830184612453565b9695505050505050565b60208152600061223d6020830184612453565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6000821982111561262057612620612705565b500190565b6000826126345761263461271b565b500490565b600081600019048311821515161561265357612653612705565b500290565b60008282101561266a5761266a612705565b500390565b60005b8381101561268a578181015183820152602001612672565b838111156112d85750506000910152565b600181811c908216806126af57607f821691505b602082108114156126d057634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156126ea576126ea612705565b5060010190565b6000826127005761270061271b565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461168557600080fdfea2646970667358221220ec383f8c1b76e82631bdf137c964cdd23f3007183ab44203877da3232bb0295464736f6c63430008070033

Deployed Bytecode Sourcemap

46771:14145:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60660:251;;;;;;;;;;-1:-1:-1;60660:251:0;;;;;:::i;:::-;;:::i;:::-;;;6178:14:1;;6171:22;6153:41;;6141:2;6126:18;60660:251:0;;;;;;;;28627:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;30186:221::-;;;;;;;;;;-1:-1:-1;30186:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;5197:32:1;;;5179:51;;5167:2;5152:18;30186:221:0;5033:203:1;29709:411:0;;;;;;;;;;-1:-1:-1;29709:411:0;;;;;:::i;:::-;;:::i;:::-;;47073:41;;;;;;;;;;;;47112:2;47073:41;;;;;17697:25:1;;;17685:2;17670:18;47073:41:0;17551:177:1;57278:513:0;;;;;;:::i;:::-;;:::i;41259:113::-;;;;;;;;;;-1:-1:-1;41347:10:0;:17;41259:113;;31076:339;;;;;;;;;;-1:-1:-1;31076:339:0;;;;;:::i;:::-;;:::i;16428:241::-;;;;;;;;;;-1:-1:-1;16428:241:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;5926:32:1;;;5908:51;;5990:2;5975:18;;5968:34;;;;5881:18;16428:241:0;5734:274:1;40927:256:0;;;;;;;;;;-1:-1:-1;40927:256:0;;;;;:::i;:::-;;:::i;47376:33::-;;;;;;;;;;-1:-1:-1;47376:33:0;;;;;;;;46976:42;;;;;;;;;;;;47013:5;46976:42;;60055:440;;;;;;;;;;;;;:::i;31486:185::-;;;;;;;;;;-1:-1:-1;31486:185:0;;;;;:::i;:::-;;:::i;47416:38::-;;;;;;;;;;-1:-1:-1;47416:38:0;;;;;;;;;;;41449:233;;;;;;;;;;-1:-1:-1;41449:233:0;;;;;:::i;:::-;;:::i;57799:340::-;;;;;;;;;;-1:-1:-1;57799:340:0;;;;;:::i;:::-;;:::i;59821:105::-;;;;;;;;;;-1:-1:-1;59821:105:0;;;;;:::i;:::-;;:::i;59619:194::-;;;;;;;;;;-1:-1:-1;59619:194:0;;;;;:::i;:::-;;:::i;28321:239::-;;;;;;;;;;-1:-1:-1;28321:239:0;;;;;:::i;:::-;;:::i;47265:24::-;;;;;;;;;;;;;:::i;59505:106::-;;;;;;;;;;;;;:::i;28051:208::-;;;;;;;;;;-1:-1:-1;28051:208:0;;;;;:::i;:::-;;:::i;11769:103::-;;;;;;;;;;;;;:::i;47185:71::-;;;;;;;;;;-1:-1:-1;47185:71:0;;;;-1:-1:-1;;;;;47185:71:0;;;59406:91;;;;;;;;;;;;;:::i;11118:87::-;;;;;;;;;;-1:-1:-1;11191:6:0;;-1:-1:-1;;;;;11191:6:0;11118:87;;28796:104;;;;;;;;;;;;;:::i;30479:295::-;;;;;;;;;;-1:-1:-1;30479:295:0;;;;;:::i;:::-;;:::i;31742:328::-;;;;;;;;;;-1:-1:-1;31742:328:0;;;;;:::i;:::-;;:::i;47121:48::-;;;;;;;;;;;;47165:4;47121:48;;46904:53;;;;;;;;;;;;46940:17;46904:53;;58867:415;;;;;;;;;;-1:-1:-1;58867:415:0;;;;;:::i;:::-;;:::i;58147:598::-;;;;;;;;;;-1:-1:-1;58147:598:0;;;;;:::i;:::-;;:::i;60503:149::-;;;;;;;;;;;;;:::i;47330:39::-;;;;;;;;;;;;;;;;30845:164;;;;;;;;;;-1:-1:-1;30845:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;30966:25:0;;;30942:4;30966:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;30845:164;47025:41;;;;;;;;;;;;47063:3;47025:41;;12027:201;;;;;;;;;;-1:-1:-1;12027:201:0;;;;;:::i;:::-;;:::i;59290:108::-;;;;;;;;;;-1:-1:-1;59290:108:0;;;;;:::i;:::-;;:::i;60660:251::-;60838:4;60867:36;60891:11;60867:23;:36::i;:::-;60860:43;60660:251;-1:-1:-1;;60660:251:0:o;28627:100::-;28681:13;28714:5;28707:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28627:100;:::o;30186:221::-;30262:7;33669:16;;;:7;:16;;;;;;-1:-1:-1;;;;;33669:16:0;30282:73;;;;-1:-1:-1;;;30282:73:0;;12448:2:1;30282:73:0;;;12430:21:1;12487:2;12467:18;;;12460:30;12526:34;12506:18;;;12499:62;-1:-1:-1;;;12577:18:1;;;12570:42;12629:19;;30282:73:0;;;;;;;;;-1:-1:-1;30375:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;30375:24:0;;30186:221::o;29709:411::-;29790:13;29806:23;29821:7;29806:14;:23::i;:::-;29790:39;;29854:5;-1:-1:-1;;;;;29848:11:0;:2;-1:-1:-1;;;;;29848:11:0;;;29840:57;;;;-1:-1:-1;;;29840:57:0;;15105:2:1;29840:57:0;;;15087:21:1;15144:2;15124:18;;;15117:30;15183:34;15163:18;;;15156:62;-1:-1:-1;;;15234:18:1;;;15227:31;15275:19;;29840:57:0;14903:397:1;29840:57:0;10065:10;-1:-1:-1;;;;;29932:21:0;;;;:62;;-1:-1:-1;29957:37:0;29974:5;10065:10;30845:164;:::i;29957:37::-;29910:168;;;;-1:-1:-1;;;29910:168:0;;10841:2:1;29910:168:0;;;10823:21:1;10880:2;10860:18;;;10853:30;10919:34;10899:18;;;10892:62;10990:26;10970:18;;;10963:54;11034:19;;29910:168:0;10639:420:1;29910:168:0;30091:21;30100:2;30104:7;30091:8;:21::i;:::-;29779:341;29709:411;;:::o;57278:513::-;14420:1;15018:7;;:19;;15010:63;;;;-1:-1:-1;;;15010:63:0;;;;;;;:::i;:::-;14420:1;15151:7;:18;57356:19:::1;57378;41347:10:::0;:17;;41259:113;57378:19:::1;57416:13;::::0;57356:41;;-1:-1:-1;57416:13:0::1;;57408:49;;;::::0;-1:-1:-1;;;57408:49:0;;14753:2:1;57408:49:0::1;::::0;::::1;14735:21:1::0;14792:2;14772:18;;;14765:30;14831:25;14811:18;;;14804:53;14874:18;;57408:49:0::1;14551:347:1::0;57408:49:0::1;47112:2;57476:9;:25;;57468:53;;;::::0;-1:-1:-1;;;57468:53:0;;17049:2:1;57468:53:0::1;::::0;::::1;17031:21:1::0;17088:2;17068:18;;;17061:30;-1:-1:-1;;;17107:18:1;;;17100:45;17162:18;;57468:53:0::1;16847:339:1::0;57468:53:0::1;47013:5;57540:23;57554:9:::0;57540:11;:23:::1;:::i;:::-;:37;;57532:58;;;::::0;-1:-1:-1;;;57532:58:0;;10505:2:1;57532:58:0::1;::::0;::::1;10487:21:1::0;10544:1;10524:18;;;10517:29;-1:-1:-1;;;10562:18:1;;;10555:38;10610:18;;57532:58:0::1;10303:331:1::0;57532:58:0::1;57634:9;57609:21;57621:9:::0;46940:17:::1;57609:21;:::i;:::-;:34;;57601:61;;;::::0;-1:-1:-1;;;57601:61:0;;9749:2:1;57601:61:0::1;::::0;::::1;9731:21:1::0;9788:2;9768:18;;;9761:30;-1:-1:-1;;;9807:18:1;;;9800:44;9861:18;;57601:61:0::1;9547:338:1::0;57601:61:0::1;57692:1;57675:109;57700:9;57695:1;:14;57675:109;;57731:41;10065:10:::0;57742:12:::1;57756:15;57770:1:::0;57756:11;:15:::1;:::i;:::-;57731:10;:41::i;:::-;57711:3:::0;::::1;::::0;::::1;:::i;:::-;;;;57675:109;;;-1:-1:-1::0;;14376:1:0;15330:7;:22;-1:-1:-1;57278:513:0:o;31076:339::-;31271:41;10065:10;31304:7;31271:18;:41::i;:::-;31263:103;;;;-1:-1:-1;;;31263:103:0;;;;;;;:::i;:::-;31379:28;31389:4;31395:2;31399:7;31379:9;:28::i;16428:241::-;16606:19;;16636:15;;16541:16;;;;-1:-1:-1;;;;;16606:19:0;;;;16655:5;;16628:23;;:5;:23;:::i;:::-;16627:33;;;;:::i;:::-;16598:63;;;;16428:241;;;;;:::o;40927:256::-;41024:7;41060:23;41077:5;41060:16;:23::i;:::-;41052:5;:31;41044:87;;;;-1:-1:-1;;;41044:87:0;;6631:2:1;41044:87:0;;;6613:21:1;6670:2;6650:18;;;6643:30;6709:34;6689:18;;;6682:62;-1:-1:-1;;;6760:18:1;;;6753:41;6811:19;;41044:87:0;6429:407:1;41044:87:0;-1:-1:-1;;;;;;41149:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;40927:256::o;60055:440::-;11191:6;;-1:-1:-1;;;;;11191:6:0;10065:10;11338:23;11330:68;;;;-1:-1:-1;;;11330:68:0;;;;;;;:::i;:::-;60121:21:::1;60103:15;60175:12;60185:2;60121:21:::0;60175:12:::1;:::i;:::-;60268:11;::::0;60260:38:::1;::::0;60153:34;;-1:-1:-1;;;;;;60268:11:0::1;::::0;60260:38;::::1;;;::::0;60153:34;;60268:11:::1;60260:38:::0;60268:11;60260:38;60153:34;60268:11;60260:38;::::1;;;;;;60252:77;;;::::0;-1:-1:-1;;;60252:77:0;;7869:2:1;60252:77:0::1;::::0;::::1;7851:21:1::0;7908:2;7888:18;;;7881:30;7947:28;7927:18;;;7920:56;7993:18;;60252:77:0::1;7667:350:1::0;60252:77:0::1;11191:6:::0;;60434:30:::1;::::0;60394:21:::1;::::0;-1:-1:-1;;;;;;11191:6:0;;;;60434:30;::::1;;;::::0;60394:21;;60434:30:::1;::::0;;;60394:21;11191:6;60434:30;::::1;;;;;;60426:61;;;::::0;-1:-1:-1;;;60426:61:0;;14406:2:1;60426:61:0::1;::::0;::::1;14388:21:1::0;14445:2;14425:18;;;14418:30;-1:-1:-1;;;14464:18:1;;;14457:48;14522:18;;60426:61:0::1;14204:342:1::0;60426:61:0::1;60092:403;;60055:440::o:0;31486:185::-;31624:39;31641:4;31647:2;31651:7;31624:39;;;;;;;;;;;;:16;:39::i;41449:233::-;41524:7;41560:30;41347:10;:17;;41259:113;41560:30;41552:5;:38;41544:95;;;;-1:-1:-1;;;41544:95:0;;16636:2:1;41544:95:0;;;16618:21:1;16675:2;16655:18;;;16648:30;16714:34;16694:18;;;16687:62;-1:-1:-1;;;16765:18:1;;;16758:42;16817:19;;41544:95:0;16434:408:1;41544:95:0;41657:10;41668:5;41657:17;;;;;;;;:::i;:::-;;;;;;;;;41650:24;;41449:233;;;:::o;57799:340::-;14420:1;15018:7;;:19;;15010:63;;;;-1:-1:-1;;;15010:63:0;;;;;;;:::i;:::-;14420:1;15151:7;:18;11191:6;;-1:-1:-1;;;;;11191:6:0;10065:10;11338:23:::1;11330:68;;;;-1:-1:-1::0;;;11330:68:0::1;;;;;;;:::i;:::-;57885:19:::2;57907;41347:10:::0;:17;;41259:113;57907:19:::2;57885:41:::0;-1:-1:-1;47063:3:0::2;57945:26;57959:12:::0;57885:41;57945:26:::2;:::i;:::-;:41;;57937:75;;;::::0;-1:-1:-1;;;57937:75:0;;16286:2:1;57937:75:0::2;::::0;::::2;16268:21:1::0;16325:2;16305:18;;;16298:30;-1:-1:-1;;;16344:18:1;;;16337:51;16405:18;;57937:75:0::2;16084:345:1::0;57937:75:0::2;58042:1;58025:107;58050:12;58045:1;:17;58025:107;;58084:36;58095:7;11191:6:::0;;-1:-1:-1;;;;;11191:6:0;;11118:87;58084:36:::2;58064:3:::0;::::2;::::0;::::2;:::i;:::-;;;;58025:107;;59821:105:::0;11191:6;;-1:-1:-1;;;;;11191:6:0;10065:10;11338:23;11330:68;;;;-1:-1:-1;;;11330:68:0;;;;;;;:::i;:::-;59896:22;;::::1;::::0;:12:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;59619:194::-:0;11191:6;;-1:-1:-1;;;;;11191:6:0;10065:10;11338:23;11330:68;;;;-1:-1:-1;;;11330:68:0;;;;;;;:::i;:::-;47013:5:::1;59699:11;;:25;59691:70;;;::::0;-1:-1:-1;;;59691:70:0;;15925:2:1;59691:70:0::1;::::0;::::1;15907:21:1::0;;;15944:18;;;15937:30;16003:34;15983:18;;;15976:62;16055:18;;59691:70:0::1;15723:356:1::0;59691:70:0::1;59786:19;47013:5;59786:6:::0;:19:::1;:::i;:::-;59772:11;:33:::0;-1:-1:-1;59619:194:0:o;28321:239::-;28393:7;28429:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28429:16:0;28464:19;28456:73;;;;-1:-1:-1;;;28456:73:0;;11677:2:1;28456:73:0;;;11659:21:1;11716:2;11696:18;;;11689:30;11755:34;11735:18;;;11728:62;-1:-1:-1;;;11806:18:1;;;11799:39;11855:19;;28456:73:0;11475:405:1;47265:24:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;59505:106::-;11191:6;;-1:-1:-1;;;;;11191:6:0;10065:10;11338:23;11330:68;;;;-1:-1:-1;;;11330:68:0;;;;;;;:::i;:::-;59585:18:::1;::::0;;-1:-1:-1;;59563:40:0;::::1;59585:18;::::0;;;::::1;;;59584:19;59563:40:::0;;::::1;;::::0;;59505:106::o;28051:208::-;28123:7;-1:-1:-1;;;;;28151:19:0;;28143:74;;;;-1:-1:-1;;;28143:74:0;;11266:2:1;28143:74:0;;;11248:21:1;11305:2;11285:18;;;11278:30;11344:34;11324:18;;;11317:62;-1:-1:-1;;;11395:18:1;;;11388:40;11445:19;;28143:74:0;11064:406:1;28143:74:0;-1:-1:-1;;;;;;28235:16:0;;;;;:9;:16;;;;;;;28051:208::o;11769:103::-;11191:6;;-1:-1:-1;;;;;11191:6:0;10065:10;11338:23;11330:68;;;;-1:-1:-1;;;11330:68:0;;;;;;;:::i;:::-;11834:30:::1;11861:1;11834:18;:30::i;:::-;11769:103::o:0;59406:91::-;11191:6;;-1:-1:-1;;;;;11191:6:0;10065:10;11338:23;11330:68;;;;-1:-1:-1;;;11330:68:0;;;;;;;:::i;:::-;59476:13:::1;::::0;;-1:-1:-1;;59459:30:0;::::1;59476:13;::::0;;::::1;59475:14;59459:30;::::0;;59406:91::o;28796:104::-;28852:13;28885:7;28878:14;;;;;:::i;30479:295::-;-1:-1:-1;;;;;30582:24:0;;10065:10;30582:24;;30574:62;;;;-1:-1:-1;;;30574:62:0;;9395:2:1;30574:62:0;;;9377:21:1;9434:2;9414:18;;;9407:30;9473:27;9453:18;;;9446:55;9518:18;;30574:62:0;9193:349:1;30574:62:0;10065:10;30649:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;30649:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;30649:53:0;;;;;;;;;;30718:48;;6153:41:1;;;30649:42:0;;10065:10;30718:48;;6126:18:1;30718:48:0;;;;;;;30479:295;;:::o;31742:328::-;31917:41;10065:10;31950:7;31917:18;:41::i;:::-;31909:103;;;;-1:-1:-1;;;31909:103:0;;;;;;;:::i;:::-;32023:39;32037:4;32043:2;32047:7;32056:5;32023:13;:39::i;:::-;31742:328;;;;:::o;58867:415::-;33645:4;33669:16;;;:7;:16;;;;;;58940:13;;-1:-1:-1;;;;;33669:16:0;58966:76;;;;-1:-1:-1;;;58966:76:0;;13990:2:1;58966:76:0;;;13972:21:1;14029:2;14009:18;;;14002:30;14068:34;14048:18;;;14041:62;-1:-1:-1;;;14119:18:1;;;14112:45;14174:19;;58966:76:0;13788:411:1;58966:76:0;59055:21;59079:10;:8;:10::i;:::-;59055:34;;59100:21;47013:5;59139:11;;59129:7;:21;;;;:::i;:::-;59128:36;;;;:::i;:::-;59124:40;;:1;:40;:::i;:::-;59100:64;;59206:1;59188:7;59182:21;:25;:92;;;;;;;;;;;;;;;;;59234:7;59243:24;:13;:22;:24::i;:::-;59217:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59182:92;59175:99;58867:415;-1:-1:-1;;;;58867:415:0:o;58147:598::-;14420:1;15018:7;;:19;;15010:63;;;;-1:-1:-1;;;15010:63:0;;;;;;;:::i;:::-;14420:1;15151:7;:18;58230:19:::1;58252;41347:10:::0;:17;;41259:113;58252:19:::1;10065:10:::0;58282:18:::1;58303:23:::0;;;:9:::1;:23;::::0;;;;;58347:18:::1;::::0;58230:41;;-1:-1:-1;58303:23:0;58347:18:::1;::::0;::::1;;;58339:60;;;::::0;-1:-1:-1;;;58339:60:0;;12861:2:1;58339:60:0::1;::::0;::::1;12843:21:1::0;12900:2;12880:18;;;12873:30;12939:31;12919:18;;;12912:59;12988:18;;58339:60:0::1;12659:353:1::0;58339:60:0::1;47013:5;58418:23;58432:9:::0;58418:11;:23:::1;:::i;:::-;:37;;58410:58;;;::::0;-1:-1:-1;;;58410:58:0;;10505:2:1;58410:58:0::1;::::0;::::1;10487:21:1::0;10544:1;10524:18;;;10517:29;-1:-1:-1;;;10562:18:1;;;10555:38;10610:18;;58410:58:0::1;10303:331:1::0;58410:58:0::1;58500:10;58487:9;:23;;58479:76;;;::::0;-1:-1:-1;;;58479:76:0;;8581:2:1;58479:76:0::1;::::0;::::1;8563:21:1::0;8620:2;8600:18;;;8593:30;8659:34;8639:18;;;8632:62;-1:-1:-1;;;8710:18:1;;;8703:38;8758:19;;58479:76:0::1;8379:404:1::0;58479:76:0::1;58594:22;58607:9:::0;58594:10;:22:::1;:::i;:::-;10065:10:::0;58568:23:::1;::::0;;;:9:::1;:23;::::0;;;;:48;58646:1:::1;58629:109;58654:9;58649:1;:14;58629:109;;58685:41;10065:10:::0;58710:15:::1;58724:1:::0;58710:11;:15:::1;:::i;58685:41::-;58665:3:::0;::::1;::::0;::::1;:::i;:::-;;;;58629:109;;;-1:-1:-1::0;;14376:1:0;15330:7;:22;-1:-1:-1;;58147:598:0:o;60503:149::-;11191:6;;-1:-1:-1;;;;;11191:6:0;10065:10;11338:23;11330:68;;;;-1:-1:-1;;;11330:68:0;;;;;;;:::i;:::-;60578:21:::1;60618:7;11191:6:::0;;-1:-1:-1;;;;;11191:6:0;;11118:87;60618:7:::1;-1:-1:-1::0;;;;;60610:25:0::1;:34;60636:7;60610:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;12027:201:::0;11191:6;;-1:-1:-1;;;;;11191:6:0;10065:10;11338:23;11330:68;;;;-1:-1:-1;;;11330:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;12116:22:0;::::1;12108:73;;;::::0;-1:-1:-1;;;12108:73:0;;7462:2:1;12108:73:0::1;::::0;::::1;7444:21:1::0;7501:2;7481:18;;;7474:30;7540:34;7520:18;;;7513:62;-1:-1:-1;;;7591:18:1;;;7584:36;7637:19;;12108:73:0::1;7260:402:1::0;12108:73:0::1;12192:28;12211:8;12192:18;:28::i;:::-;12027:201:::0;:::o;59290:108::-;11191:6;;-1:-1:-1;;;;;11191:6:0;10065:10;11338:23;11330:68;;;;-1:-1:-1;;;11330:68:0;;;;;;;:::i;:::-;59367:23;;::::1;::::0;:10:::1;::::0;:23:::1;::::0;::::1;::::0;::::1;:::i;15715:283::-:0;15845:4;-1:-1:-1;;;;;;15887:50:0;;-1:-1:-1;;;15887:50:0;;:103;;;15954:36;15978:11;15954:23;:36::i;37562:174::-;37637:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;37637:29:0;-1:-1:-1;;;;;37637:29:0;;;;;;;;:24;;37691:23;37637:24;37691:14;:23::i;:::-;-1:-1:-1;;;;;37682:46:0;;;;;;;;;;;37562:174;;:::o;58753:106::-;58825:26;58835:6;58843:7;58825:9;:26::i;33874:348::-;33967:4;33669:16;;;:7;:16;;;;;;-1:-1:-1;;;;;33669:16:0;33984:73;;;;-1:-1:-1;;;33984:73:0;;10092:2:1;33984:73:0;;;10074:21:1;10131:2;10111:18;;;10104:30;10170:34;10150:18;;;10143:62;-1:-1:-1;;;10221:18:1;;;10214:42;10273:19;;33984:73:0;9890:408:1;33984:73:0;34068:13;34084:23;34099:7;34084:14;:23::i;:::-;34068:39;;34137:5;-1:-1:-1;;;;;34126:16:0;:7;-1:-1:-1;;;;;34126:16:0;;:51;;;;34170:7;-1:-1:-1;;;;;34146:31:0;:20;34158:7;34146:11;:20::i;:::-;-1:-1:-1;;;;;34146:31:0;;34126:51;:87;;;-1:-1:-1;;;;;;30966:25:0;;;30942:4;30966:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;34181:32;30845:164;36866:578;37025:4;-1:-1:-1;;;;;36998:31:0;:23;37013:7;36998:14;:23::i;:::-;-1:-1:-1;;;;;36998:31:0;;36990:85;;;;-1:-1:-1;;;36990:85:0;;13580:2:1;36990:85:0;;;13562:21:1;13619:2;13599:18;;;13592:30;13658:34;13638:18;;;13631:62;-1:-1:-1;;;13709:18:1;;;13702:39;13758:19;;36990:85:0;13378:405:1;36990:85:0;-1:-1:-1;;;;;37094:16:0;;37086:65;;;;-1:-1:-1;;;37086:65:0;;8990:2:1;37086:65:0;;;8972:21:1;9029:2;9009:18;;;9002:30;9068:34;9048:18;;;9041:62;-1:-1:-1;;;9119:18:1;;;9112:34;9163:19;;37086:65:0;8788:400:1;37086:65:0;37164:39;37185:4;37191:2;37195:7;37164:20;:39::i;:::-;37268:29;37285:1;37289:7;37268:8;:29::i;:::-;-1:-1:-1;;;;;37310:15:0;;;;;;:9;:15;;;;;:20;;37329:1;;37310:15;:20;;37329:1;;37310:20;:::i;:::-;;;;-1:-1:-1;;;;;;;37341:13:0;;;;;;:9;:13;;;;;:18;;37358:1;;37341:13;:18;;37358:1;;37341:18;:::i;:::-;;;;-1:-1:-1;;37370:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;37370:21:0;-1:-1:-1;;;;;37370:21:0;;;;;;;;;37409:27;;37370:16;;37409:27;;;;;;;36866:578;;;:::o;12571:191::-;12664:6;;;-1:-1:-1;;;;;12681:17:0;;;-1:-1:-1;;;;;;12681:17:0;;;;;;;12714:40;;12664:6;;;12681:17;12664:6;;12714:40;;12645:16;;12714:40;12634:128;12571:191;:::o;32952:315::-;33109:28;33119:4;33125:2;33129:7;33109:9;:28::i;:::-;33156:48;33179:4;33185:2;33189:7;33198:5;33156:22;:48::i;:::-;33148:111;;;;-1:-1:-1;;;33148:111:0;;;;;;;:::i;59934:113::-;59994:13;60027:12;60020:19;;;;;:::i;24696:723::-;24752:13;24973:10;24969:53;;-1:-1:-1;;25000:10:0;;;;;;;;;;;;-1:-1:-1;;;25000:10:0;;;;;24696:723::o;24969:53::-;25047:5;25032:12;25088:78;25095:9;;25088:78;;25121:8;;;;:::i;:::-;;-1:-1:-1;25144:10:0;;-1:-1:-1;25152:2:0;25144:10;;:::i;:::-;;;25088:78;;;25176:19;25208:6;25198:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25198:17:0;;25176:39;;25226:154;25233:10;;25226:154;;25260:11;25270:1;25260:11;;:::i;:::-;;-1:-1:-1;25329:10:0;25337:2;25329:5;:10;:::i;:::-;25316:24;;:2;:24;:::i;:::-;25303:39;;25286:6;25293;25286:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;25286:56:0;;;;;;;;-1:-1:-1;25357:11:0;25366:2;25357:11;;:::i;:::-;;;25226:154;;40619:224;40721:4;-1:-1:-1;;;;;;40745:50:0;;-1:-1:-1;;;40745:50:0;;:90;;;40799:36;40823:11;40799:23;:36::i;34564:110::-;34640:26;34650:2;34654:7;34640:26;;;;;;;;;;;;:9;:26::i;42295:589::-;-1:-1:-1;;;;;42501:18:0;;42497:187;;42536:40;42568:7;43711:10;:17;;43684:24;;;;:15;:24;;;;;:44;;;43739:24;;;;;;;;;;;;43607:164;42536:40;42497:187;;;42606:2;-1:-1:-1;;;;;42598:10:0;:4;-1:-1:-1;;;;;42598:10:0;;42594:90;;42625:47;42658:4;42664:7;42625:32;:47::i;:::-;-1:-1:-1;;;;;42698:16:0;;42694:183;;42731:45;42768:7;42731:36;:45::i;42694:183::-;42804:4;-1:-1:-1;;;;;42798:10:0;:2;-1:-1:-1;;;;;42798:10:0;;42794:83;;42825:40;42853:2;42857:7;42825:27;:40::i;38301:799::-;38456:4;-1:-1:-1;;;;;38477:13:0;;17680:20;17728:8;38473:620;;38513:72;;-1:-1:-1;;;38513:72:0;;-1:-1:-1;;;;;38513:36:0;;;;;:72;;10065:10;;38564:4;;38570:7;;38579:5;;38513:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38513:72:0;;;;;;;;-1:-1:-1;;38513:72:0;;;;;;;;;;;;:::i;:::-;;;38509:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38755:13:0;;38751:272;;38798:60;;-1:-1:-1;;;38798:60:0;;;;;;;:::i;38751:272::-;38973:6;38967:13;38958:6;38954:2;38950:15;38943:38;38509:529;-1:-1:-1;;;;;;38636:51:0;-1:-1:-1;;;38636:51:0;;-1:-1:-1;38629:58:0;;38473:620;-1:-1:-1;39077:4:0;38301:799;;;;;;:::o;27682:305::-;27784:4;-1:-1:-1;;;;;;27821:40:0;;-1:-1:-1;;;27821:40:0;;:105;;-1:-1:-1;;;;;;;27878:48:0;;-1:-1:-1;;;27878:48:0;27821:105;:158;;;-1:-1:-1;;;;;;;;;;9390:40:0;;;27943:36;9281:157;34901:321;35031:18;35037:2;35041:7;35031:5;:18::i;:::-;35082:54;35113:1;35117:2;35121:7;35130:5;35082:22;:54::i;:::-;35060:154;;;;-1:-1:-1;;;35060:154:0;;;;;;;:::i;44398:988::-;44664:22;44714:1;44689:22;44706:4;44689:16;:22::i;:::-;:26;;;;:::i;:::-;44726:18;44747:26;;;:17;:26;;;;;;44664:51;;-1:-1:-1;44880:28:0;;;44876:328;;-1:-1:-1;;;;;44947:18:0;;44925:19;44947:18;;;:12;:18;;;;;;;;:34;;;;;;;;;44998:30;;;;;;:44;;;45115:30;;:17;:30;;;;;:43;;;44876:328;-1:-1:-1;45300:26:0;;;;:17;:26;;;;;;;;45293:33;;;-1:-1:-1;;;;;45344:18:0;;;;;:12;:18;;;;;:34;;;;;;;45337:41;44398:988::o;45681:1079::-;45959:10;:17;45934:22;;45959:21;;45979:1;;45959:21;:::i;:::-;45991:18;46012:24;;;:15;:24;;;;;;46385:10;:26;;45934:46;;-1:-1:-1;46012:24:0;;45934:46;;46385:26;;;;;;:::i;:::-;;;;;;;;;46363:48;;46449:11;46424:10;46435;46424:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;46529:28;;;:15;:28;;;;;;;:41;;;46701:24;;;;;46694:31;46736:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;45752:1008;;;45681:1079;:::o;43185:221::-;43270:14;43287:20;43304:2;43287:16;:20::i;:::-;-1:-1:-1;;;;;43318:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;43363:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;43185:221:0:o;35558:382::-;-1:-1:-1;;;;;35638:16:0;;35630:61;;;;-1:-1:-1;;;35630:61:0;;12087:2:1;35630:61:0;;;12069:21:1;;;12106:18;;;12099:30;12165:34;12145:18;;;12138:62;12217:18;;35630:61:0;11885:356:1;35630:61:0;33645:4;33669:16;;;:7;:16;;;;;;-1:-1:-1;;;;;33669:16:0;:30;35702:58;;;;-1:-1:-1;;;35702:58:0;;8224:2:1;35702:58:0;;;8206:21:1;8263:2;8243:18;;;8236:30;8302;8282:18;;;8275:58;8350:18;;35702:58:0;8022:352:1;35702:58:0;35773:45;35802:1;35806:2;35810:7;35773:20;:45::i;:::-;-1:-1:-1;;;;;35831:13:0;;;;;;:9;:13;;;;;:18;;35848:1;;35831:13;:18;;35848:1;;35831:18;:::i;:::-;;;;-1:-1:-1;;35860:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;35860:21:0;-1:-1:-1;;;;;35860:21:0;;;;;;;;35899:33;;35860:16;;;35899:33;;35860:16;;35899:33;35558:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:40;;;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:72;;;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:45;;;532:1;529;522:12;491:45;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;;;;14:631;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:70;;813:1;810;803:12;747:70;650:173;;;:::o;828:186::-;887:6;940:2;928:9;919:7;915:23;911:32;908:52;;;956:1;953;946:12;908:52;979:29;998:9;979:29;:::i;:::-;969:39;828:186;-1:-1:-1;;;828:186:1:o;1019:260::-;1087:6;1095;1148:2;1136:9;1127:7;1123:23;1119:32;1116:52;;;1164:1;1161;1154:12;1116:52;1187:29;1206:9;1187:29;:::i;:::-;1177:39;;1235:38;1269:2;1258:9;1254:18;1235:38;:::i;:::-;1225:48;;1019:260;;;;;:::o;1284:328::-;1361:6;1369;1377;1430:2;1418:9;1409:7;1405:23;1401:32;1398:52;;;1446:1;1443;1436:12;1398:52;1469:29;1488:9;1469:29;:::i;:::-;1459:39;;1517:38;1551:2;1540:9;1536:18;1517:38;:::i;:::-;1507:48;;1602:2;1591:9;1587:18;1574:32;1564:42;;1284:328;;;;;:::o;1617:666::-;1712:6;1720;1728;1736;1789:3;1777:9;1768:7;1764:23;1760:33;1757:53;;;1806:1;1803;1796:12;1757:53;1829:29;1848:9;1829:29;:::i;:::-;1819:39;;1877:38;1911:2;1900:9;1896:18;1877:38;:::i;:::-;1867:48;;1962:2;1951:9;1947:18;1934:32;1924:42;;2017:2;2006:9;2002:18;1989:32;2044:18;2036:6;2033:30;2030:50;;;2076:1;2073;2066:12;2030:50;2099:22;;2152:4;2144:13;;2140:27;-1:-1:-1;2130:55:1;;2181:1;2178;2171:12;2130:55;2204:73;2269:7;2264:2;2251:16;2246:2;2242;2238:11;2204:73;:::i;:::-;2194:83;;;1617:666;;;;;;;:::o;2288:347::-;2353:6;2361;2414:2;2402:9;2393:7;2389:23;2385:32;2382:52;;;2430:1;2427;2420:12;2382:52;2453:29;2472:9;2453:29;:::i;:::-;2443:39;;2532:2;2521:9;2517:18;2504:32;2579:5;2572:13;2565:21;2558:5;2555:32;2545:60;;2601:1;2598;2591:12;2545:60;2624:5;2614:15;;;2288:347;;;;;:::o;2640:254::-;2708:6;2716;2769:2;2757:9;2748:7;2744:23;2740:32;2737:52;;;2785:1;2782;2775:12;2737:52;2808:29;2827:9;2808:29;:::i;:::-;2798:39;2884:2;2869:18;;;;2856:32;;-1:-1:-1;;;2640:254:1:o;2899:245::-;2957:6;3010:2;2998:9;2989:7;2985:23;2981:32;2978:52;;;3026:1;3023;3016:12;2978:52;3065:9;3052:23;3084:30;3108:5;3084:30;:::i;3149:249::-;3218:6;3271:2;3259:9;3250:7;3246:23;3242:32;3239:52;;;3287:1;3284;3277:12;3239:52;3319:9;3313:16;3338:30;3362:5;3338:30;:::i;3403:450::-;3472:6;3525:2;3513:9;3504:7;3500:23;3496:32;3493:52;;;3541:1;3538;3531:12;3493:52;3581:9;3568:23;3614:18;3606:6;3603:30;3600:50;;;3646:1;3643;3636:12;3600:50;3669:22;;3722:4;3714:13;;3710:27;-1:-1:-1;3700:55:1;;3751:1;3748;3741:12;3700:55;3774:73;3839:7;3834:2;3821:16;3816:2;3812;3808:11;3774:73;:::i;3858:180::-;3917:6;3970:2;3958:9;3949:7;3945:23;3941:32;3938:52;;;3986:1;3983;3976:12;3938:52;-1:-1:-1;4009:23:1;;3858:180;-1:-1:-1;3858:180:1:o;4043:248::-;4111:6;4119;4172:2;4160:9;4151:7;4147:23;4143:32;4140:52;;;4188:1;4185;4178:12;4140:52;-1:-1:-1;;4211:23:1;;;4281:2;4266:18;;;4253:32;;-1:-1:-1;4043:248:1:o;4296:257::-;4337:3;4375:5;4369:12;4402:6;4397:3;4390:19;4418:63;4474:6;4467:4;4462:3;4458:14;4451:4;4444:5;4440:16;4418:63;:::i;:::-;4535:2;4514:15;-1:-1:-1;;4510:29:1;4501:39;;;;4542:4;4497:50;;4296:257;-1:-1:-1;;4296:257:1:o;4558:470::-;4737:3;4775:6;4769:13;4791:53;4837:6;4832:3;4825:4;4817:6;4813:17;4791:53;:::i;:::-;4907:13;;4866:16;;;;4929:57;4907:13;4866:16;4963:4;4951:17;;4929:57;:::i;:::-;5002:20;;4558:470;-1:-1:-1;;;;4558:470:1:o;5241:488::-;-1:-1:-1;;;;;5510:15:1;;;5492:34;;5562:15;;5557:2;5542:18;;5535:43;5609:2;5594:18;;5587:34;;;5657:3;5652:2;5637:18;;5630:31;;;5435:4;;5678:45;;5703:19;;5695:6;5678:45;:::i;:::-;5670:53;5241:488;-1:-1:-1;;;;;;5241:488:1:o;6205:219::-;6354:2;6343:9;6336:21;6317:4;6374:44;6414:2;6403:9;6399:18;6391:6;6374:44;:::i;6841:414::-;7043:2;7025:21;;;7082:2;7062:18;;;7055:30;7121:34;7116:2;7101:18;;7094:62;-1:-1:-1;;;7187:2:1;7172:18;;7165:48;7245:3;7230:19;;6841:414::o;13017:356::-;13219:2;13201:21;;;13238:18;;;13231:30;13297:34;13292:2;13277:18;;13270:62;13364:2;13349:18;;13017:356::o;15305:413::-;15507:2;15489:21;;;15546:2;15526:18;;;15519:30;15585:34;15580:2;15565:18;;15558:62;-1:-1:-1;;;15651:2:1;15636:18;;15629:47;15708:3;15693:19;;15305:413::o;17191:355::-;17393:2;17375:21;;;17432:2;17412:18;;;17405:30;17471:33;17466:2;17451:18;;17444:61;17537:2;17522:18;;17191:355::o;17733:128::-;17773:3;17804:1;17800:6;17797:1;17794:13;17791:39;;;17810:18;;:::i;:::-;-1:-1:-1;17846:9:1;;17733:128::o;17866:120::-;17906:1;17932;17922:35;;17937:18;;:::i;:::-;-1:-1:-1;17971:9:1;;17866:120::o;17991:168::-;18031:7;18097:1;18093;18089:6;18085:14;18082:1;18079:21;18074:1;18067:9;18060:17;18056:45;18053:71;;;18104:18;;:::i;:::-;-1:-1:-1;18144:9:1;;17991:168::o;18164:125::-;18204:4;18232:1;18229;18226:8;18223:34;;;18237:18;;:::i;:::-;-1:-1:-1;18274:9:1;;18164:125::o;18294:258::-;18366:1;18376:113;18390:6;18387:1;18384:13;18376:113;;;18466:11;;;18460:18;18447:11;;;18440:39;18412:2;18405:10;18376:113;;;18507:6;18504:1;18501:13;18498:48;;;-1:-1:-1;;18542:1:1;18524:16;;18517:27;18294:258::o;18557:380::-;18636:1;18632:12;;;;18679;;;18700:61;;18754:4;18746:6;18742:17;18732:27;;18700:61;18807:2;18799:6;18796:14;18776:18;18773:38;18770:161;;;18853:10;18848:3;18844:20;18841:1;18834:31;18888:4;18885:1;18878:15;18916:4;18913:1;18906:15;18770:161;;18557:380;;;:::o;18942:135::-;18981:3;-1:-1:-1;;19002:17:1;;18999:43;;;19022:18;;:::i;:::-;-1:-1:-1;19069:1:1;19058:13;;18942:135::o;19082:112::-;19114:1;19140;19130:35;;19145:18;;:::i;:::-;-1:-1:-1;19179:9:1;;19082:112::o;19199:127::-;19260:10;19255:3;19251:20;19248:1;19241:31;19291:4;19288:1;19281:15;19315:4;19312:1;19305:15;19331:127;19392:10;19387:3;19383:20;19380:1;19373:31;19423:4;19420:1;19413:15;19447:4;19444:1;19437:15;19463:127;19524:10;19519:3;19515:20;19512:1;19505:31;19555:4;19552:1;19545:15;19579:4;19576:1;19569:15;19595:127;19656:10;19651:3;19647:20;19644:1;19637:31;19687:4;19684:1;19677:15;19711:4;19708:1;19701:15;19727:127;19788:10;19783:3;19779:20;19776:1;19769:31;19819:4;19816:1;19809:15;19843:4;19840:1;19833:15;19859:131;-1:-1:-1;;;;;;19933:32:1;;19923:43;;19913:71;;19980:1;19977;19970:12

Swarm Source

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