ETH Price: $3,306.12 (-0.05%)
Gas: 15 Gwei

Token

Degen Donkeys (DONKS)
 

Overview

Max Total Supply

154 DONKS

Holders

68

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
ginger.kongz.eth
Balance
1 DONKS
0xb4cb9505397a55870234b11b622f0fe7cba064ce
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:
DegenDonkeys

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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

// OpenZeppelin Contracts v4.4.0 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

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

// OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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

// OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

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

// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


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

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

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

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

// OpenZeppelin Contracts v4.4.0 (utils/Address.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// OpenZeppelin Contracts v4.4.0 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

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

// OpenZeppelin Contracts v4.4.0 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

// OpenZeppelin Contracts v4.4.0 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


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

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

// OpenZeppelin Contracts v4.4.0 (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_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 Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

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

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

// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/ERC721URIStorage.sol)

pragma solidity ^0.8.0;


/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

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

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @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 override {
        super._burn(tokenId);

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}

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

// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


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

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

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

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

// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// OpenZeppelin Contracts v4.4.0 (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

// File: contracts/DegenDonkeys.sol

pragma solidity ^0.8.10;







contract DegenDonkeys is ERC721Enumerable, Ownable {
  using Strings for uint256;
  using Address for address;

  struct Conf {
        uint16 supply;
        uint16 _reserved;
        uint64 price;
    }
   
    address private controller;
    address public fundsWallet;
    bool public mintEnabled = false;
    bool public whitelistMintEnabled = false;
    uint public perWhitelistAccount = 5;
    uint8 public perMint = 50;
    uint16 public phase = 420;
    uint16 public maxDonks = 6969;
    uint256 public imagesHash;
    string private defaultURI;
    string private baseURI;
    string private metaURI;
    mapping (address => bool) public whitelist;
    

    mapping(uint256 => uint256) private metaHashes;

    Conf private conf;

    event updateMetaHash(address, uint256, uint256);

    modifier isController(address sender) {
        require(
            sender != address(0) && (sender == owner() || sender == controller)
        );
        _;
    }

    /**
     * @notice Setup ERC721 and initial config
     */
    constructor(
        string memory name,
        string memory symbol,
        string memory _defaultURI,
        address _fundsWallet
    ) ERC721(name, symbol) {
        require(_fundsWallet != address(0), "Zero address error");
        fundsWallet = _fundsWallet;
        conf = Conf(0, 100, 42000000000000000);
        defaultURI = _defaultURI;
    }

    /**
     * @notice Send ETH to owners wallet 
     */
    function ownerWithdraw() public onlyOwner {
        uint256 balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }

    /**
     * @notice send contract eth to fundswallet 
     */
    function fundsWithdraw() public onlyOwner {
        uint256 balance = address(this).balance;
        payable(fundsWallet).transfer(balance);
    }

    /**
     * @notice Send reserved donks 
     * @param _to address to send reserved nfts to.
     * @param _amount number of nfts to send 
     */
    function fetchReserved(address _to, uint16 _amount)
        public
        onlyOwner
    {
        require( _to !=  address(0), "Zero address error");
        require( _amount <= conf._reserved, "Exceeds reserved donks supply");
        require(
          conf.supply + _amount <= phase,
          "Amount exceeds maximum supply of Donks in this phase."
        );

        uint16 supply = conf.supply;
        unchecked {
          for (uint8 i = 0; i < _amount; i++) {
              _safeMint(_to, supply++);
          }
        }
        conf.supply = supply;
        conf._reserved -= _amount;
    }

    /**
     * @notice Bring new Donks into the world.
     * @param amount Number of Donks to mint.
     * @dev Utilize unchecked {} and calldata for gas savings.
     */
    function mint(uint256 amount) public payable {
        require(mintEnabled, "Minting is disabled.");
        require(
            conf.supply + amount <= maxDonks - conf._reserved,
            "Amount exceeds maximum supply of Donks."
        );
        require(
          conf.supply + amount <= phase,
          "Amount exceeds maximum supply of Donks in this phase."
        );
        require(
            amount <= perMint,
            "Amount exceeds current maximum Donks per mint."
        );
        require(
            conf.price * amount <= msg.value,
            "Ether value sent is not correct."
        );

        uint16 supply = conf.supply;
        unchecked {
            for (uint16 i = 0; i < amount; i++) {
                _safeMint(msg.sender, supply++);
            }
        }
        conf.supply = supply;
    }

    // Whitelist functions

    /**
     * @notice add addresses to whitelist in bulk.
     * @param addresses Arrary of whitelisted addresses
     * @dev Only authorized accounts.
     */
    function bulkWhitelist(address[] memory addresses) public onlyOwner {
        for(uint i=0; i < addresses.length; i++){
            address addr = addresses[i];
            if(whitelist[addr] != true && addr != address(0)){
                whitelist[addr] = true;
            }
        }
    }

    /**
     * @notice Whitelist minting function. 
     * @param amount Number of Donks to mint.
     * @dev Utilize unchecked {} and calldata for gas savings.
     */
    function whitelistMint(uint256 amount) public payable {
        require(whitelistMintEnabled, "Whitelist Minting is disabled.");
        require( whitelist[msg.sender] == true, "Only whitelist can mint" );
        require(
          conf.supply + amount <= phase,
          "Amount exceeds maximum supply of Donks in this phase."
        );
        require(
            conf.supply + amount <= maxDonks - conf._reserved,
            "Amount exceeds maximum supply of Donks."
        );
        require(
            balanceOf(msg.sender) + amount <= perWhitelistAccount,
            "Amount exceeds current maximum mints per account."
        );
        require(
            amount <= perMint,
            "Amount exceeds current maximum Donks per mint."
        );
        require(
            conf.price * amount <= msg.value,
            "Ether value sent is not correct."
        );

        uint16 supply = conf.supply;
        unchecked {
            for (uint16 i = 0; i < amount; i++) {
                _safeMint(msg.sender, supply++);
            }
        }
        conf.supply = supply;
    }

    /**
     * @notice Toggle white list mint status.
     * @dev Only authorized accounts.
     */
    function toggleWhitelistMintEnabled() public onlyOwner {
        whitelistMintEnabled = !whitelistMintEnabled;
    }
    
    /**
     * @notice Set per whitelist account 
     * @param _perWhitelist new minting phase 
     * @dev Only authorized accounts.
     */
    function setPerWhitelistAccount(uint16 _perWhitelist) public onlyOwner {
        perWhitelistAccount = _perWhitelist;
    }

    /**
     * @notice Set phase.
     * @param _phase new minting phase 
     * @dev Only authorized accounts.
     */
    function setPhase(uint16 _phase) public onlyOwner {
        phase = _phase;
    }


    /**
     * @notice Set reserved.
     * @param reserved new reserved amount. 
     * @dev Only authorized accounts.
     */
    function setReserved(uint16 reserved) public onlyOwner {
        conf._reserved = reserved;
    }

    /**
     * @notice Set price.
     * @param newPrice new minting price
     * @dev Only authorized accounts.
     */
    function setPrice(uint64 newPrice) public onlyOwner {
        conf.price = newPrice;
    }

    /**
     * @notice Set funds wallet.
     * @param _fundsWallet new funds wallet address 
     * @dev Only authorized accounts.
     */
    function setFundsWallet(address _fundsWallet) public onlyOwner {
        require(_fundsWallet != address(0), "Zero address error");
        fundsWallet = _fundsWallet;
    }

    /**
     * @notice Set meta hash for token.
     * @param id Token id.
     * @param _hash Hash value.
     * @dev Only authorized accounts.
     */
    function setMetaHash(uint256 id, uint256 _hash)
        public
        isController(msg.sender)
    {
        require(_exists(id), "Token does not exist.");
        metaHashes[id] = _hash;
        emit updateMetaHash(msg.sender, id, _hash);
    }

    /**
     * @notice Return mint price.
     */
    function getMintPrice() public view returns (uint64) {
        return conf.price;
    }

    /**
     * @notice Return meta hash for token.
     */
    function getMetaHash(uint256 id) public view returns (uint256) {
        return metaHashes[id];
    }

    /**
     * @notice Sets URI for image hashes.
     */
    function setImagesHash(uint256 _imagesHash) public onlyOwner {
        imagesHash = _imagesHash;
    }

    /**
     * @notice Toggles minting state.
     */
    function toggleMintEnabled() public onlyOwner {
        mintEnabled = !mintEnabled;
    }

    /**
     * @notice Sets max Donks per mint.
     */
    function setPerMint(uint8 _perMint) public onlyOwner {
        perMint = _perMint;
    }

    /**
     * @notice Set base URI.
     */
    function setBaseURI(string memory _baseURI) public onlyOwner {
        baseURI = _baseURI;
    }

    /**
     * @notice Set default URI.
     */
    function setDefaultURI(string memory _defaultURI) public onlyOwner {
        defaultURI = _defaultURI;
    }

    function tokenURI(uint256 tokenId)
        public
        view
        override
        returns (string memory)
    {
        require(_exists(tokenId), "Token does not exist.");

        if (bytes(baseURI).length == 0) {
            return defaultURI;
        } else {
            return string(abi.encodePacked(baseURI, (tokenId + 1).toString()));
        }
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"_defaultURI","type":"string"},{"internalType":"address","name":"_fundsWallet","type":"address"}],"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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"","type":"address"},{"indexed":false,"internalType":"uint256","name":"","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"updateMetaHash","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"bulkWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint16","name":"_amount","type":"uint16"}],"name":"fetchReserved","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fundsWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fundsWithdraw","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":"uint256","name":"id","type":"uint256"}],"name":"getMetaHash","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintPrice","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"imagesHash","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxDonks","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintEnabled","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":"ownerWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"perMint","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"perWhitelistAccount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"phase","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"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":"_defaultURI","type":"string"}],"name":"setDefaultURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_fundsWallet","type":"address"}],"name":"setFundsWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_imagesHash","type":"uint256"}],"name":"setImagesHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"_hash","type":"uint256"}],"name":"setMetaHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_perMint","type":"uint8"}],"name":"setPerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_perWhitelist","type":"uint16"}],"name":"setPerWhitelistAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_phase","type":"uint16"}],"name":"setPhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"newPrice","type":"uint64"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"reserved","type":"uint16"}],"name":"setReserved","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":"toggleMintEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleWhitelistMintEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"whitelistMintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

6080604052600c805461ffff60a01b191690556005600d55600e805464ffffffffff1916641b3901a4321790553480156200003957600080fd5b5060405162003457380380620034578339810160408190526200005c916200033e565b83518490849062000075906000906020850190620001cb565b5080516200008b906001906020840190620001cb565b505050620000a8620000a26200017560201b60201c565b62000179565b6001600160a01b038116620000f85760405162461bcd60e51b81526020600482015260126024820152712d32b9379030b2323932b9b99032b93937b960711b604482015260640160405180910390fd5b600c80546001600160a01b0319166001600160a01b03831617905560408051606081018252600081526064602080830191909152669536c7089100009190920152601580546001600160601b0319166a9536c7089100000064000017905582516200016a9160109190850190620001cb565b50505050506200042e565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001d990620003f1565b90600052602060002090601f016020900481019282620001fd576000855562000248565b82601f106200021857805160ff191683800117855562000248565b8280016001018555821562000248579182015b82811115620002485782518255916020019190600101906200022b565b50620002569291506200025a565b5090565b5b808211156200025657600081556001016200025b565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200029957600080fd5b81516001600160401b0380821115620002b657620002b662000271565b604051601f8301601f19908116603f01168101908282118183101715620002e157620002e162000271565b81604052838152602092508683858801011115620002fe57600080fd5b600091505b8382101562000322578582018301518183018401529082019062000303565b83821115620003345760008385830101525b9695505050505050565b600080600080608085870312156200035557600080fd5b84516001600160401b03808211156200036d57600080fd5b6200037b8883890162000287565b955060208701519150808211156200039257600080fd5b620003a08883890162000287565b94506040870151915080821115620003b757600080fd5b50620003c68782880162000287565b606087015190935090506001600160a01b0381168114620003e657600080fd5b939692955090935050565b600181811c908216806200040657607f821691505b602082108114156200042857634e487b7160e01b600052602260045260246000fd5b50919050565b613019806200043e6000396000f3fe6080604052600436106102935760003560e01c806370a082311161015a578063b88d4fde116100c1578063da1b9e081161007a578063da1b9e08146107fb578063e985e9c51461081b578063f2fde38b14610864578063f73b554114610884578063f7c086ef146108a4578063fb425176146108c457600080fd5b8063b88d4fde14610737578063c87b56dd14610757578063cb6f238d14610777578063ce75345b14610797578063d1239730146107ad578063d34b51c5146107ce57600080fd5b80639b19251a116101135780639b19251a14610664578063a0712d6814610694578063a22cb465146106a7578063a7f93ebd146106c7578063a80a1fd114610702578063b1c9fe6e1461071757600080fd5b806370a08231146105c9578063715018a6146105e9578063868ff4a2146105fe5780638da5cb5b1461061157806391d7c2831461062f57806395d89b411461064f57600080fd5b80632f745c59116101fe57806352390773116101b7578063523907731461051357806355f804b31461053357806361f5baeb146105535780636352211e1461056857806364e39b87146105885780636caede3d146105a857600080fd5b80632f745c591461046957806332b9537214610489578063388a50451461049e57806342842e0e146104be5780634311de8f146104de5780634f6ccce7146104f357600080fd5b806311ef5ab21161025057806311ef5ab21461039557806318160ddd146103ca5780631866ea8d146103e95780632194f3a214610409578063229c20481461042957806323b872dd1461044957600080fd5b806301ffc9a71461029857806306fdde03146102cd57806307db498b146102ef578063081812fc14610311578063095ea7b3146103495780630ed62b0214610369575b600080fd5b3480156102a457600080fd5b506102b86102b3366004612711565b6108da565b60405190151581526020015b60405180910390f35b3480156102d957600080fd5b506102e2610905565b6040516102c4919061278d565b3480156102fb57600080fd5b5061030f61030a3660046127a0565b610997565b005b34801561031d57600080fd5b5061033161032c3660046127a0565b6109cf565b6040516001600160a01b0390911681526020016102c4565b34801561035557600080fd5b5061030f6103643660046127d0565b610a64565b34801561037557600080fd5b50600e546103839060ff1681565b60405160ff90911681526020016102c4565b3480156103a157600080fd5b50600e546103b7906301000000900461ffff1681565b60405161ffff90911681526020016102c4565b3480156103d657600080fd5b506008545b6040519081526020016102c4565b3480156103f557600080fd5b5061030f61040436600461280c565b610b7a565b34801561041557600080fd5b50600c54610331906001600160a01b031681565b34801561043557600080fd5b5061030f610444366004612827565b610bad565b34801561045557600080fd5b5061030f610464366004612851565b610c07565b34801561047557600080fd5b506103db6104843660046127d0565b610c38565b34801561049557600080fd5b5061030f610cce565b3480156104aa57600080fd5b5061030f6104b936600461288d565b610d19565b3480156104ca57600080fd5b5061030f6104d9366004612851565b610eb1565b3480156104ea57600080fd5b5061030f610ecc565b3480156104ff57600080fd5b506103db61050e3660046127a0565b610f29565b34801561051f57600080fd5b5061030f61052e36600461280c565b610fbc565b34801561053f57600080fd5b5061030f61054e36600461295f565b611006565b34801561055f57600080fd5b5061030f611043565b34801561057457600080fd5b506103316105833660046127a0565b61108e565b34801561059457600080fd5b5061030f6105a33660046129a8565b611105565b3480156105b457600080fd5b50600c546102b890600160a81b900460ff1681565b3480156105d557600080fd5b506103db6105e43660046129a8565b61119c565b3480156105f557600080fd5b5061030f611223565b61030f61060c3660046127a0565b611259565b34801561061d57600080fd5b50600a546001600160a01b0316610331565b34801561063b57600080fd5b5061030f61064a3660046129c3565b61150a565b34801561065b57600080fd5b506102e26115fb565b34801561067057600080fd5b506102b861067f3660046129a8565b60136020526000908152604090205460ff1681565b61030f6106a23660046127a0565b61160a565b3480156106b357600080fd5b5061030f6106c23660046129e5565b6117b5565b3480156106d357600080fd5b50601554640100000000900467ffffffffffffffff1660405167ffffffffffffffff90911681526020016102c4565b34801561070e57600080fd5b5061030f6117c0565b34801561072357600080fd5b50600e546103b790610100900461ffff1681565b34801561074357600080fd5b5061030f610752366004612a21565b611824565b34801561076357600080fd5b506102e26107723660046127a0565b61185c565b34801561078357600080fd5b5061030f610792366004612a9d565b6119a3565b3480156107a357600080fd5b506103db600d5481565b3480156107b957600080fd5b50600c546102b890600160a01b900460ff1681565b3480156107da57600080fd5b506103db6107e93660046127a0565b60009081526014602052604090205490565b34801561080757600080fd5b5061030f61081636600461295f565b6119e3565b34801561082757600080fd5b506102b8610836366004612ac0565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561087057600080fd5b5061030f61087f3660046129a8565b611a20565b34801561089057600080fd5b5061030f61089f366004612aea565b611abb565b3480156108b057600080fd5b5061030f6108bf36600461280c565b611b87565b3480156108d057600080fd5b506103db600f5481565b60006001600160e01b0319821663780e9d6360e01b14806108ff57506108ff82611bcf565b92915050565b60606000805461091490612b97565b80601f016020809104026020016040519081016040528092919081815260200182805461094090612b97565b801561098d5780601f106109625761010080835404028352916020019161098d565b820191906000526020600020905b81548152906001019060200180831161097057829003601f168201915b5050505050905090565b600a546001600160a01b031633146109ca5760405162461bcd60e51b81526004016109c190612bd2565b60405180910390fd5b600f55565b6000818152600260205260408120546001600160a01b0316610a485760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016109c1565b506000908152600460205260409020546001600160a01b031690565b6000610a6f8261108e565b9050806001600160a01b0316836001600160a01b03161415610add5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016109c1565b336001600160a01b0382161480610af95750610af98133610836565b610b6b5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016109c1565b610b758383611c1f565b505050565b600a546001600160a01b03163314610ba45760405162461bcd60e51b81526004016109c190612bd2565b61ffff16600d55565b600a546001600160a01b03163314610bd75760405162461bcd60e51b81526004016109c190612bd2565b6015805467ffffffffffffffff909216640100000000026bffffffffffffffff0000000019909216919091179055565b610c113382611c8d565b610c2d5760405162461bcd60e51b81526004016109c190612c07565b610b75838383611d84565b6000610c438361119c565b8210610ca55760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016109c1565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610cf85760405162461bcd60e51b81526004016109c190612bd2565b600c805460ff60a81b198116600160a81b9182900460ff1615909102179055565b600a546001600160a01b03163314610d435760405162461bcd60e51b81526004016109c190612bd2565b6001600160a01b038216610d8e5760405162461bcd60e51b81526020600482015260126024820152712d32b9379030b2323932b9b99032b93937b960711b60448201526064016109c1565b60155461ffff6201000090910481169082161115610dee5760405162461bcd60e51b815260206004820152601d60248201527f4578636565647320726573657276656420646f6e6b7320737570706c7900000060448201526064016109c1565b600e5460155461ffff610100909204821691610e0c91849116612c6e565b61ffff161115610e2e5760405162461bcd60e51b81526004016109c190612c94565b60155461ffff1660005b8261ffff168160ff161015610e6357610e5b848380600101945061ffff16611f2f565b600101610e38565b506015805461ffff191661ffff83811691909117808355849291600291610e9291859162010000900416612ce9565b92506101000a81548161ffff021916908361ffff160217905550505050565b610b7583838360405180602001604052806000815250611824565b600a546001600160a01b03163314610ef65760405162461bcd60e51b81526004016109c190612bd2565b6040514790339082156108fc029083906000818181858888f19350505050158015610f25573d6000803e3d6000fd5b5050565b6000610f3460085490565b8210610f975760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016109c1565b60088281548110610faa57610faa612d0c565b90600052602060002001549050919050565b600a546001600160a01b03163314610fe65760405162461bcd60e51b81526004016109c190612bd2565b6015805461ffff909216620100000263ffff000019909216919091179055565b600a546001600160a01b031633146110305760405162461bcd60e51b81526004016109c190612bd2565b8051610f25906011906020840190612662565b600a546001600160a01b0316331461106d5760405162461bcd60e51b81526004016109c190612bd2565b600c805460ff60a01b198116600160a01b9182900460ff1615909102179055565b6000818152600260205260408120546001600160a01b0316806108ff5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016109c1565b600a546001600160a01b0316331461112f5760405162461bcd60e51b81526004016109c190612bd2565b6001600160a01b03811661117a5760405162461bcd60e51b81526020600482015260126024820152712d32b9379030b2323932b9b99032b93937b960711b60448201526064016109c1565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160a01b0382166112075760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016109c1565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b0316331461124d5760405162461bcd60e51b81526004016109c190612bd2565b6112576000611f49565b565b600c54600160a81b900460ff166112b25760405162461bcd60e51b815260206004820152601e60248201527f57686974656c697374204d696e74696e672069732064697361626c65642e000060448201526064016109c1565b3360009081526013602052604090205460ff1615156001146113165760405162461bcd60e51b815260206004820152601760248201527f4f6e6c792077686974656c6973742063616e206d696e7400000000000000000060448201526064016109c1565b600e5460155461ffff61010090920482169161133491849116612d22565b11156113525760405162461bcd60e51b81526004016109c190612c94565b601554600e546113769161ffff620100009091048116916301000000900416612ce9565b60155461ffff9182169161138c91849116612d22565b11156113aa5760405162461bcd60e51b81526004016109c190612d3a565b600d54816113b73361119c565b6113c19190612d22565b11156114295760405162461bcd60e51b815260206004820152603160248201527f416d6f756e7420657863656564732063757272656e74206d6178696d756d206d60448201527034b73a39903832b91030b1b1b7bab73a1760791b60648201526084016109c1565b600e5460ff1681111561144e5760405162461bcd60e51b81526004016109c190612d81565b6015543490611470908390640100000000900467ffffffffffffffff16612dcf565b11156114be5760405162461bcd60e51b815260206004820181905260248201527f45746865722076616c75652073656e74206973206e6f7420636f72726563742e60448201526064016109c1565b60155461ffff1660005b828161ffff1610156114f0576114e8338380600101945061ffff16611f2f565b6001016114c8565b506015805461ffff191661ffff9290921691909117905550565b33801580159061153e5750600a546001600160a01b038281169116148061153e5750600b546001600160a01b038281169116145b61154757600080fd5b6000838152600260205260409020546001600160a01b03166115a35760405162461bcd60e51b81526020600482015260156024820152742a37b5b2b7103237b2b9903737ba1032bc34b9ba1760591b60448201526064016109c1565b60008381526014602090815260409182902084905581513381529081018590529081018390527fb10b3625df7286db8dccbbe246db7ca30a7cb38626be90ba222cbf01339eeeba9060600160405180910390a1505050565b60606001805461091490612b97565b600c54600160a01b900460ff1661165a5760405162461bcd60e51b815260206004820152601460248201527326b4b73a34b7339034b9903234b9b0b13632b21760611b60448201526064016109c1565b601554600e5461167e9161ffff620100009091048116916301000000900416612ce9565b60155461ffff9182169161169491849116612d22565b11156116b25760405162461bcd60e51b81526004016109c190612d3a565b600e5460155461ffff6101009092048216916116d091849116612d22565b11156116ee5760405162461bcd60e51b81526004016109c190612c94565b600e5460ff168111156117135760405162461bcd60e51b81526004016109c190612d81565b6015543490611735908390640100000000900467ffffffffffffffff16612dcf565b11156117835760405162461bcd60e51b815260206004820181905260248201527f45746865722076616c75652073656e74206973206e6f7420636f72726563742e60448201526064016109c1565b60155461ffff1660005b828161ffff1610156114f0576117ad338380600101945061ffff16611f2f565b60010161178d565b610f25338383611f9b565b600a546001600160a01b031633146117ea5760405162461bcd60e51b81526004016109c190612bd2565b600c5460405147916001600160a01b03169082156108fc029083906000818181858888f19350505050158015610f25573d6000803e3d6000fd5b61182e3383611c8d565b61184a5760405162461bcd60e51b81526004016109c190612c07565b6118568484848461206a565b50505050565b6000818152600260205260409020546060906001600160a01b03166118bb5760405162461bcd60e51b81526020600482015260156024820152742a37b5b2b7103237b2b9903737ba1032bc34b9ba1760591b60448201526064016109c1565b601180546118c890612b97565b1515905061196257601080546118dd90612b97565b80601f016020809104026020016040519081016040528092919081815260200182805461190990612b97565b80156119565780601f1061192b57610100808354040283529160200191611956565b820191906000526020600020905b81548152906001019060200180831161193957829003601f168201915b50505050509050919050565b6011611977611972846001612d22565b61209d565b604051602001611988929190612e0a565b6040516020818303038152906040529050919050565b919050565b600a546001600160a01b031633146119cd5760405162461bcd60e51b81526004016109c190612bd2565b600e805460ff191660ff92909216919091179055565b600a546001600160a01b03163314611a0d5760405162461bcd60e51b81526004016109c190612bd2565b8051610f25906010906020840190612662565b600a546001600160a01b03163314611a4a5760405162461bcd60e51b81526004016109c190612bd2565b6001600160a01b038116611aaf5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109c1565b611ab881611f49565b50565b600a546001600160a01b03163314611ae55760405162461bcd60e51b81526004016109c190612bd2565b60005b8151811015610f25576000828281518110611b0557611b05612d0c565b6020908102919091018101516001600160a01b0381166000908152601390925260409091205490915060ff161515600114801590611b4b57506001600160a01b03811615155b15611b74576001600160a01b0381166000908152601360205260409020805460ff191660011790555b5080611b7f81612eb1565b915050611ae8565b600a546001600160a01b03163314611bb15760405162461bcd60e51b81526004016109c190612bd2565b600e805461ffff9092166101000262ffff0019909216919091179055565b60006001600160e01b031982166380ac58cd60e01b1480611c0057506001600160e01b03198216635b5e139f60e01b145b806108ff57506301ffc9a760e01b6001600160e01b03198316146108ff565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611c548261108e565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611d065760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016109c1565b6000611d118361108e565b9050806001600160a01b0316846001600160a01b03161480611d4c5750836001600160a01b0316611d41846109cf565b6001600160a01b0316145b80611d7c57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611d978261108e565b6001600160a01b031614611dff5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016109c1565b6001600160a01b038216611e615760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016109c1565b611e6c83838361219b565b611e77600082611c1f565b6001600160a01b0383166000908152600360205260408120805460019290611ea0908490612ecc565b90915550506001600160a01b0382166000908152600360205260408120805460019290611ece908490612d22565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610f25828260405180602001604052806000815250612253565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415611ffd5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016109c1565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612075848484611d84565b61208184848484612286565b6118565760405162461bcd60e51b81526004016109c190612ee3565b6060816120c15750506040805180820190915260018152600360fc1b602082015290565b8160005b81156120eb57806120d581612eb1565b91506120e49050600a83612f4b565b91506120c5565b60008167ffffffffffffffff811115612106576121066128c0565b6040519080825280601f01601f191660200182016040528015612130576020820181803683370190505b5090505b8415611d7c57612145600183612ecc565b9150612152600a86612f5f565b61215d906030612d22565b60f81b81838151811061217257612172612d0c565b60200101906001600160f81b031916908160001a905350612194600a86612f4b565b9450612134565b6001600160a01b0383166121f6576121f181600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612219565b816001600160a01b0316836001600160a01b031614612219576122198382612384565b6001600160a01b03821661223057610b7581612421565b826001600160a01b0316826001600160a01b031614610b7557610b7582826124d0565b61225d8383612514565b61226a6000848484612286565b610b755760405162461bcd60e51b81526004016109c190612ee3565b60006001600160a01b0384163b1561237957604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906122ca903390899088908890600401612f73565b6020604051808303816000875af1925050508015612305575060408051601f3d908101601f1916820190925261230291810190612fb0565b60015b61235f573d808015612333576040519150601f19603f3d011682016040523d82523d6000602084013e612338565b606091505b5080516123575760405162461bcd60e51b81526004016109c190612ee3565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611d7c565b506001949350505050565b600060016123918461119c565b61239b9190612ecc565b6000838152600760205260409020549091508082146123ee576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061243390600190612ecc565b6000838152600960205260408120546008805493945090928490811061245b5761245b612d0c565b90600052602060002001549050806008838154811061247c5761247c612d0c565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806124b4576124b4612fcd565b6001900381819060005260206000200160009055905550505050565b60006124db8361119c565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b03821661256a5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016109c1565b6000818152600260205260409020546001600160a01b0316156125cf5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016109c1565b6125db6000838361219b565b6001600160a01b0382166000908152600360205260408120805460019290612604908490612d22565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461266e90612b97565b90600052602060002090601f01602090048101928261269057600085556126d6565b82601f106126a957805160ff19168380011785556126d6565b828001600101855582156126d6579182015b828111156126d65782518255916020019190600101906126bb565b506126e29291506126e6565b5090565b5b808211156126e257600081556001016126e7565b6001600160e01b031981168114611ab857600080fd5b60006020828403121561272357600080fd5b813561272e816126fb565b9392505050565b60005b83811015612750578181015183820152602001612738565b838111156118565750506000910152565b60008151808452612779816020860160208601612735565b601f01601f19169290920160200192915050565b60208152600061272e6020830184612761565b6000602082840312156127b257600080fd5b5035919050565b80356001600160a01b038116811461199e57600080fd5b600080604083850312156127e357600080fd5b6127ec836127b9565b946020939093013593505050565b803561ffff8116811461199e57600080fd5b60006020828403121561281e57600080fd5b61272e826127fa565b60006020828403121561283957600080fd5b813567ffffffffffffffff8116811461272e57600080fd5b60008060006060848603121561286657600080fd5b61286f846127b9565b925061287d602085016127b9565b9150604084013590509250925092565b600080604083850312156128a057600080fd5b6128a9836127b9565b91506128b7602084016127fa565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156128ff576128ff6128c0565b604052919050565b600067ffffffffffffffff831115612921576129216128c0565b612934601f8401601f19166020016128d6565b905082815283838301111561294857600080fd5b828260208301376000602084830101529392505050565b60006020828403121561297157600080fd5b813567ffffffffffffffff81111561298857600080fd5b8201601f8101841361299957600080fd5b611d7c84823560208401612907565b6000602082840312156129ba57600080fd5b61272e826127b9565b600080604083850312156129d657600080fd5b50508035926020909101359150565b600080604083850312156129f857600080fd5b612a01836127b9565b915060208301358015158114612a1657600080fd5b809150509250929050565b60008060008060808587031215612a3757600080fd5b612a40856127b9565b9350612a4e602086016127b9565b925060408501359150606085013567ffffffffffffffff811115612a7157600080fd5b8501601f81018713612a8257600080fd5b612a9187823560208401612907565b91505092959194509250565b600060208284031215612aaf57600080fd5b813560ff8116811461272e57600080fd5b60008060408385031215612ad357600080fd5b612adc836127b9565b91506128b7602084016127b9565b60006020808385031215612afd57600080fd5b823567ffffffffffffffff80821115612b1557600080fd5b818501915085601f830112612b2957600080fd5b813581811115612b3b57612b3b6128c0565b8060051b9150612b4c8483016128d6565b8181529183018401918481019088841115612b6657600080fd5b938501935b83851015612b8b57612b7c856127b9565b82529385019390850190612b6b565b98975050505050505050565b600181811c90821680612bab57607f821691505b60208210811415612bcc57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600061ffff808316818516808303821115612c8b57612c8b612c58565b01949350505050565b60208082526035908201527f416d6f756e742065786365656473206d6178696d756d20737570706c79206f66604082015274102237b735b99034b7103a3434b990383430b9b29760591b606082015260800190565b600061ffff83811690831681811015612d0457612d04612c58565b039392505050565b634e487b7160e01b600052603260045260246000fd5b60008219821115612d3557612d35612c58565b500190565b60208082526027908201527f416d6f756e742065786365656473206d6178696d756d20737570706c79206f66604082015266102237b735b99760c91b606082015260800190565b6020808252602e908201527f416d6f756e7420657863656564732063757272656e74206d6178696d756d204460408201526d37b735b9903832b91036b4b73a1760911b606082015260800190565b6000816000190483118215151615612de957612de9612c58565b500290565b60008151612e00818560208601612735565b9290920192915050565b600080845481600182811c915080831680612e2657607f831692505b6020808410821415612e4657634e487b7160e01b86526022600452602486fd5b818015612e5a5760018114612e6b57612e98565b60ff19861689528489019650612e98565b60008b81526020902060005b86811015612e905781548b820152908501908301612e77565b505084890196505b505050505050612ea88185612dee565b95945050505050565b6000600019821415612ec557612ec5612c58565b5060010190565b600082821015612ede57612ede612c58565b500390565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b600082612f5a57612f5a612f35565b500490565b600082612f6e57612f6e612f35565b500690565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612fa690830184612761565b9695505050505050565b600060208284031215612fc257600080fd5b815161272e816126fb565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220f6d76bbcfa2fe686011fee0213791627d41923f3a4f4f6b4f896e8a57e233f8764736f6c634300080a0033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000006bdc3b29a47bd686fc991cab14d4ab4f0f504174000000000000000000000000000000000000000000000000000000000000000d446567656e20446f6e6b657973000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005444f4e4b53000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005068747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d61534d4d6f456267673333424e6a6d646a41694734686675657244777267397031416236764554675335563800000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102935760003560e01c806370a082311161015a578063b88d4fde116100c1578063da1b9e081161007a578063da1b9e08146107fb578063e985e9c51461081b578063f2fde38b14610864578063f73b554114610884578063f7c086ef146108a4578063fb425176146108c457600080fd5b8063b88d4fde14610737578063c87b56dd14610757578063cb6f238d14610777578063ce75345b14610797578063d1239730146107ad578063d34b51c5146107ce57600080fd5b80639b19251a116101135780639b19251a14610664578063a0712d6814610694578063a22cb465146106a7578063a7f93ebd146106c7578063a80a1fd114610702578063b1c9fe6e1461071757600080fd5b806370a08231146105c9578063715018a6146105e9578063868ff4a2146105fe5780638da5cb5b1461061157806391d7c2831461062f57806395d89b411461064f57600080fd5b80632f745c59116101fe57806352390773116101b7578063523907731461051357806355f804b31461053357806361f5baeb146105535780636352211e1461056857806364e39b87146105885780636caede3d146105a857600080fd5b80632f745c591461046957806332b9537214610489578063388a50451461049e57806342842e0e146104be5780634311de8f146104de5780634f6ccce7146104f357600080fd5b806311ef5ab21161025057806311ef5ab21461039557806318160ddd146103ca5780631866ea8d146103e95780632194f3a214610409578063229c20481461042957806323b872dd1461044957600080fd5b806301ffc9a71461029857806306fdde03146102cd57806307db498b146102ef578063081812fc14610311578063095ea7b3146103495780630ed62b0214610369575b600080fd5b3480156102a457600080fd5b506102b86102b3366004612711565b6108da565b60405190151581526020015b60405180910390f35b3480156102d957600080fd5b506102e2610905565b6040516102c4919061278d565b3480156102fb57600080fd5b5061030f61030a3660046127a0565b610997565b005b34801561031d57600080fd5b5061033161032c3660046127a0565b6109cf565b6040516001600160a01b0390911681526020016102c4565b34801561035557600080fd5b5061030f6103643660046127d0565b610a64565b34801561037557600080fd5b50600e546103839060ff1681565b60405160ff90911681526020016102c4565b3480156103a157600080fd5b50600e546103b7906301000000900461ffff1681565b60405161ffff90911681526020016102c4565b3480156103d657600080fd5b506008545b6040519081526020016102c4565b3480156103f557600080fd5b5061030f61040436600461280c565b610b7a565b34801561041557600080fd5b50600c54610331906001600160a01b031681565b34801561043557600080fd5b5061030f610444366004612827565b610bad565b34801561045557600080fd5b5061030f610464366004612851565b610c07565b34801561047557600080fd5b506103db6104843660046127d0565b610c38565b34801561049557600080fd5b5061030f610cce565b3480156104aa57600080fd5b5061030f6104b936600461288d565b610d19565b3480156104ca57600080fd5b5061030f6104d9366004612851565b610eb1565b3480156104ea57600080fd5b5061030f610ecc565b3480156104ff57600080fd5b506103db61050e3660046127a0565b610f29565b34801561051f57600080fd5b5061030f61052e36600461280c565b610fbc565b34801561053f57600080fd5b5061030f61054e36600461295f565b611006565b34801561055f57600080fd5b5061030f611043565b34801561057457600080fd5b506103316105833660046127a0565b61108e565b34801561059457600080fd5b5061030f6105a33660046129a8565b611105565b3480156105b457600080fd5b50600c546102b890600160a81b900460ff1681565b3480156105d557600080fd5b506103db6105e43660046129a8565b61119c565b3480156105f557600080fd5b5061030f611223565b61030f61060c3660046127a0565b611259565b34801561061d57600080fd5b50600a546001600160a01b0316610331565b34801561063b57600080fd5b5061030f61064a3660046129c3565b61150a565b34801561065b57600080fd5b506102e26115fb565b34801561067057600080fd5b506102b861067f3660046129a8565b60136020526000908152604090205460ff1681565b61030f6106a23660046127a0565b61160a565b3480156106b357600080fd5b5061030f6106c23660046129e5565b6117b5565b3480156106d357600080fd5b50601554640100000000900467ffffffffffffffff1660405167ffffffffffffffff90911681526020016102c4565b34801561070e57600080fd5b5061030f6117c0565b34801561072357600080fd5b50600e546103b790610100900461ffff1681565b34801561074357600080fd5b5061030f610752366004612a21565b611824565b34801561076357600080fd5b506102e26107723660046127a0565b61185c565b34801561078357600080fd5b5061030f610792366004612a9d565b6119a3565b3480156107a357600080fd5b506103db600d5481565b3480156107b957600080fd5b50600c546102b890600160a01b900460ff1681565b3480156107da57600080fd5b506103db6107e93660046127a0565b60009081526014602052604090205490565b34801561080757600080fd5b5061030f61081636600461295f565b6119e3565b34801561082757600080fd5b506102b8610836366004612ac0565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561087057600080fd5b5061030f61087f3660046129a8565b611a20565b34801561089057600080fd5b5061030f61089f366004612aea565b611abb565b3480156108b057600080fd5b5061030f6108bf36600461280c565b611b87565b3480156108d057600080fd5b506103db600f5481565b60006001600160e01b0319821663780e9d6360e01b14806108ff57506108ff82611bcf565b92915050565b60606000805461091490612b97565b80601f016020809104026020016040519081016040528092919081815260200182805461094090612b97565b801561098d5780601f106109625761010080835404028352916020019161098d565b820191906000526020600020905b81548152906001019060200180831161097057829003601f168201915b5050505050905090565b600a546001600160a01b031633146109ca5760405162461bcd60e51b81526004016109c190612bd2565b60405180910390fd5b600f55565b6000818152600260205260408120546001600160a01b0316610a485760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016109c1565b506000908152600460205260409020546001600160a01b031690565b6000610a6f8261108e565b9050806001600160a01b0316836001600160a01b03161415610add5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016109c1565b336001600160a01b0382161480610af95750610af98133610836565b610b6b5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016109c1565b610b758383611c1f565b505050565b600a546001600160a01b03163314610ba45760405162461bcd60e51b81526004016109c190612bd2565b61ffff16600d55565b600a546001600160a01b03163314610bd75760405162461bcd60e51b81526004016109c190612bd2565b6015805467ffffffffffffffff909216640100000000026bffffffffffffffff0000000019909216919091179055565b610c113382611c8d565b610c2d5760405162461bcd60e51b81526004016109c190612c07565b610b75838383611d84565b6000610c438361119c565b8210610ca55760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016109c1565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610cf85760405162461bcd60e51b81526004016109c190612bd2565b600c805460ff60a81b198116600160a81b9182900460ff1615909102179055565b600a546001600160a01b03163314610d435760405162461bcd60e51b81526004016109c190612bd2565b6001600160a01b038216610d8e5760405162461bcd60e51b81526020600482015260126024820152712d32b9379030b2323932b9b99032b93937b960711b60448201526064016109c1565b60155461ffff6201000090910481169082161115610dee5760405162461bcd60e51b815260206004820152601d60248201527f4578636565647320726573657276656420646f6e6b7320737570706c7900000060448201526064016109c1565b600e5460155461ffff610100909204821691610e0c91849116612c6e565b61ffff161115610e2e5760405162461bcd60e51b81526004016109c190612c94565b60155461ffff1660005b8261ffff168160ff161015610e6357610e5b848380600101945061ffff16611f2f565b600101610e38565b506015805461ffff191661ffff83811691909117808355849291600291610e9291859162010000900416612ce9565b92506101000a81548161ffff021916908361ffff160217905550505050565b610b7583838360405180602001604052806000815250611824565b600a546001600160a01b03163314610ef65760405162461bcd60e51b81526004016109c190612bd2565b6040514790339082156108fc029083906000818181858888f19350505050158015610f25573d6000803e3d6000fd5b5050565b6000610f3460085490565b8210610f975760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016109c1565b60088281548110610faa57610faa612d0c565b90600052602060002001549050919050565b600a546001600160a01b03163314610fe65760405162461bcd60e51b81526004016109c190612bd2565b6015805461ffff909216620100000263ffff000019909216919091179055565b600a546001600160a01b031633146110305760405162461bcd60e51b81526004016109c190612bd2565b8051610f25906011906020840190612662565b600a546001600160a01b0316331461106d5760405162461bcd60e51b81526004016109c190612bd2565b600c805460ff60a01b198116600160a01b9182900460ff1615909102179055565b6000818152600260205260408120546001600160a01b0316806108ff5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016109c1565b600a546001600160a01b0316331461112f5760405162461bcd60e51b81526004016109c190612bd2565b6001600160a01b03811661117a5760405162461bcd60e51b81526020600482015260126024820152712d32b9379030b2323932b9b99032b93937b960711b60448201526064016109c1565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160a01b0382166112075760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016109c1565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b0316331461124d5760405162461bcd60e51b81526004016109c190612bd2565b6112576000611f49565b565b600c54600160a81b900460ff166112b25760405162461bcd60e51b815260206004820152601e60248201527f57686974656c697374204d696e74696e672069732064697361626c65642e000060448201526064016109c1565b3360009081526013602052604090205460ff1615156001146113165760405162461bcd60e51b815260206004820152601760248201527f4f6e6c792077686974656c6973742063616e206d696e7400000000000000000060448201526064016109c1565b600e5460155461ffff61010090920482169161133491849116612d22565b11156113525760405162461bcd60e51b81526004016109c190612c94565b601554600e546113769161ffff620100009091048116916301000000900416612ce9565b60155461ffff9182169161138c91849116612d22565b11156113aa5760405162461bcd60e51b81526004016109c190612d3a565b600d54816113b73361119c565b6113c19190612d22565b11156114295760405162461bcd60e51b815260206004820152603160248201527f416d6f756e7420657863656564732063757272656e74206d6178696d756d206d60448201527034b73a39903832b91030b1b1b7bab73a1760791b60648201526084016109c1565b600e5460ff1681111561144e5760405162461bcd60e51b81526004016109c190612d81565b6015543490611470908390640100000000900467ffffffffffffffff16612dcf565b11156114be5760405162461bcd60e51b815260206004820181905260248201527f45746865722076616c75652073656e74206973206e6f7420636f72726563742e60448201526064016109c1565b60155461ffff1660005b828161ffff1610156114f0576114e8338380600101945061ffff16611f2f565b6001016114c8565b506015805461ffff191661ffff9290921691909117905550565b33801580159061153e5750600a546001600160a01b038281169116148061153e5750600b546001600160a01b038281169116145b61154757600080fd5b6000838152600260205260409020546001600160a01b03166115a35760405162461bcd60e51b81526020600482015260156024820152742a37b5b2b7103237b2b9903737ba1032bc34b9ba1760591b60448201526064016109c1565b60008381526014602090815260409182902084905581513381529081018590529081018390527fb10b3625df7286db8dccbbe246db7ca30a7cb38626be90ba222cbf01339eeeba9060600160405180910390a1505050565b60606001805461091490612b97565b600c54600160a01b900460ff1661165a5760405162461bcd60e51b815260206004820152601460248201527326b4b73a34b7339034b9903234b9b0b13632b21760611b60448201526064016109c1565b601554600e5461167e9161ffff620100009091048116916301000000900416612ce9565b60155461ffff9182169161169491849116612d22565b11156116b25760405162461bcd60e51b81526004016109c190612d3a565b600e5460155461ffff6101009092048216916116d091849116612d22565b11156116ee5760405162461bcd60e51b81526004016109c190612c94565b600e5460ff168111156117135760405162461bcd60e51b81526004016109c190612d81565b6015543490611735908390640100000000900467ffffffffffffffff16612dcf565b11156117835760405162461bcd60e51b815260206004820181905260248201527f45746865722076616c75652073656e74206973206e6f7420636f72726563742e60448201526064016109c1565b60155461ffff1660005b828161ffff1610156114f0576117ad338380600101945061ffff16611f2f565b60010161178d565b610f25338383611f9b565b600a546001600160a01b031633146117ea5760405162461bcd60e51b81526004016109c190612bd2565b600c5460405147916001600160a01b03169082156108fc029083906000818181858888f19350505050158015610f25573d6000803e3d6000fd5b61182e3383611c8d565b61184a5760405162461bcd60e51b81526004016109c190612c07565b6118568484848461206a565b50505050565b6000818152600260205260409020546060906001600160a01b03166118bb5760405162461bcd60e51b81526020600482015260156024820152742a37b5b2b7103237b2b9903737ba1032bc34b9ba1760591b60448201526064016109c1565b601180546118c890612b97565b1515905061196257601080546118dd90612b97565b80601f016020809104026020016040519081016040528092919081815260200182805461190990612b97565b80156119565780601f1061192b57610100808354040283529160200191611956565b820191906000526020600020905b81548152906001019060200180831161193957829003601f168201915b50505050509050919050565b6011611977611972846001612d22565b61209d565b604051602001611988929190612e0a565b6040516020818303038152906040529050919050565b919050565b600a546001600160a01b031633146119cd5760405162461bcd60e51b81526004016109c190612bd2565b600e805460ff191660ff92909216919091179055565b600a546001600160a01b03163314611a0d5760405162461bcd60e51b81526004016109c190612bd2565b8051610f25906010906020840190612662565b600a546001600160a01b03163314611a4a5760405162461bcd60e51b81526004016109c190612bd2565b6001600160a01b038116611aaf5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109c1565b611ab881611f49565b50565b600a546001600160a01b03163314611ae55760405162461bcd60e51b81526004016109c190612bd2565b60005b8151811015610f25576000828281518110611b0557611b05612d0c565b6020908102919091018101516001600160a01b0381166000908152601390925260409091205490915060ff161515600114801590611b4b57506001600160a01b03811615155b15611b74576001600160a01b0381166000908152601360205260409020805460ff191660011790555b5080611b7f81612eb1565b915050611ae8565b600a546001600160a01b03163314611bb15760405162461bcd60e51b81526004016109c190612bd2565b600e805461ffff9092166101000262ffff0019909216919091179055565b60006001600160e01b031982166380ac58cd60e01b1480611c0057506001600160e01b03198216635b5e139f60e01b145b806108ff57506301ffc9a760e01b6001600160e01b03198316146108ff565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611c548261108e565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611d065760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016109c1565b6000611d118361108e565b9050806001600160a01b0316846001600160a01b03161480611d4c5750836001600160a01b0316611d41846109cf565b6001600160a01b0316145b80611d7c57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611d978261108e565b6001600160a01b031614611dff5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016109c1565b6001600160a01b038216611e615760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016109c1565b611e6c83838361219b565b611e77600082611c1f565b6001600160a01b0383166000908152600360205260408120805460019290611ea0908490612ecc565b90915550506001600160a01b0382166000908152600360205260408120805460019290611ece908490612d22565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610f25828260405180602001604052806000815250612253565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415611ffd5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016109c1565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612075848484611d84565b61208184848484612286565b6118565760405162461bcd60e51b81526004016109c190612ee3565b6060816120c15750506040805180820190915260018152600360fc1b602082015290565b8160005b81156120eb57806120d581612eb1565b91506120e49050600a83612f4b565b91506120c5565b60008167ffffffffffffffff811115612106576121066128c0565b6040519080825280601f01601f191660200182016040528015612130576020820181803683370190505b5090505b8415611d7c57612145600183612ecc565b9150612152600a86612f5f565b61215d906030612d22565b60f81b81838151811061217257612172612d0c565b60200101906001600160f81b031916908160001a905350612194600a86612f4b565b9450612134565b6001600160a01b0383166121f6576121f181600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612219565b816001600160a01b0316836001600160a01b031614612219576122198382612384565b6001600160a01b03821661223057610b7581612421565b826001600160a01b0316826001600160a01b031614610b7557610b7582826124d0565b61225d8383612514565b61226a6000848484612286565b610b755760405162461bcd60e51b81526004016109c190612ee3565b60006001600160a01b0384163b1561237957604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906122ca903390899088908890600401612f73565b6020604051808303816000875af1925050508015612305575060408051601f3d908101601f1916820190925261230291810190612fb0565b60015b61235f573d808015612333576040519150601f19603f3d011682016040523d82523d6000602084013e612338565b606091505b5080516123575760405162461bcd60e51b81526004016109c190612ee3565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611d7c565b506001949350505050565b600060016123918461119c565b61239b9190612ecc565b6000838152600760205260409020549091508082146123ee576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061243390600190612ecc565b6000838152600960205260408120546008805493945090928490811061245b5761245b612d0c565b90600052602060002001549050806008838154811061247c5761247c612d0c565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806124b4576124b4612fcd565b6001900381819060005260206000200160009055905550505050565b60006124db8361119c565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b03821661256a5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016109c1565b6000818152600260205260409020546001600160a01b0316156125cf5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016109c1565b6125db6000838361219b565b6001600160a01b0382166000908152600360205260408120805460019290612604908490612d22565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461266e90612b97565b90600052602060002090601f01602090048101928261269057600085556126d6565b82601f106126a957805160ff19168380011785556126d6565b828001600101855582156126d6579182015b828111156126d65782518255916020019190600101906126bb565b506126e29291506126e6565b5090565b5b808211156126e257600081556001016126e7565b6001600160e01b031981168114611ab857600080fd5b60006020828403121561272357600080fd5b813561272e816126fb565b9392505050565b60005b83811015612750578181015183820152602001612738565b838111156118565750506000910152565b60008151808452612779816020860160208601612735565b601f01601f19169290920160200192915050565b60208152600061272e6020830184612761565b6000602082840312156127b257600080fd5b5035919050565b80356001600160a01b038116811461199e57600080fd5b600080604083850312156127e357600080fd5b6127ec836127b9565b946020939093013593505050565b803561ffff8116811461199e57600080fd5b60006020828403121561281e57600080fd5b61272e826127fa565b60006020828403121561283957600080fd5b813567ffffffffffffffff8116811461272e57600080fd5b60008060006060848603121561286657600080fd5b61286f846127b9565b925061287d602085016127b9565b9150604084013590509250925092565b600080604083850312156128a057600080fd5b6128a9836127b9565b91506128b7602084016127fa565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156128ff576128ff6128c0565b604052919050565b600067ffffffffffffffff831115612921576129216128c0565b612934601f8401601f19166020016128d6565b905082815283838301111561294857600080fd5b828260208301376000602084830101529392505050565b60006020828403121561297157600080fd5b813567ffffffffffffffff81111561298857600080fd5b8201601f8101841361299957600080fd5b611d7c84823560208401612907565b6000602082840312156129ba57600080fd5b61272e826127b9565b600080604083850312156129d657600080fd5b50508035926020909101359150565b600080604083850312156129f857600080fd5b612a01836127b9565b915060208301358015158114612a1657600080fd5b809150509250929050565b60008060008060808587031215612a3757600080fd5b612a40856127b9565b9350612a4e602086016127b9565b925060408501359150606085013567ffffffffffffffff811115612a7157600080fd5b8501601f81018713612a8257600080fd5b612a9187823560208401612907565b91505092959194509250565b600060208284031215612aaf57600080fd5b813560ff8116811461272e57600080fd5b60008060408385031215612ad357600080fd5b612adc836127b9565b91506128b7602084016127b9565b60006020808385031215612afd57600080fd5b823567ffffffffffffffff80821115612b1557600080fd5b818501915085601f830112612b2957600080fd5b813581811115612b3b57612b3b6128c0565b8060051b9150612b4c8483016128d6565b8181529183018401918481019088841115612b6657600080fd5b938501935b83851015612b8b57612b7c856127b9565b82529385019390850190612b6b565b98975050505050505050565b600181811c90821680612bab57607f821691505b60208210811415612bcc57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600061ffff808316818516808303821115612c8b57612c8b612c58565b01949350505050565b60208082526035908201527f416d6f756e742065786365656473206d6178696d756d20737570706c79206f66604082015274102237b735b99034b7103a3434b990383430b9b29760591b606082015260800190565b600061ffff83811690831681811015612d0457612d04612c58565b039392505050565b634e487b7160e01b600052603260045260246000fd5b60008219821115612d3557612d35612c58565b500190565b60208082526027908201527f416d6f756e742065786365656473206d6178696d756d20737570706c79206f66604082015266102237b735b99760c91b606082015260800190565b6020808252602e908201527f416d6f756e7420657863656564732063757272656e74206d6178696d756d204460408201526d37b735b9903832b91036b4b73a1760911b606082015260800190565b6000816000190483118215151615612de957612de9612c58565b500290565b60008151612e00818560208601612735565b9290920192915050565b600080845481600182811c915080831680612e2657607f831692505b6020808410821415612e4657634e487b7160e01b86526022600452602486fd5b818015612e5a5760018114612e6b57612e98565b60ff19861689528489019650612e98565b60008b81526020902060005b86811015612e905781548b820152908501908301612e77565b505084890196505b505050505050612ea88185612dee565b95945050505050565b6000600019821415612ec557612ec5612c58565b5060010190565b600082821015612ede57612ede612c58565b500390565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b600082612f5a57612f5a612f35565b500490565b600082612f6e57612f6e612f35565b500690565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612fa690830184612761565b9695505050505050565b600060208284031215612fc257600080fd5b815161272e816126fb565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220f6d76bbcfa2fe686011fee0213791627d41923f3a4f4f6b4f896e8a57e233f8764736f6c634300080a0033

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

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000006bdc3b29a47bd686fc991cab14d4ab4f0f504174000000000000000000000000000000000000000000000000000000000000000d446567656e20446f6e6b657973000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005444f4e4b53000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005068747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d61534d4d6f456267673333424e6a6d646a41694734686675657244777267397031416236764554675335563800000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): Degen Donkeys
Arg [1] : symbol (string): DONKS
Arg [2] : _defaultURI (string): https://gateway.pinata.cloud/ipfs/QmaSMMoEbgg33BNjmdjAiG4hfuerDwrg9p1Ab6vETgS5V8
Arg [3] : _fundsWallet (address): 0x6bDc3B29a47Bd686fc991caB14D4aB4f0F504174

-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 0000000000000000000000006bdc3b29a47bd686fc991cab14d4ab4f0f504174
Arg [4] : 000000000000000000000000000000000000000000000000000000000000000d
Arg [5] : 446567656e20446f6e6b65797300000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [7] : 444f4e4b53000000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000050
Arg [9] : 68747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066
Arg [10] : 732f516d61534d4d6f456267673333424e6a6d646a4169473468667565724477
Arg [11] : 7267397031416236764554675335563800000000000000000000000000000000


Deployed Bytecode Sourcemap

46472:9004:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37717:224;;;;;;;;;;-1:-1:-1;37717:224:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;37717:224:0;;;;;;;;22139:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;54346:104::-;;;;;;;;;;-1:-1:-1;54346:104:0;;;;;:::i;:::-;;:::i;:::-;;23698:221;;;;;;;;;;-1:-1:-1;23698:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1714:32:1;;;1696:51;;1684:2;1669:18;23698:221:0;1550:203:1;23221:411:0;;;;;;;;;;-1:-1:-1;23221:411:0;;;;;:::i;:::-;;:::i;46888:25::-;;;;;;;;;;-1:-1:-1;46888:25:0;;;;;;;;;;;2367:4:1;2355:17;;;2337:36;;2325:2;2310:18;46888:25:0;2195:184:1;46952:29:0;;;;;;;;;;-1:-1:-1;46952:29:0;;;;;;;;;;;;;;2558:6:1;2546:19;;;2528:38;;2516:2;2501:18;46952:29:0;2384:188:1;38357:113:0;;;;;;;;;;-1:-1:-1;38445:10:0;:17;38357:113;;;2723:25:1;;;2711:2;2696:18;38357:113:0;2577:177:1;52396:125:0;;;;;;;;;;-1:-1:-1;52396:125:0;;;;;:::i;:::-;;:::i;46728:26::-;;;;;;;;;;-1:-1:-1;46728:26:0;;;;-1:-1:-1;;;;;46728:26:0;;;53113:92;;;;;;;;;;-1:-1:-1;53113:92:0;;;;;:::i;:::-;;:::i;24448:339::-;;;;;;;;;;-1:-1:-1;24448:339:0;;;;;:::i;:::-;;:::i;38025:256::-;;;;;;;;;;-1:-1:-1;38025:256:0;;;;;:::i;:::-;;:::i;52118:118::-;;;;;;;;;;;;;:::i;48516:622::-;;;;;;;;;;-1:-1:-1;48516:622:0;;;;;:::i;:::-;;:::i;24858:185::-;;;;;;;;;;-1:-1:-1;24858:185:0;;;;;:::i;:::-;;:::i;47980:148::-;;;;;;;;;;;;;:::i;38547:233::-;;;;;;;;;;-1:-1:-1;38547:233:0;;;;;:::i;:::-;;:::i;52880:99::-;;;;;;;;;;-1:-1:-1;52880:99:0;;;;;:::i;:::-;;:::i;54819:98::-;;;;;;;;;;-1:-1:-1;54819:98:0;;;;;:::i;:::-;;:::i;54515:91::-;;;;;;;;;;;;;:::i;21833:239::-;;;;;;;;;;-1:-1:-1;21833:239:0;;;;;:::i;:::-;;:::i;53358:176::-;;;;;;;;;;-1:-1:-1;53358:176:0;;;;;:::i;:::-;;:::i;46799:40::-;;;;;;;;;;-1:-1:-1;46799:40:0;;;;-1:-1:-1;;;46799:40:0;;;;;;21563:208;;;;;;;;;;-1:-1:-1;21563:208:0;;;;;:::i;:::-;;:::i;45576:103::-;;;;;;;;;;;;;:::i;50873:1133::-;;;;;;:::i;:::-;;:::i;44925:87::-;;;;;;;;;;-1:-1:-1;44998:6:0;;-1:-1:-1;;;;;44998:6:0;44925:87;;53701:253;;;;;;;;;;-1:-1:-1;53701:253:0;;;;;:::i;:::-;;:::i;22308:104::-;;;;;;;;;;;;;:::i;47110:42::-;;;;;;;;;;-1:-1:-1;47110:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;49323:864;;;;;;:::i;:::-;;:::i;23991:155::-;;;;;;;;;;-1:-1:-1;23991:155:0;;;;;:::i;:::-;;:::i;54015:89::-;;;;;;;;;;-1:-1:-1;54086:4:0;:10;;;;;;54015:89;;6247:18:1;6235:31;;;6217:50;;6205:2;6190:18;54015:89:0;6073:200:1;48204:149:0;;;;;;;;;;;;;:::i;46920:25::-;;;;;;;;;;-1:-1:-1;46920:25:0;;;;;;;;;;;25114:328;;;;;;;;;;-1:-1:-1;25114:328:0;;;;;:::i;:::-;;:::i;55094:377::-;;;;;;;;;;-1:-1:-1;55094:377:0;;;;;:::i;:::-;;:::i;54673:90::-;;;;;;;;;;-1:-1:-1;54673:90:0;;;;;:::i;:::-;;:::i;46846:35::-;;;;;;;;;;;;;;;;46761:31;;;;;;;;;;-1:-1:-1;46761:31:0;;;;-1:-1:-1;;;46761:31:0;;;;;;54174:103;;;;;;;;;;-1:-1:-1;54174:103:0;;;;;:::i;:::-;54228:7;54255:14;;;:10;:14;;;;;;;54174:103;54976:110;;;;;;;;;;-1:-1:-1;54976:110:0;;;;;:::i;:::-;;:::i;24217:164::-;;;;;;;;;;-1:-1:-1;24217:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;24338:25:0;;;24314:4;24338:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;24217:164;45834:201;;;;;;;;;;-1:-1:-1;45834:201:0;;;;;:::i;:::-;;:::i;50391:300::-;;;;;;;;;;-1:-1:-1;50391:300:0;;;;;:::i;:::-;;:::i;52654:83::-;;;;;;;;;;-1:-1:-1;52654:83:0;;;;;:::i;:::-;;:::i;46988:25::-;;;;;;;;;;;;;;;;37717:224;37819:4;-1:-1:-1;;;;;;37843:50:0;;-1:-1:-1;;;37843:50:0;;:90;;;37897:36;37921:11;37897:23;:36::i;:::-;37836:97;37717:224;-1:-1:-1;;37717:224:0:o;22139:100::-;22193:13;22226:5;22219:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22139:100;:::o;54346:104::-;44998:6;;-1:-1:-1;;;;;44998:6:0;16521:10;45145:23;45137:68;;;;-1:-1:-1;;;45137:68:0;;;;;;;:::i;:::-;;;;;;;;;54418:10:::1;:24:::0;54346:104::o;23698:221::-;23774:7;27041:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27041:16:0;23794:73;;;;-1:-1:-1;;;23794:73:0;;9394:2:1;23794:73:0;;;9376:21:1;9433:2;9413:18;;;9406:30;9472:34;9452:18;;;9445:62;-1:-1:-1;;;9523:18:1;;;9516:42;9575:19;;23794:73:0;9192:408:1;23794:73:0;-1:-1:-1;23887:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;23887:24:0;;23698:221::o;23221:411::-;23302:13;23318:23;23333:7;23318:14;:23::i;:::-;23302:39;;23366:5;-1:-1:-1;;;;;23360:11:0;:2;-1:-1:-1;;;;;23360:11:0;;;23352:57;;;;-1:-1:-1;;;23352:57:0;;9807:2:1;23352:57:0;;;9789:21:1;9846:2;9826:18;;;9819:30;9885:34;9865:18;;;9858:62;-1:-1:-1;;;9936:18:1;;;9929:31;9977:19;;23352:57:0;9605:397:1;23352:57:0;16521:10;-1:-1:-1;;;;;23444:21:0;;;;:62;;-1:-1:-1;23469:37:0;23486:5;16521:10;24217:164;:::i;23469:37::-;23422:168;;;;-1:-1:-1;;;23422:168:0;;10209:2:1;23422:168:0;;;10191:21:1;10248:2;10228:18;;;10221:30;10287:34;10267:18;;;10260:62;10358:26;10338:18;;;10331:54;10402:19;;23422:168:0;10007:420:1;23422:168:0;23603:21;23612:2;23616:7;23603:8;:21::i;:::-;23291:341;23221:411;;:::o;52396:125::-;44998:6;;-1:-1:-1;;;;;44998:6:0;16521:10;45145:23;45137:68;;;;-1:-1:-1;;;45137:68:0;;;;;;;:::i;:::-;52478:35:::1;;:19;:35:::0;52396:125::o;53113:92::-;44998:6;;-1:-1:-1;;;;;44998:6:0;16521:10;45145:23;45137:68;;;;-1:-1:-1;;;45137:68:0;;;;;;;:::i;:::-;53176:4:::1;:21:::0;;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;53176:21:0;;::::1;::::0;;;::::1;::::0;;53113:92::o;24448:339::-;24643:41;16521:10;24676:7;24643:18;:41::i;:::-;24635:103;;;;-1:-1:-1;;;24635:103:0;;;;;;;:::i;:::-;24751:28;24761:4;24767:2;24771:7;24751:9;:28::i;38025:256::-;38122:7;38158:23;38175:5;38158:16;:23::i;:::-;38150:5;:31;38142:87;;;;-1:-1:-1;;;38142:87:0;;11052:2:1;38142:87:0;;;11034:21:1;11091:2;11071:18;;;11064:30;11130:34;11110:18;;;11103:62;-1:-1:-1;;;11181:18:1;;;11174:41;11232:19;;38142:87:0;10850:407:1;38142:87:0;-1:-1:-1;;;;;;38247:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;38025:256::o;52118:118::-;44998:6;;-1:-1:-1;;;;;44998:6:0;16521:10;45145:23;45137:68;;;;-1:-1:-1;;;45137:68:0;;;;;;;:::i;:::-;52208:20:::1;::::0;;-1:-1:-1;;;;52184:44:0;::::1;-1:-1:-1::0;;;52208:20:0;;;::::1;;;52207:21;52184:44:::0;;::::1;;::::0;;52118:118::o;48516:622::-;44998:6;;-1:-1:-1;;;;;44998:6:0;16521:10;45145:23;45137:68;;;;-1:-1:-1;;;45137:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;48628:18:0;::::1;48619:50;;;::::0;-1:-1:-1;;;48619:50:0;;11464:2:1;48619:50:0::1;::::0;::::1;11446:21:1::0;11503:2;11483:18;;;11476:30;-1:-1:-1;;;11522:18:1;;;11515:48;11580:18;;48619:50:0::1;11262:342:1::0;48619:50:0::1;48700:4;:14:::0;::::1;::::0;;;::::1;::::0;::::1;48689:25:::0;;::::1;;;48680:68;;;::::0;-1:-1:-1;;;48680:68:0;;11811:2:1;48680:68:0::1;::::0;::::1;11793:21:1::0;11850:2;11830:18;;;11823:30;11889:31;11869:18;;;11862:59;11938:18;;48680:68:0::1;11609:353:1::0;48680:68:0::1;48804:5;::::0;48779:4:::1;:11:::0;48804:5:::1;;::::0;;::::1;::::0;::::1;::::0;48779:21:::1;::::0;48793:7;;48779:11:::1;:21;:::i;:::-;:30;;;;48759:129;;;;-1:-1:-1::0;;;48759:129:0::1;;;;;;;:::i;:::-;48917:4;:11:::0;::::1;;48901:13;48962:91;48984:7;48980:11;;:1;:11;;;48962:91;;;49015:24;49025:3;49030:8;;;;;;49015:24;;:9;:24::i;:::-;48993:3;;48962:91;;;-1:-1:-1::0;49074:4:0::1;:20:::0;;-1:-1:-1;;49074:20:0::1;;::::0;;::::1;::::0;;;::::1;::::0;;;49123:7;;49074:4;49105:14:::1;::::0;:25:::1;::::0;49123:7;;49105:25;;::::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;48608:530;48516:622:::0;;:::o;24858:185::-;24996:39;25013:4;25019:2;25023:7;24996:39;;;;;;;;;;;;:16;:39::i;47980:148::-;44998:6;;-1:-1:-1;;;;;44998:6:0;16521:10;45145:23;45137:68;;;;-1:-1:-1;;;45137:68:0;;;;;;;:::i;:::-;48083:37:::1;::::0;48051:21:::1;::::0;48091:10:::1;::::0;48083:37;::::1;;;::::0;48051:21;;48033:15:::1;48083:37:::0;48033:15;48083:37;48051:21;48091:10;48083:37;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;48022:106;47980:148::o:0;38547:233::-;38622:7;38658:30;38445:10;:17;;38357:113;38658:30;38650:5;:38;38642:95;;;;-1:-1:-1;;;38642:95:0;;13174:2:1;38642:95:0;;;13156:21:1;13213:2;13193:18;;;13186:30;13252:34;13232:18;;;13225:62;-1:-1:-1;;;13303:18:1;;;13296:42;13355:19;;38642:95:0;12972:408:1;38642:95:0;38755:10;38766:5;38755:17;;;;;;;;:::i;:::-;;;;;;;;;38748:24;;38547:233;;;:::o;52880:99::-;44998:6;;-1:-1:-1;;;;;44998:6:0;16521:10;45145:23;45137:68;;;;-1:-1:-1;;;45137:68:0;;;;;;;:::i;:::-;52946:4:::1;:25:::0;;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;52946:25:0;;::::1;::::0;;;::::1;::::0;;52880:99::o;54819:98::-;44998:6;;-1:-1:-1;;;;;44998:6:0;16521:10;45145:23;45137:68;;;;-1:-1:-1;;;45137:68:0;;;;;;;:::i;:::-;54891:18;;::::1;::::0;:7:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;54515:91::-:0;44998:6;;-1:-1:-1;;;;;44998:6:0;16521:10;45145:23;45137:68;;;;-1:-1:-1;;;45137:68:0;;;;;;;:::i;:::-;54587:11:::1;::::0;;-1:-1:-1;;;;54572:26:0;::::1;-1:-1:-1::0;;;54587:11:0;;;::::1;;;54586:12;54572:26:::0;;::::1;;::::0;;54515:91::o;21833:239::-;21905:7;21941:16;;;:7;:16;;;;;;-1:-1:-1;;;;;21941:16:0;21976:19;21968:73;;;;-1:-1:-1;;;21968:73:0;;13719:2:1;21968:73:0;;;13701:21:1;13758:2;13738:18;;;13731:30;13797:34;13777:18;;;13770:62;-1:-1:-1;;;13848:18:1;;;13841:39;13897:19;;21968:73:0;13517:405:1;53358:176:0;44998:6;;-1:-1:-1;;;;;44998:6:0;16521:10;45145:23;45137:68;;;;-1:-1:-1;;;45137:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;53440:26:0;::::1;53432:57;;;::::0;-1:-1:-1;;;53432:57:0;;11464:2:1;53432:57:0::1;::::0;::::1;11446:21:1::0;11503:2;11483:18;;;11476:30;-1:-1:-1;;;11522:18:1;;;11515:48;11580:18;;53432:57:0::1;11262:342:1::0;53432:57:0::1;53500:11;:26:::0;;-1:-1:-1;;;;;;53500:26:0::1;-1:-1:-1::0;;;;;53500:26:0;;;::::1;::::0;;;::::1;::::0;;53358:176::o;21563:208::-;21635:7;-1:-1:-1;;;;;21663:19:0;;21655:74;;;;-1:-1:-1;;;21655:74:0;;14129:2:1;21655:74:0;;;14111:21:1;14168:2;14148:18;;;14141:30;14207:34;14187:18;;;14180:62;-1:-1:-1;;;14258:18:1;;;14251:40;14308:19;;21655:74:0;13927:406:1;21655:74:0;-1:-1:-1;;;;;;21747:16:0;;;;;:9;:16;;;;;;;21563:208::o;45576:103::-;44998:6;;-1:-1:-1;;;;;44998:6:0;16521:10;45145:23;45137:68;;;;-1:-1:-1;;;45137:68:0;;;;;;;:::i;:::-;45641:30:::1;45668:1;45641:18;:30::i;:::-;45576:103::o:0;50873:1133::-;50946:20;;-1:-1:-1;;;50946:20:0;;;;50938:63;;;;-1:-1:-1;;;50938:63:0;;14540:2:1;50938:63:0;;;14522:21:1;14579:2;14559:18;;;14552:30;14618:32;14598:18;;;14591:60;14668:18;;50938:63:0;14338:354:1;50938:63:0;51031:10;51021:21;;;;:9;:21;;;;;;;;:29;;:21;:29;51012:67;;;;-1:-1:-1;;;51012:67:0;;14899:2:1;51012:67:0;;;14881:21:1;14938:2;14918:18;;;14911:30;14977:25;14957:18;;;14950:53;15020:18;;51012:67:0;14697:347:1;51012:67:0;51134:5;;51110:4;:11;51134:5;;;;;;;;51110:20;;51124:6;;51110:11;:20;:::i;:::-;:29;;51090:128;;;;-1:-1:-1;;;51090:128:0;;;;;;;:::i;:::-;51286:4;:14;51275:8;;:25;;51286:14;;;;;;;;51275:8;;;;:25;:::i;:::-;51251:4;:11;:49;;;;;:20;;51265:6;;51251:11;:20;:::i;:::-;:49;;51229:138;;;;-1:-1:-1;;;51229:138:0;;;;;;;:::i;:::-;51434:19;;51424:6;51400:21;51410:10;51400:9;:21::i;:::-;:30;;;;:::i;:::-;:53;;51378:152;;;;-1:-1:-1;;;51378:152:0;;15792:2:1;51378:152:0;;;15774:21:1;15831:2;15811:18;;;15804:30;15870:34;15850:18;;;15843:62;-1:-1:-1;;;15921:18:1;;;15914:47;15978:19;;51378:152:0;15590:413:1;51378:152:0;51573:7;;;;51563:17;;;51541:113;;;;-1:-1:-1;;;51541:113:0;;;;;;;:::i;:::-;51687:4;:10;51710:9;;51687:19;;51700:6;;51687:10;;;;;:19;:::i;:::-;:32;;51665:114;;;;-1:-1:-1;;;51665:114:0;;16798:2:1;51665:114:0;;;16780:21:1;;;16817:18;;;16810:30;16876:34;16856:18;;;16849:62;16928:18;;51665:114:0;16596:356:1;51665:114:0;51808:4;:11;;;51792:13;51855:102;51878:6;51874:1;:10;;;51855:102;;;51910:31;51920:10;51932:8;;;;;;51910:31;;:9;:31::i;:::-;51886:3;;51855:102;;;-1:-1:-1;51978:4:0;:20;;-1:-1:-1;;51978:20:0;;;;;;;;;;;;-1:-1:-1;50873:1133:0:o;53701:253::-;53787:10;47375:20;;;;;:67;;-1:-1:-1;44998:6:0;;-1:-1:-1;;;;;47400:17:0;;;44998:6;;47400:17;;:41;;-1:-1:-1;47431:10:0;;-1:-1:-1;;;;;47421:20:0;;;47431:10;;47421:20;47400:41;47353:100;;;;;;27017:4;27041:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27041:16:0;53815:45:::1;;;::::0;-1:-1:-1;;;53815:45:0;;17159:2:1;53815:45:0::1;::::0;::::1;17141:21:1::0;17198:2;17178:18;;;17171:30;-1:-1:-1;;;17217:18:1;;;17210:51;17278:18;;53815:45:0::1;16957:345:1::0;53815:45:0::1;53871:14;::::0;;;:10:::1;:14;::::0;;;;;;;;:22;;;53909:37;;53924:10:::1;17509:51:1::0;;17576:18;;;17569:34;;;17619:18;;;17612:34;;;53909:37:0::1;::::0;17497:2:1;17482:18;53909:37:0::1;;;;;;;53701:253:::0;;;:::o;22308:104::-;22364:13;22397:7;22390:14;;;;;:::i;49323:864::-;49387:11;;-1:-1:-1;;;49387:11:0;;;;49379:44;;;;-1:-1:-1;;;49379:44:0;;17859:2:1;49379:44:0;;;17841:21:1;17898:2;17878:18;;;17871:30;-1:-1:-1;;;17917:18:1;;;17910:50;17977:18;;49379:44:0;17657:344:1;49379:44:0;49491:4;:14;49480:8;;:25;;49491:14;;;;;;;;49480:8;;;;:25;:::i;:::-;49456:4;:11;:49;;;;;:20;;49470:6;;49456:11;:20;:::i;:::-;:49;;49434:138;;;;-1:-1:-1;;;49434:138:0;;;;;;;:::i;:::-;49627:5;;49603:4;:11;49627:5;;;;;;;;49603:20;;49617:6;;49603:11;:20;:::i;:::-;:29;;49583:128;;;;-1:-1:-1;;;49583:128:0;;;;;;;:::i;:::-;49754:7;;;;49744:17;;;49722:113;;;;-1:-1:-1;;;49722:113:0;;;;;;;:::i;:::-;49868:4;:10;49891:9;;49868:19;;49881:6;;49868:10;;;;;:19;:::i;:::-;:32;;49846:114;;;;-1:-1:-1;;;49846:114:0;;16798:2:1;49846:114:0;;;16780:21:1;;;16817:18;;;16810:30;16876:34;16856:18;;;16849:62;16928:18;;49846:114:0;16596:356:1;49846:114:0;49989:4;:11;;;49973:13;50036:102;50059:6;50055:1;:10;;;50036:102;;;50091:31;50101:10;50113:8;;;;;;50091:31;;:9;:31::i;:::-;50067:3;;50036:102;;23991:155;24086:52;16521:10;24119:8;24129;24086:18;:52::i;48204:149::-;44998:6;;-1:-1:-1;;;;;44998:6:0;16521:10;45145:23;45137:68;;;;-1:-1:-1;;;45137:68:0;;;;;;;:::i;:::-;48315:11:::1;::::0;48307:38:::1;::::0;48275:21:::1;::::0;-1:-1:-1;;;;;48315:11:0::1;::::0;48307:38;::::1;;;::::0;48275:21;;48257:15:::1;48307:38:::0;48257:15;48307:38;48275:21;48315:11;48307:38;::::1;;;;;;;;;;;;;::::0;::::1;;;;25114:328:::0;25289:41;16521:10;25322:7;25289:18;:41::i;:::-;25281:103;;;;-1:-1:-1;;;25281:103:0;;;;;;;:::i;:::-;25395:39;25409:4;25415:2;25419:7;25428:5;25395:13;:39::i;:::-;25114:328;;;;:::o;55094:377::-;27017:4;27041:16;;;:7;:16;;;;;;55195:13;;-1:-1:-1;;;;;27041:16:0;55226:50;;;;-1:-1:-1;;;55226:50:0;;17159:2:1;55226:50:0;;;17141:21:1;17198:2;17178:18;;;17171:30;-1:-1:-1;;;17217:18:1;;;17210:51;17278:18;;55226:50:0;16957:345:1;55226:50:0;55299:7;55293:21;;;;;:::i;:::-;:26;55289:175;;-1:-1:-1;55289:175:0;;55343:10;55336:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55094:377;;;:::o;55289:175::-;55417:7;55426:24;55427:11;:7;55437:1;55427:11;:::i;:::-;55426:22;:24::i;:::-;55400:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55386:66;;55094:377;;;:::o;55289:175::-;55094:377;;;:::o;54673:90::-;44998:6;;-1:-1:-1;;;;;44998:6:0;16521:10;45145:23;45137:68;;;;-1:-1:-1;;;45137:68:0;;;;;;;:::i;:::-;54737:7:::1;:18:::0;;-1:-1:-1;;54737:18:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;54673:90::o;54976:110::-;44998:6;;-1:-1:-1;;;;;44998:6:0;16521:10;45145:23;45137:68;;;;-1:-1:-1;;;45137:68:0;;;;;;;:::i;:::-;55054:24;;::::1;::::0;:10:::1;::::0;:24:::1;::::0;::::1;::::0;::::1;:::i;45834:201::-:0;44998:6;;-1:-1:-1;;;;;44998:6:0;16521:10;45145:23;45137:68;;;;-1:-1:-1;;;45137:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;45923:22:0;::::1;45915:73;;;::::0;-1:-1:-1;;;45915:73:0;;19703:2:1;45915:73:0::1;::::0;::::1;19685:21:1::0;19742:2;19722:18;;;19715:30;19781:34;19761:18;;;19754:62;-1:-1:-1;;;19832:18:1;;;19825:36;19878:19;;45915:73:0::1;19501:402:1::0;45915:73:0::1;45999:28;46018:8;45999:18;:28::i;:::-;45834:201:::0;:::o;50391:300::-;44998:6;;-1:-1:-1;;;;;44998:6:0;16521:10;45145:23;45137:68;;;;-1:-1:-1;;;45137:68:0;;;;;;;:::i;:::-;50474:6:::1;50470:214;50488:9;:16;50484:1;:20;50470:214;;;50525:12;50540:9;50550:1;50540:12;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;50570:15:0;::::1;;::::0;;;:9:::1;:15:::0;;;;;;;;50540:12;;-1:-1:-1;50570:15:0::1;;:23;;:15:::0;:23:::1;::::0;::::1;::::0;:45:::1;;-1:-1:-1::0;;;;;;50597:18:0;::::1;::::0;::::1;50570:45;50567:106;;;-1:-1:-1::0;;;;;50635:15:0;::::1;;::::0;;;:9:::1;:15;::::0;;;;:22;;-1:-1:-1;;50635:22:0::1;50653:4;50635:22;::::0;;50567:106:::1;-1:-1:-1::0;50506:3:0;::::1;::::0;::::1;:::i;:::-;;;;50470:214;;52654:83:::0;44998:6;;-1:-1:-1;;;;;44998:6:0;16521:10;45145:23;45137:68;;;;-1:-1:-1;;;45137:68:0;;;;;;;:::i;:::-;52715:5:::1;:14:::0;;::::1;::::0;;::::1;;;-1:-1:-1::0;;52715:14:0;;::::1;::::0;;;::::1;::::0;;52654:83::o;21194:305::-;21296:4;-1:-1:-1;;;;;;21333:40:0;;-1:-1:-1;;;21333:40:0;;:105;;-1:-1:-1;;;;;;;21390:48:0;;-1:-1:-1;;;21390:48:0;21333:105;:158;;;-1:-1:-1;;;;;;;;;;19749:40:0;;;21455:36;19640:157;30934:174;31009:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;31009:29:0;-1:-1:-1;;;;;31009:29:0;;;;;;;;:24;;31063:23;31009:24;31063:14;:23::i;:::-;-1:-1:-1;;;;;31054:46:0;;;;;;;;;;;30934:174;;:::o;27246:348::-;27339:4;27041:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27041:16:0;27356:73;;;;-1:-1:-1;;;27356:73:0;;20250:2:1;27356:73:0;;;20232:21:1;20289:2;20269:18;;;20262:30;20328:34;20308:18;;;20301:62;-1:-1:-1;;;20379:18:1;;;20372:42;20431:19;;27356:73:0;20048:408:1;27356:73:0;27440:13;27456:23;27471:7;27456:14;:23::i;:::-;27440:39;;27509:5;-1:-1:-1;;;;;27498:16:0;:7;-1:-1:-1;;;;;27498:16:0;;:51;;;;27542:7;-1:-1:-1;;;;;27518:31:0;:20;27530:7;27518:11;:20::i;:::-;-1:-1:-1;;;;;27518:31:0;;27498:51;:87;;;-1:-1:-1;;;;;;24338:25:0;;;24314:4;24338:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;27553:32;27490:96;27246:348;-1:-1:-1;;;;27246:348:0:o;30238:578::-;30397:4;-1:-1:-1;;;;;30370:31:0;:23;30385:7;30370:14;:23::i;:::-;-1:-1:-1;;;;;30370:31:0;;30362:85;;;;-1:-1:-1;;;30362:85:0;;20663:2:1;30362:85:0;;;20645:21:1;20702:2;20682:18;;;20675:30;20741:34;20721:18;;;20714:62;-1:-1:-1;;;20792:18:1;;;20785:39;20841:19;;30362:85:0;20461:405:1;30362:85:0;-1:-1:-1;;;;;30466:16:0;;30458:65;;;;-1:-1:-1;;;30458:65:0;;21073:2:1;30458:65:0;;;21055:21:1;21112:2;21092:18;;;21085:30;21151:34;21131:18;;;21124:62;-1:-1:-1;;;21202:18:1;;;21195:34;21246:19;;30458:65:0;20871:400:1;30458:65:0;30536:39;30557:4;30563:2;30567:7;30536:20;:39::i;:::-;30640:29;30657:1;30661:7;30640:8;:29::i;:::-;-1:-1:-1;;;;;30682:15:0;;;;;;:9;:15;;;;;:20;;30701:1;;30682:15;:20;;30701:1;;30682:20;:::i;:::-;;;;-1:-1:-1;;;;;;;30713:13:0;;;;;;:9;:13;;;;;:18;;30730:1;;30713:13;:18;;30730:1;;30713:18;:::i;:::-;;;;-1:-1:-1;;30742:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;30742:21:0;-1:-1:-1;;;;;30742:21:0;;;;;;;;;30781:27;;30742:16;;30781:27;;;;;;;30238:578;;;:::o;27936:110::-;28012:26;28022:2;28026:7;28012:26;;;;;;;;;;;;:9;:26::i;46195:191::-;46288:6;;;-1:-1:-1;;;;;46305:17:0;;;-1:-1:-1;;;;;;46305:17:0;;;;;;;46338:40;;46288:6;;;46305:17;46288:6;;46338:40;;46269:16;;46338:40;46258:128;46195:191;:::o;31250:315::-;31405:8;-1:-1:-1;;;;;31396:17:0;:5;-1:-1:-1;;;;;31396:17:0;;;31388:55;;;;-1:-1:-1;;;31388:55:0;;21608:2:1;31388:55:0;;;21590:21:1;21647:2;21627:18;;;21620:30;21686:27;21666:18;;;21659:55;21731:18;;31388:55:0;21406:349:1;31388:55:0;-1:-1:-1;;;;;31454:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;31454:46:0;;;;;;;;;;31516:41;;540::1;;;31516::0;;513:18:1;31516:41:0;;;;;;;31250:315;;;:::o;26324:::-;26481:28;26491:4;26497:2;26501:7;26481:9;:28::i;:::-;26528:48;26551:4;26557:2;26561:7;26570:5;26528:22;:48::i;:::-;26520:111;;;;-1:-1:-1;;;26520:111:0;;;;;;;:::i;17018:723::-;17074:13;17295:10;17291:53;;-1:-1:-1;;17322:10:0;;;;;;;;;;;;-1:-1:-1;;;17322:10:0;;;;;17018:723::o;17291:53::-;17369:5;17354:12;17410:78;17417:9;;17410:78;;17443:8;;;;:::i;:::-;;-1:-1:-1;17466:10:0;;-1:-1:-1;17474:2:0;17466:10;;:::i;:::-;;;17410:78;;;17498:19;17530:6;17520:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17520:17:0;;17498:39;;17548:154;17555:10;;17548:154;;17582:11;17592:1;17582:11;;:::i;:::-;;-1:-1:-1;17651:10:0;17659:2;17651:5;:10;:::i;:::-;17638:24;;:2;:24;:::i;:::-;17625:39;;17608:6;17615;17608:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;17608:56:0;;;;;;;;-1:-1:-1;17679:11:0;17688:2;17679:11;;:::i;:::-;;;17548:154;;39393:589;-1:-1:-1;;;;;39599:18:0;;39595:187;;39634:40;39666:7;40809:10;:17;;40782:24;;;;:15;:24;;;;;:44;;;40837:24;;;;;;;;;;;;40705:164;39634:40;39595:187;;;39704:2;-1:-1:-1;;;;;39696:10:0;:4;-1:-1:-1;;;;;39696:10:0;;39692:90;;39723:47;39756:4;39762:7;39723:32;:47::i;:::-;-1:-1:-1;;;;;39796:16:0;;39792:183;;39829:45;39866:7;39829:36;:45::i;39792:183::-;39902:4;-1:-1:-1;;;;;39896:10:0;:2;-1:-1:-1;;;;;39896:10:0;;39892:83;;39923:40;39951:2;39955:7;39923:27;:40::i;28273:321::-;28403:18;28409:2;28413:7;28403:5;:18::i;:::-;28454:54;28485:1;28489:2;28493:7;28502:5;28454:22;:54::i;:::-;28432:154;;;;-1:-1:-1;;;28432:154:0;;;;;;;:::i;32130:799::-;32285:4;-1:-1:-1;;;;;32306:13:0;;8756:20;8804:8;32302:620;;32342:72;;-1:-1:-1;;;32342:72:0;;-1:-1:-1;;;;;32342:36:0;;;;;:72;;16521:10;;32393:4;;32399:7;;32408:5;;32342:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32342:72:0;;;;;;;;-1:-1:-1;;32342:72:0;;;;;;;;;;;;:::i;:::-;;;32338:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32584:13:0;;32580:272;;32627:60;;-1:-1:-1;;;32627:60:0;;;;;;;:::i;32580:272::-;32802:6;32796:13;32787:6;32783:2;32779:15;32772:38;32338:529;-1:-1:-1;;;;;;32465:51:0;-1:-1:-1;;;32465:51:0;;-1:-1:-1;32458:58:0;;32302:620;-1:-1:-1;32906:4:0;32130:799;;;;;;:::o;41496:988::-;41762:22;41812:1;41787:22;41804:4;41787:16;:22::i;:::-;:26;;;;:::i;:::-;41824:18;41845:26;;;:17;:26;;;;;;41762:51;;-1:-1:-1;41978:28:0;;;41974:328;;-1:-1:-1;;;;;42045:18:0;;42023:19;42045:18;;;:12;:18;;;;;;;;:34;;;;;;;;;42096:30;;;;;;:44;;;42213:30;;:17;:30;;;;;:43;;;41974:328;-1:-1:-1;42398:26:0;;;;:17;:26;;;;;;;;42391:33;;;-1:-1:-1;;;;;42442:18:0;;;;;:12;:18;;;;;:34;;;;;;;42435:41;41496:988::o;42779:1079::-;43057:10;:17;43032:22;;43057:21;;43077:1;;43057:21;:::i;:::-;43089:18;43110:24;;;:15;:24;;;;;;43483:10;:26;;43032:46;;-1:-1:-1;43110:24:0;;43032:46;;43483:26;;;;;;:::i;:::-;;;;;;;;;43461:48;;43547:11;43522:10;43533;43522:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;43627:28;;;:15;:28;;;;;;;:41;;;43799:24;;;;;43792:31;43834:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;42850:1008;;;42779:1079;:::o;40283:221::-;40368:14;40385:20;40402:2;40385:16;:20::i;:::-;-1:-1:-1;;;;;40416:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;40461:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;40283:221:0:o;28930:382::-;-1:-1:-1;;;;;29010:16:0;;29002:61;;;;-1:-1:-1;;;29002:61:0;;23646:2:1;29002:61:0;;;23628:21:1;;;23665:18;;;23658:30;23724:34;23704:18;;;23697:62;23776:18;;29002:61:0;23444:356:1;29002:61:0;27017:4;27041:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27041:16:0;:30;29074:58;;;;-1:-1:-1;;;29074:58:0;;24007:2:1;29074:58:0;;;23989:21:1;24046:2;24026:18;;;24019:30;24085;24065:18;;;24058:58;24133:18;;29074:58:0;23805:352:1;29074:58:0;29145:45;29174:1;29178:2;29182:7;29145:20;:45::i;:::-;-1:-1:-1;;;;;29203:13:0;;;;;;:9;:13;;;;;:18;;29220:1;;29203:13;:18;;29220:1;;29203:18;:::i;:::-;;;;-1:-1:-1;;29232:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;29232:21:0;-1:-1:-1;;;;;29232:21:0;;;;;;;;29271:33;;29232:16;;;29271:33;;29232:16;;29271:33;28930:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;:::-;384:5;150:245;-1:-1:-1;;;150:245:1:o;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:269::-;908:3;946:5;940:12;973:6;968:3;961:19;989:63;1045:6;1038:4;1033:3;1029:14;1022:4;1015:5;1011:16;989:63;:::i;:::-;1106:2;1085:15;-1:-1:-1;;1081:29:1;1072:39;;;;1113:4;1068:50;;855:269;-1:-1:-1;;855:269:1:o;1129:231::-;1278:2;1267:9;1260:21;1241:4;1298:56;1350:2;1339:9;1335:18;1327:6;1298:56;:::i;1365:180::-;1424:6;1477:2;1465:9;1456:7;1452:23;1448:32;1445:52;;;1493:1;1490;1483:12;1445:52;-1:-1:-1;1516:23:1;;1365:180;-1:-1:-1;1365:180:1:o;1758:173::-;1826:20;;-1:-1:-1;;;;;1875:31:1;;1865:42;;1855:70;;1921:1;1918;1911:12;1936:254;2004:6;2012;2065:2;2053:9;2044:7;2040:23;2036:32;2033:52;;;2081:1;2078;2071:12;2033:52;2104:29;2123:9;2104:29;:::i;:::-;2094:39;2180:2;2165:18;;;;2152:32;;-1:-1:-1;;;1936:254:1:o;2759:159::-;2826:20;;2886:6;2875:18;;2865:29;;2855:57;;2908:1;2905;2898:12;2923:184;2981:6;3034:2;3022:9;3013:7;3009:23;3005:32;3002:52;;;3050:1;3047;3040:12;3002:52;3073:28;3091:9;3073:28;:::i;3112:284::-;3170:6;3223:2;3211:9;3202:7;3198:23;3194:32;3191:52;;;3239:1;3236;3229:12;3191:52;3278:9;3265:23;3328:18;3321:5;3317:30;3310:5;3307:41;3297:69;;3362:1;3359;3352:12;3401:328;3478:6;3486;3494;3547:2;3535:9;3526:7;3522:23;3518:32;3515:52;;;3563:1;3560;3553:12;3515:52;3586:29;3605:9;3586:29;:::i;:::-;3576:39;;3634:38;3668:2;3657:9;3653:18;3634:38;:::i;:::-;3624:48;;3719:2;3708:9;3704:18;3691:32;3681:42;;3401:328;;;;;:::o;3734:258::-;3801:6;3809;3862:2;3850:9;3841:7;3837:23;3833:32;3830:52;;;3878:1;3875;3868:12;3830:52;3901:29;3920:9;3901:29;:::i;:::-;3891:39;;3949:37;3982:2;3971:9;3967:18;3949:37;:::i;:::-;3939:47;;3734:258;;;;;:::o;3997:127::-;4058:10;4053:3;4049:20;4046:1;4039:31;4089:4;4086:1;4079:15;4113:4;4110:1;4103:15;4129:275;4200:2;4194:9;4265:2;4246:13;;-1:-1:-1;;4242:27:1;4230:40;;4300:18;4285:34;;4321:22;;;4282:62;4279:88;;;4347:18;;:::i;:::-;4383:2;4376:22;4129:275;;-1:-1:-1;4129:275:1:o;4409:407::-;4474:5;4508:18;4500:6;4497:30;4494:56;;;4530:18;;:::i;:::-;4568:57;4613:2;4592:15;;-1:-1:-1;;4588:29:1;4619:4;4584:40;4568:57;:::i;:::-;4559:66;;4648:6;4641:5;4634:21;4688:3;4679:6;4674:3;4670:16;4667:25;4664:45;;;4705:1;4702;4695:12;4664:45;4754:6;4749:3;4742:4;4735:5;4731:16;4718:43;4808:1;4801:4;4792:6;4785:5;4781:18;4777:29;4770:40;4409:407;;;;;:::o;4821:451::-;4890:6;4943:2;4931:9;4922:7;4918:23;4914:32;4911:52;;;4959:1;4956;4949:12;4911:52;4999:9;4986:23;5032:18;5024:6;5021:30;5018:50;;;5064:1;5061;5054:12;5018:50;5087:22;;5140:4;5132:13;;5128:27;-1:-1:-1;5118:55:1;;5169:1;5166;5159:12;5118:55;5192:74;5258:7;5253:2;5240:16;5235:2;5231;5227:11;5192:74;:::i;5277:186::-;5336:6;5389:2;5377:9;5368:7;5364:23;5360:32;5357:52;;;5405:1;5402;5395:12;5357:52;5428:29;5447:9;5428:29;:::i;5468:248::-;5536:6;5544;5597:2;5585:9;5576:7;5572:23;5568:32;5565:52;;;5613:1;5610;5603:12;5565:52;-1:-1:-1;;5636:23:1;;;5706:2;5691:18;;;5678:32;;-1:-1:-1;5468:248:1:o;5721:347::-;5786:6;5794;5847:2;5835:9;5826:7;5822:23;5818:32;5815:52;;;5863:1;5860;5853:12;5815:52;5886:29;5905:9;5886:29;:::i;:::-;5876:39;;5965:2;5954:9;5950:18;5937:32;6012:5;6005:13;5998:21;5991:5;5988:32;5978:60;;6034:1;6031;6024:12;5978:60;6057:5;6047:15;;;5721:347;;;;;:::o;6278:667::-;6373:6;6381;6389;6397;6450:3;6438:9;6429:7;6425:23;6421:33;6418:53;;;6467:1;6464;6457:12;6418:53;6490:29;6509:9;6490:29;:::i;:::-;6480:39;;6538:38;6572:2;6561:9;6557:18;6538:38;:::i;:::-;6528:48;;6623:2;6612:9;6608:18;6595:32;6585:42;;6678:2;6667:9;6663:18;6650:32;6705:18;6697:6;6694:30;6691:50;;;6737:1;6734;6727:12;6691:50;6760:22;;6813:4;6805:13;;6801:27;-1:-1:-1;6791:55:1;;6842:1;6839;6832:12;6791:55;6865:74;6931:7;6926:2;6913:16;6908:2;6904;6900:11;6865:74;:::i;:::-;6855:84;;;6278:667;;;;;;;:::o;6950:269::-;7007:6;7060:2;7048:9;7039:7;7035:23;7031:32;7028:52;;;7076:1;7073;7066:12;7028:52;7115:9;7102:23;7165:4;7158:5;7154:16;7147:5;7144:27;7134:55;;7185:1;7182;7175:12;7224:260;7292:6;7300;7353:2;7341:9;7332:7;7328:23;7324:32;7321:52;;;7369:1;7366;7359:12;7321:52;7392:29;7411:9;7392:29;:::i;:::-;7382:39;;7440:38;7474:2;7463:9;7459:18;7440:38;:::i;7489:952::-;7573:6;7604:2;7647;7635:9;7626:7;7622:23;7618:32;7615:52;;;7663:1;7660;7653:12;7615:52;7703:9;7690:23;7732:18;7773:2;7765:6;7762:14;7759:34;;;7789:1;7786;7779:12;7759:34;7827:6;7816:9;7812:22;7802:32;;7872:7;7865:4;7861:2;7857:13;7853:27;7843:55;;7894:1;7891;7884:12;7843:55;7930:2;7917:16;7952:2;7948;7945:10;7942:36;;;7958:18;;:::i;:::-;8004:2;8001:1;7997:10;7987:20;;8027:28;8051:2;8047;8043:11;8027:28;:::i;:::-;8089:15;;;8159:11;;;8155:20;;;8120:12;;;;8187:19;;;8184:39;;;8219:1;8216;8209:12;8184:39;8243:11;;;;8263:148;8279:6;8274:3;8271:15;8263:148;;;8345:23;8364:3;8345:23;:::i;:::-;8333:36;;8296:12;;;;8389;;;;8263:148;;;8430:5;7489:952;-1:-1:-1;;;;;;;;7489:952:1:o;8446:380::-;8525:1;8521:12;;;;8568;;;8589:61;;8643:4;8635:6;8631:17;8621:27;;8589:61;8696:2;8688:6;8685:14;8665:18;8662:38;8659:161;;;8742:10;8737:3;8733:20;8730:1;8723:31;8777:4;8774:1;8767:15;8805:4;8802:1;8795:15;8659:161;;8446:380;;;:::o;8831:356::-;9033:2;9015:21;;;9052:18;;;9045:30;9111:34;9106:2;9091:18;;9084:62;9178:2;9163:18;;8831:356::o;10432:413::-;10634:2;10616:21;;;10673:2;10653:18;;;10646:30;10712:34;10707:2;10692:18;;10685:62;-1:-1:-1;;;10778:2:1;10763:18;;10756:47;10835:3;10820:19;;10432:413::o;11967:127::-;12028:10;12023:3;12019:20;12016:1;12009:31;12059:4;12056:1;12049:15;12083:4;12080:1;12073:15;12099:224;12138:3;12166:6;12199:2;12196:1;12192:10;12229:2;12226:1;12222:10;12260:3;12256:2;12252:12;12247:3;12244:21;12241:47;;;12268:18;;:::i;:::-;12304:13;;12099:224;-1:-1:-1;;;;12099:224:1:o;12328:417::-;12530:2;12512:21;;;12569:2;12549:18;;;12542:30;12608:34;12603:2;12588:18;;12581:62;-1:-1:-1;;;12674:2:1;12659:18;;12652:51;12735:3;12720:19;;12328:417::o;12750:217::-;12789:4;12818:6;12874:10;;;;12844;;12896:12;;;12893:38;;;12911:18;;:::i;:::-;12948:13;;12750:217;-1:-1:-1;;;12750:217:1:o;13385:127::-;13446:10;13441:3;13437:20;13434:1;13427:31;13477:4;13474:1;13467:15;13501:4;13498:1;13491:15;15049:128;15089:3;15120:1;15116:6;15113:1;15110:13;15107:39;;;15126:18;;:::i;:::-;-1:-1:-1;15162:9:1;;15049:128::o;15182:403::-;15384:2;15366:21;;;15423:2;15403:18;;;15396:30;15462:34;15457:2;15442:18;;15435:62;-1:-1:-1;;;15528:2:1;15513:18;;15506:37;15575:3;15560:19;;15182:403::o;16008:410::-;16210:2;16192:21;;;16249:2;16229:18;;;16222:30;16288:34;16283:2;16268:18;;16261:62;-1:-1:-1;;;16354:2:1;16339:18;;16332:44;16408:3;16393:19;;16008:410::o;16423:168::-;16463:7;16529:1;16525;16521:6;16517:14;16514:1;16511:21;16506:1;16499:9;16492:17;16488:45;16485:71;;;16536:18;;:::i;:::-;-1:-1:-1;16576:9:1;;16423:168::o;18132:185::-;18174:3;18212:5;18206:12;18227:52;18272:6;18267:3;18260:4;18253:5;18249:16;18227:52;:::i;:::-;18295:16;;;;;18132:185;-1:-1:-1;;18132:185:1:o;18322:1174::-;18498:3;18527:1;18560:6;18554:13;18590:3;18612:1;18640:9;18636:2;18632:18;18622:28;;18700:2;18689:9;18685:18;18722;18712:61;;18766:4;18758:6;18754:17;18744:27;;18712:61;18792:2;18840;18832:6;18829:14;18809:18;18806:38;18803:165;;;-1:-1:-1;;;18867:33:1;;18923:4;18920:1;18913:15;18953:4;18874:3;18941:17;18803:165;18984:18;19011:104;;;;19129:1;19124:320;;;;18977:467;;19011:104;-1:-1:-1;;19044:24:1;;19032:37;;19089:16;;;;-1:-1:-1;19011:104:1;;19124:320;18079:1;18072:14;;;18116:4;18103:18;;19219:1;19233:165;19247:6;19244:1;19241:13;19233:165;;;19325:14;;19312:11;;;19305:35;19368:16;;;;19262:10;;19233:165;;;19237:3;;19427:6;19422:3;19418:16;19411:23;;18977:467;;;;;;;19460:30;19486:3;19478:6;19460:30;:::i;:::-;19453:37;18322:1174;-1:-1:-1;;;;;18322:1174:1:o;19908:135::-;19947:3;-1:-1:-1;;19968:17:1;;19965:43;;;19988:18;;:::i;:::-;-1:-1:-1;20035:1:1;20024:13;;19908:135::o;21276:125::-;21316:4;21344:1;21341;21338:8;21335:34;;;21349:18;;:::i;:::-;-1:-1:-1;21386:9:1;;21276:125::o;21760:414::-;21962:2;21944:21;;;22001:2;21981:18;;;21974:30;22040:34;22035:2;22020:18;;22013:62;-1:-1:-1;;;22106:2:1;22091:18;;22084:48;22164:3;22149:19;;21760:414::o;22179:127::-;22240:10;22235:3;22231:20;22228:1;22221:31;22271:4;22268:1;22261:15;22295:4;22292:1;22285:15;22311:120;22351:1;22377;22367:35;;22382:18;;:::i;:::-;-1:-1:-1;22416:9:1;;22311:120::o;22436:112::-;22468:1;22494;22484:35;;22499:18;;:::i;:::-;-1:-1:-1;22533:9:1;;22436:112::o;22553:500::-;-1:-1:-1;;;;;22822:15:1;;;22804:34;;22874:15;;22869:2;22854:18;;22847:43;22921:2;22906:18;;22899:34;;;22969:3;22964:2;22949:18;;22942:31;;;22747:4;;22990:57;;23027:19;;23019:6;22990:57;:::i;:::-;22982:65;22553:500;-1:-1:-1;;;;;;22553:500:1:o;23058:249::-;23127:6;23180:2;23168:9;23159:7;23155:23;23151:32;23148:52;;;23196:1;23193;23186:12;23148:52;23228:9;23222:16;23247:30;23271:5;23247:30;:::i;23312:127::-;23373:10;23368:3;23364:20;23361:1;23354:31;23404:4;23401:1;23394:15;23428:4;23425:1;23418:15

Swarm Source

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