ETH Price: $3,441.24 (-1.34%)
Gas: 10 Gwei

Token

Chill Bear Club Avatars (CBCA)
 

Overview

Max Total Supply

1,380 CBCA

Holders

303

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
0xyotsuba.eth
Balance
1 CBCA
0x421388a1c547575c614e544f808021d580688263
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:
ChillBearAvatars

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 10000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-08-15
*/

// File: ChillBearStaking.sol

pragma solidity ^0.8.0;

abstract contract ChillBearStaking {
    function getTokenOwner(uint256 tokenId) public view virtual returns (address);
}

// File: OwnableDelegateProxy.sol

pragma solidity ^0.8.0;

contract OwnableDelegateProxy {}
// File: ProxyRegistry.sol



pragma solidity ^0.8.0;

contract ProxyRegistry {
    mapping(address => OwnableDelegateProxy) public proxies;
}
// File: @openzeppelin/contracts/utils/Strings.sol


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

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


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 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
                /// @solidity memory-safe-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.1 (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/access/Ownable.sol


// OpenZeppelin Contracts (last updated v4.7.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 Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        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: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts (last updated v4.6.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 `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

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


// OpenZeppelin Contracts v4.4.1 (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/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (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/IERC721.sol


// OpenZeppelin Contracts (last updated v4.7.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`.
     *
     * 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;

    /**
     * @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 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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

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


// OpenZeppelin Contracts v4.4.1 (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: ERC721.sol











pragma solidity ^0.8.0;

contract ERC721 is ERC165, IERC721, IERC721Metadata, Ownable {
    using Address for address;
    using Strings for uint256;

    uint16 public totalSupply;

    address public proxyRegistryAddress;

    string public baseURI;

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

    // Mapping owner address to token count
    mapping(address => uint256) internal _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;


    constructor(address _openseaProxyRegistry, string memory _baseURI) {
        proxyRegistryAddress = _openseaProxyRegistry;
        baseURI = _baseURI;
    }

    /**
     * @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) external view 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 override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    function ownsNFT(uint256 tokenId, address owner) internal view returns (bool) {
        return _owners[tokenId] == owner;
    }

    function nftExists(uint256 tokenId) public view returns (bool) {
        return _owners[tokenId] != address(0);
    }

    function nftExistsList(uint256[] memory tokenIds) public view returns (bool[] memory) {
        bool[] memory response = new bool[](tokenIds.length);
        for (uint256 i = 0; i < tokenIds.length; i++) {
            response[i] = _owners[tokenIds[i]] != address(0);
        }
        return response;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() external pure override returns (string memory) {
        return "Chill Bear Club Avatars";
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() external pure override returns (string memory) {
        return "CBCA";
    }

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

        return string(abi.encodePacked(baseURI, tokenId.toString(), ".json"));
    }

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

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

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view 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) external override {
        _setApprovalForAll(msg.sender, operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view override returns (bool) {
        // Whitelist OpenSea proxy contract for easy trading.
        ProxyRegistry proxyRegistry = ProxyRegistry(proxyRegistryAddress);
        if (address(proxyRegistry.proxies(owner)) == operator) {
            return true;
        }

        return _operatorApprovals[owner][operator];
    }

    function setOpenseaProxyRegistry(address addr) external onlyOwner {
        proxyRegistryAddress = addr;
    }

    function setBaseURI(string calldata _baseURI) external onlyOwner {
        baseURI = _baseURI;
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(msg.sender, 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
    ) external override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override {
        require(_isApprovedOrOwner(msg.sender, 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
     */
    function _exists(uint256 tokenId) public 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 = _owners[tokenId];
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    function _mintTokenIds(address to, uint256[] memory tokenIds) internal {
        for (uint256 i = 0; i < tokenIds.length; i++) {
            uint256 tokenId = tokenIds[i];
            _owners[tokenId] = to;
            emit Transfer(address(0), to, tokenId);
            require(
                _checkOnERC721Received(address(0), to, tokenId, ""),
                "ERC721: transfer to non ERC721Receiver implementer"
            );
            _balances[to]++;
            totalSupply++;
        }
    }

    /**
     * @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(_owners[tokenId] == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

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

        _balances[from]--;
        _balances[to]++;

        _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(msg.sender, 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;
        }
    }

}
// File: @openzeppelin/contracts/interfaces/IERC2981.sol


// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

// File: ChillBearAvatars.sol





pragma solidity ^0.8.0;

contract ChillBearAvatars is IERC2981, ERC721 {

    address public nftContract;
    address public stakingContract;

    ERC721 public nftERC721;
    ChillBearStaking public stakingERC721;

    bool public _mintingEnabled;
    uint256 private _supply;
    uint256 private _supplyLeft;

    uint private _EIP2981RoyaltyPercentage;

    event EIP2981RoyaltyPercentageChanged(uint indexed prevRoyalty, uint indexed newRoyalty);

    constructor(
        address _openseaProxyRegistry,
        address _nftContract,
        address _stakingContract,
        uint EIP2981RoyaltyPercentage,
        string memory _baseURI
    ) ERC721(_openseaProxyRegistry, _baseURI) {
        require(EIP2981RoyaltyPercentage <= 1000, "Royalty cannot be more than 10 percent");
        _EIP2981RoyaltyPercentage = EIP2981RoyaltyPercentage;
        
        nftContract = _nftContract;
        stakingContract = _stakingContract;
        nftERC721 = ERC721(nftContract);
        stakingERC721 = ChillBearStaking(stakingContract);

        _supply = nftERC721.totalSupply();
        _supplyLeft = _supply;
        _mintingEnabled = false;
    }

    function getMintingInfo() external view returns(
        uint mintSupply,
        uint EIP2981RoyaltyPercentage
    ) {
        mintSupply = _supply;
        EIP2981RoyaltyPercentage = _EIP2981RoyaltyPercentage;
    }

    /**
     * @notice In basis points (parts per 10K). Eg. 500 = 5%
     */
    function setEIP2981RoyaltyPercentage(uint percentage) external onlyOwner {
        require(percentage <= 1000, "royalty cannot be more than 10 percent");
        uint prev = _EIP2981RoyaltyPercentage;
        _EIP2981RoyaltyPercentage = percentage;
        emit EIP2981RoyaltyPercentageChanged(prev, percentage);
    }

    function mint(uint256[] memory tokenIds) external {
        require(_mintingEnabled, "Minting is not enabled!");

        for (uint256 i = 0; i < tokenIds.length; i++) {
            uint256 tokenId = tokenIds[i];
            require(!_exists(tokenId), "Avatar must not be minted yet!");
            bool ownsNFT = nftERC721.ownerOf(tokenId) == msg.sender;
            bool ownsStaking = stakingERC721.getTokenOwner(tokenId) == msg.sender;
            require(ownsNFT || ownsStaking, "Must own all tokens to mint!");
        }

        _supplyLeft -= tokenIds.length;
        _mintTokenIds(msg.sender, tokenIds);
    }

    /**
     * @notice returns royalty info for EIP2981 supporting marketplaces
     * @dev Called with the sale price to determine how much royalty is owed and to whom.
     * @param tokenId - the NFT asset queried for royalty information
     * @param salePrice - the sale price of the NFT asset specified by `tokenId`
     * @return receiver - address of who should be sent the royalty payment
     * @return royaltyAmount - the royalty payment amount for `salePrice`
     */
    function royaltyInfo(uint tokenId, uint salePrice) external view override returns(address receiver, uint256 royaltyAmount) {
        require(_exists(tokenId), "Royality querry for non-existant token!");
        return(owner(), salePrice * _EIP2981RoyaltyPercentage / 10000);
    }

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

    function withdraw() onlyOwner external {
        (bool success, ) = payable(msg.sender).call{value: address(this).balance, gas: 2600}("");
        require(success, "Failed to withdraw payment!");
    }

    /**
     * @notice toggles the public mint.
     * @dev enables/disables the mint functionality for this contract.
     */
    function toggleMint() external onlyOwner {
        _mintingEnabled = !_mintingEnabled;
    }

    function tokensOfOwner(address owner) external view returns(uint[] memory) {
        uint[] memory tokens = new uint[](_balances[owner]);
        uint y = _supply + 1;
        uint x;

        for (uint i = 1; i < y; i++) {
            if (ownsNFT(i, owner)) {
                tokens[x] = i;
                x++;
            }
        }
        return tokens;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_openseaProxyRegistry","type":"address"},{"internalType":"address","name":"_nftContract","type":"address"},{"internalType":"address","name":"_stakingContract","type":"address"},{"internalType":"uint256","name":"EIP2981RoyaltyPercentage","type":"uint256"},{"internalType":"string","name":"_baseURI","type":"string"}],"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":"uint256","name":"prevRoyalty","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"newRoyalty","type":"uint256"}],"name":"EIP2981RoyaltyPercentageChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"_exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_mintingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintingInfo","outputs":[{"internalType":"uint256","name":"mintSupply","type":"uint256"},{"internalType":"uint256","name":"EIP2981RoyaltyPercentage","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":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"nftContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftERC721","outputs":[{"internalType":"contract ERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"nftExists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"nftExistsList","outputs":[{"internalType":"bool[]","name":"","type":"bool[]"}],"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":"proxyRegistryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"percentage","type":"uint256"}],"name":"setEIP2981RoyaltyPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setOpenseaProxyRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingERC721","outputs":[{"internalType":"contract ChillBearStaking","name":"","type":"address"}],"stateMutability":"view","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":"pure","type":"function"},{"inputs":[],"name":"toggleMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060405162002e0938038062002e098339810160408190526200003491620002cb565b84816200004133620001b8565b600180546001600160a01b0319166001600160a01b03841617905580516200007190600290602084019062000208565b5050506103e8821115620000da5760405162461bcd60e51b815260206004820152602660248201527f526f79616c74792063616e6e6f74206265206d6f7265207468616e2031302070604482015265195c98d95b9d60d21b606482015260840160405180910390fd5b600d829055600780546001600160a01b038087166001600160a01b03199283168117909355600880549187169183168217905560098054831684179055600a8054909216179055604080516318160ddd60e01b815290516318160ddd91600481810192602092909190829003018186803b1580156200015857600080fd5b505afa1580156200016d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001939190620003ec565b61ffff16600b819055600c555050600a805460ff60a01b19169055506200046c915050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054620002169062000419565b90600052602060002090601f0160209004810192826200023a576000855562000285565b82601f106200025557805160ff191683800117855562000285565b8280016001018555821562000285579182015b828111156200028557825182559160200191906001019062000268565b506200029392915062000297565b5090565b5b8082111562000293576000815560010162000298565b80516001600160a01b0381168114620002c657600080fd5b919050565b600080600080600060a08688031215620002e457600080fd5b620002ef86620002ae565b9450602062000300818801620002ae565b94506200031060408801620002ae565b6060880151608089015191955093506001600160401b03808211156200033557600080fd5b818901915089601f8301126200034a57600080fd5b8151818111156200035f576200035f62000456565b604051601f8201601f19908116603f011681019083821181831017156200038a576200038a62000456565b816040528281528c86848701011115620003a357600080fd5b600093505b82841015620003c75784840186015181850187015292850192620003a8565b82841115620003d95760008684830101525b8096505050505050509295509295909350565b600060208284031215620003ff57600080fd5b815161ffff811681146200041257600080fd5b9392505050565b600181811c908216806200042e57607f821691505b602082108114156200045057634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b61298d806200047c6000396000f3fe608060405234801561001057600080fd5b506004361061025c5760003560e01c80638462151c11610145578063cd7c0326116100bd578063ee99205c1161008c578063f8e76cc011610071578063f8e76cc014610537578063f8e93ef9146105c9578063ffa7041e146105dc57600080fd5b8063ee99205c146105a3578063f2fde38b146105b657600080fd5b8063cd7c032614610562578063d3dd5fe014610575578063d56d229d1461057d578063e985e9c51461059057600080fd5b8063b88d4fde11610114578063c54084a3116100f9578063c54084a314610504578063c87b56dd14610524578063cb6205e41461053757600080fd5b8063b88d4fde146104de578063bd2f5244146104f157600080fd5b80638462151c146104615780638da5cb5b1461048157806395d89b4114610492578063a22cb465146104cb57600080fd5b806342842e0e116101d85780636cafd0df116101a7578063715018a61161018c578063715018a6146104215780637d963e351461042957806381b2069b1461043c57600080fd5b80636cafd0df146103e557806370a082311461040057600080fd5b806342842e0e146103a457806355f804b3146103b75780636352211e146103ca5780636c0360eb146103dd57600080fd5b8063095ea7b31161022f57806323b872dd1161021457806323b872dd146103575780632a55205a1461036a5780633ccfd60b1461039c57600080fd5b8063095ea7b31461030b57806318160ddd1461031e57600080fd5b806301ffc9a71461026157806306fdde0314610289578063081812fc146102cb5780630913d984146102f6575b600080fd5b61027461026f366004612341565b6105ef565b60405190151581526020015b60405180910390f35b60408051808201909152601781527f4368696c6c204265617220436c7562204176617461727300000000000000000060208201525b6040516102809190612652565b6102de6102d93660046123ed565b61064b565b6040516001600160a01b039091168152602001610280565b6103096103043660046123ed565b6106f6565b005b610309610319366004612268565b6107af565b6000546103449074010000000000000000000000000000000000000000900461ffff1681565b60405161ffff9091168152602001610280565b610309610365366004612112565b6108de565b61037d610378366004612406565b610965565b604080516001600160a01b039093168352602083019190915201610280565b610309610a23565b6103096103b2366004612112565b610acb565b6103096103c536600461237b565b610ae6565b6102de6103d83660046123ed565b610afa565b6102be610b85565b600b54600d5460408051928352602083019190915201610280565b61041361040e366004612098565b610c13565b604051908152602001610280565b610309610cad565b600a546102de906001600160a01b031681565b600a546102749074010000000000000000000000000000000000000000900460ff1681565b61047461046f366004612098565b610cc1565b604051610280919061261a565b6000546001600160a01b03166102de565b60408051808201909152600481527f434243410000000000000000000000000000000000000000000000000000000060208201526102be565b6103096104d9366004612235565b610dac565b6103096104ec366004612153565b610dbb565b6103096104ff366004612098565b610e49565b610517610512366004612294565b610e8b565b60405161028091906125d4565b6102be6105323660046123ed565b610f72565b6102746105453660046123ed565b6000908152600360205260409020546001600160a01b0316151590565b6001546102de906001600160a01b031681565b610309611031565b6007546102de906001600160a01b031681565b61027461059e3660046120d9565b611086565b6008546102de906001600160a01b031681565b6103096105c4366004612098565b61116d565b6103096105d7366004612294565b6111fa565b6009546102de906001600160a01b031681565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a0000000000000000000000000000000000000000000000000000000014806106455750610645826114d4565b92915050565b6000818152600360205260408120546001600160a01b03166106da5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b6106fe6115b7565b6103e88111156107765760405162461bcd60e51b815260206004820152602660248201527f726f79616c74792063616e6e6f74206265206d6f7265207468616e203130207060448201527f657263656e74000000000000000000000000000000000000000000000000000060648201526084016106d1565b600d805490829055604051829082907fb4fb93f70c244a4a5ccc896856ac486b87475e23f8050e29a7c790c456cbddc590600090a35050565b6000818152600360205260409020546001600160a01b039081169083168114156108415760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084016106d1565b336001600160a01b038216148061085d575061085d8133611086565b6108cf5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016106d1565b6108d98383611611565b505050565b6108e83382611697565b61095a5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016106d1565b6108d983838361177c565b60008281526003602052604081205481906001600160a01b03166109f15760405162461bcd60e51b815260206004820152602760248201527f526f79616c6974792071756572727920666f72206e6f6e2d6578697374616e7460448201527f20746f6b656e210000000000000000000000000000000000000000000000000060648201526084016106d1565b6000546001600160a01b0316612710600d5485610a0e91906126e0565b610a1891906126cc565b915091509250929050565b610a2b6115b7565b6040516000903390610a2890479084818181858888f193505050503d8060008114610a72576040519150601f19603f3d011682016040523d82523d6000602084013e610a77565b606091505b5050905080610ac85760405162461bcd60e51b815260206004820152601b60248201527f4661696c656420746f207769746864726177207061796d656e7421000000000060448201526064016106d1565b50565b6108d983838360405180602001604052806000815250610dbb565b610aee6115b7565b6108d960028383611fe1565b6000818152600360205260408120546001600160a01b0316806106455760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e000000000000000000000000000000000000000000000060648201526084016106d1565b60028054610b9290612795565b80601f0160208091040260200160405190810160405280929190818152602001828054610bbe90612795565b8015610c0b5780601f10610be057610100808354040283529160200191610c0b565b820191906000526020600020905b815481529060010190602001808311610bee57829003601f168201915b505050505081565b60006001600160a01b038216610c915760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f20616464726573730000000000000000000000000000000000000000000060648201526084016106d1565b506001600160a01b031660009081526004602052604090205490565b610cb56115b7565b610cbf6000611957565b565b6001600160a01b0381166000908152600460205260408120546060919067ffffffffffffffff811115610cf657610cf66128e5565b604051908082528060200260200182016040528015610d1f578160200160208202803683370190505b5090506000600b546001610d3391906126b4565b9050600060015b82811015610da2576000818152600360205260409020546001600160a01b0387811691161415610d905780848381518110610d7757610d776128b6565b602090810291909101015281610d8c8161280b565b9250505b80610d9a8161280b565b915050610d3a565b5091949350505050565b610db73383836119bf565b5050565b610dc53383611697565b610e375760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016106d1565b610e4384848484611aac565b50505050565b610e516115b7565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60606000825167ffffffffffffffff811115610ea957610ea96128e5565b604051908082528060200260200182016040528015610ed2578160200160208202803683370190505b50905060005b8351811015610f6b5760006001600160a01b031660036000868481518110610f0257610f026128b6565b6020026020010151815260200190815260200160002060009054906101000a90046001600160a01b03166001600160a01b03161415828281518110610f4957610f496128b6565b9115156020928302919091019091015280610f638161280b565b915050610ed8565b5092915050565b6000818152600360205260409020546060906001600160a01b0316610fff5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e000000000000000000000000000000000060648201526084016106d1565b600261100a83611b35565b60405160200161101b92919061248e565b6040516020818303038152906040529050919050565b6110396115b7565b600a80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff8116740100000000000000000000000000000000000000009182900460ff1615909102179055565b6001546040517fc45527910000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015260009281169190841690829063c45527919060240160206040518083038186803b1580156110ec57600080fd5b505afa158015611100573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112491906120bc565b6001600160a01b0316141561113d576001915050610645565b50506001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b6111756115b7565b6001600160a01b0381166111f15760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016106d1565b610ac881611957565b600a5474010000000000000000000000000000000000000000900460ff166112645760405162461bcd60e51b815260206004820152601760248201527f4d696e74696e67206973206e6f7420656e61626c65642100000000000000000060448201526064016106d1565b60005b81518110156114b0576000828281518110611284576112846128b6565b602002602001015190506112af816000908152600360205260409020546001600160a01b0316151590565b156112fc5760405162461bcd60e51b815260206004820152601e60248201527f417661746172206d757374206e6f74206265206d696e7465642079657421000060448201526064016106d1565b6009546040517f6352211e0000000000000000000000000000000000000000000000000000000081526004810183905260009133916001600160a01b0390911690636352211e9060240160206040518083038186803b15801561135e57600080fd5b505afa158015611372573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061139691906120bc565b600a546040517fa5cd761f000000000000000000000000000000000000000000000000000000008152600481018690526001600160a01b0392831693909314935060009233929091169063a5cd761f9060240160206040518083038186803b15801561140157600080fd5b505afa158015611415573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061143991906120bc565b6001600160a01b0316149050818061144e5750805b61149a5760405162461bcd60e51b815260206004820152601c60248201527f4d757374206f776e20616c6c20746f6b656e7320746f206d696e74210000000060448201526064016106d1565b50505080806114a89061280b565b915050611267565b508051600c60008282546114c4919061271d565b90915550610ac890503382611c67565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061156757507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061064557507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610645565b6000546001600160a01b03163314610cbf5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106d1565b600081815260056020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038416908117909155819061165e82610afa565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600360205260408120546001600160a01b03166117215760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084016106d1565b6000828152600360205260409020546001600160a01b039081169084168114806117645750836001600160a01b03166117598461064b565b6001600160a01b0316145b8061177457506117748185611086565b949350505050565b6000818152600360205260409020546001600160a01b0384811691161461180b5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e657200000000000000000000000000000000000000000000000000000060648201526084016106d1565b6001600160a01b0382166118865760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016106d1565b611891600082611611565b6001600160a01b03831660009081526004602052604081208054916118b583612760565b90915550506001600160a01b03821660009081526004602052604081208054916118de8361280b565b909155505060008181526003602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b816001600160a01b0316836001600160a01b03161415611a215760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016106d1565b6001600160a01b0383811660008181526006602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611ab784848461177c565b611ac384848484611e16565b610e435760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016106d1565b606081611b7557505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115611b9f5780611b898161280b565b9150611b989050600a836126cc565b9150611b79565b60008167ffffffffffffffff811115611bba57611bba6128e5565b6040519080825280601f01601f191660200182016040528015611be4576020820181803683370190505b5090505b841561177457611bf960018361271d565b9150611c06600a86612844565b611c119060306126b4565b60f81b818381518110611c2657611c266128b6565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611c60600a866126cc565b9450611be8565b60005b81518110156108d9576000828281518110611c8757611c876128b6565b60209081029190910181015160008181526003909252604080832080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0389169081179091559051919350839290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4611d206000858360405180602001604052806000815250611e16565b611d925760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016106d1565b6001600160a01b0384166000908152600460205260408120805491611db68361280b565b90915550506000805474010000000000000000000000000000000000000000900461ffff16906014611de7836127e9565b91906101000a81548161ffff021916908361ffff16021790555050508080611e0e9061280b565b915050611c6a565b60006001600160a01b0384163b15611fd6576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a0290611e73903390899088908890600401612598565b602060405180830381600087803b158015611e8d57600080fd5b505af1925050508015611edb575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611ed89181019061235e565b60015b611f8b573d808015611f09576040519150601f19603f3d011682016040523d82523d6000602084013e611f0e565b606091505b508051611f835760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016106d1565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050611774565b506001949350505050565b828054611fed90612795565b90600052602060002090601f01602090048101928261200f5760008555612073565b82601f10612046578280017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00823516178555612073565b82800160010185558215612073579182015b82811115612073578235825591602001919060010190612058565b5061207f929150612083565b5090565b5b8082111561207f5760008155600101612084565b6000602082840312156120aa57600080fd5b81356120b581612914565b9392505050565b6000602082840312156120ce57600080fd5b81516120b581612914565b600080604083850312156120ec57600080fd5b82356120f781612914565b9150602083013561210781612914565b809150509250929050565b60008060006060848603121561212757600080fd5b833561213281612914565b9250602084013561214281612914565b929592945050506040919091013590565b6000806000806080858703121561216957600080fd5b843561217481612914565b935060208581013561218581612914565b935060408601359250606086013567ffffffffffffffff808211156121a957600080fd5b818801915088601f8301126121bd57600080fd5b8135818111156121cf576121cf6128e5565b6121ff847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601612665565b9150808252898482850101111561221557600080fd5b808484018584013760008482840101525080935050505092959194509250565b6000806040838503121561224857600080fd5b823561225381612914565b91506020830135801515811461210757600080fd5b6000806040838503121561227b57600080fd5b823561228681612914565b946020939093013593505050565b600060208083850312156122a757600080fd5b823567ffffffffffffffff808211156122bf57600080fd5b818501915085601f8301126122d357600080fd5b8135818111156122e5576122e56128e5565b8060051b91506122f6848301612665565b8181528481019084860184860187018a101561231157600080fd5b600095505b83861015612334578035835260019590950194918601918601612316565b5098975050505050505050565b60006020828403121561235357600080fd5b81356120b581612929565b60006020828403121561237057600080fd5b81516120b581612929565b6000806020838503121561238e57600080fd5b823567ffffffffffffffff808211156123a657600080fd5b818501915085601f8301126123ba57600080fd5b8135818111156123c957600080fd5b8660208285010111156123db57600080fd5b60209290920196919550909350505050565b6000602082840312156123ff57600080fd5b5035919050565b6000806040838503121561241957600080fd5b50508035926020909101359150565b60008151808452612440816020860160208601612734565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60008151612484818560208601612734565b9290920192915050565b600080845481600182811c9150808316806124aa57607f831692505b60208084108214156124e3577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b8180156124f7576001811461252657612553565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00861689528489019650612553565b60008b81526020902060005b8681101561254b5781548b820152908501908301612532565b505084890196505b50505050505061258f6125668286612472565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000815260050190565b95945050505050565b60006001600160a01b038087168352808616602084015250836040830152608060608301526125ca6080830184612428565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561260e5783511515835292840192918401916001016125f0565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561260e57835183529284019291840191600101612636565b6020815260006120b56020830184612428565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156126ac576126ac6128e5565b604052919050565b600082198211156126c7576126c7612858565b500190565b6000826126db576126db612887565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561271857612718612858565b500290565b60008282101561272f5761272f612858565b500390565b60005b8381101561274f578181015183820152602001612737565b83811115610e435750506000910152565b60008161276f5761276f612858565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b600181811c908216806127a957607f821691505b602082108114156127e3577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600061ffff8083168181141561280157612801612858565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561283d5761283d612858565b5060010190565b60008261285357612853612887565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6001600160a01b0381168114610ac857600080fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081168114610ac857600080fdfea2646970667358221220d2dc6adb134573b54aac4c2e65402630cd9e4a7f48d2a45f4bfbf8c6dcdd530564736f6c63430008070033000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1000000000000000000000000c7b76846de3db54db45c8b5debcabff4b0834f7800000000000000000000000060d4a9cb8adce7ae0a8d4f110d31ee6f5e56e99600000000000000000000000000000000000000000000000000000000000002ee00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002968747470733a2f2f617661746172732e6170692e6368696c6c626561722e636c75622f746f6b656e2f0000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061025c5760003560e01c80638462151c11610145578063cd7c0326116100bd578063ee99205c1161008c578063f8e76cc011610071578063f8e76cc014610537578063f8e93ef9146105c9578063ffa7041e146105dc57600080fd5b8063ee99205c146105a3578063f2fde38b146105b657600080fd5b8063cd7c032614610562578063d3dd5fe014610575578063d56d229d1461057d578063e985e9c51461059057600080fd5b8063b88d4fde11610114578063c54084a3116100f9578063c54084a314610504578063c87b56dd14610524578063cb6205e41461053757600080fd5b8063b88d4fde146104de578063bd2f5244146104f157600080fd5b80638462151c146104615780638da5cb5b1461048157806395d89b4114610492578063a22cb465146104cb57600080fd5b806342842e0e116101d85780636cafd0df116101a7578063715018a61161018c578063715018a6146104215780637d963e351461042957806381b2069b1461043c57600080fd5b80636cafd0df146103e557806370a082311461040057600080fd5b806342842e0e146103a457806355f804b3146103b75780636352211e146103ca5780636c0360eb146103dd57600080fd5b8063095ea7b31161022f57806323b872dd1161021457806323b872dd146103575780632a55205a1461036a5780633ccfd60b1461039c57600080fd5b8063095ea7b31461030b57806318160ddd1461031e57600080fd5b806301ffc9a71461026157806306fdde0314610289578063081812fc146102cb5780630913d984146102f6575b600080fd5b61027461026f366004612341565b6105ef565b60405190151581526020015b60405180910390f35b60408051808201909152601781527f4368696c6c204265617220436c7562204176617461727300000000000000000060208201525b6040516102809190612652565b6102de6102d93660046123ed565b61064b565b6040516001600160a01b039091168152602001610280565b6103096103043660046123ed565b6106f6565b005b610309610319366004612268565b6107af565b6000546103449074010000000000000000000000000000000000000000900461ffff1681565b60405161ffff9091168152602001610280565b610309610365366004612112565b6108de565b61037d610378366004612406565b610965565b604080516001600160a01b039093168352602083019190915201610280565b610309610a23565b6103096103b2366004612112565b610acb565b6103096103c536600461237b565b610ae6565b6102de6103d83660046123ed565b610afa565b6102be610b85565b600b54600d5460408051928352602083019190915201610280565b61041361040e366004612098565b610c13565b604051908152602001610280565b610309610cad565b600a546102de906001600160a01b031681565b600a546102749074010000000000000000000000000000000000000000900460ff1681565b61047461046f366004612098565b610cc1565b604051610280919061261a565b6000546001600160a01b03166102de565b60408051808201909152600481527f434243410000000000000000000000000000000000000000000000000000000060208201526102be565b6103096104d9366004612235565b610dac565b6103096104ec366004612153565b610dbb565b6103096104ff366004612098565b610e49565b610517610512366004612294565b610e8b565b60405161028091906125d4565b6102be6105323660046123ed565b610f72565b6102746105453660046123ed565b6000908152600360205260409020546001600160a01b0316151590565b6001546102de906001600160a01b031681565b610309611031565b6007546102de906001600160a01b031681565b61027461059e3660046120d9565b611086565b6008546102de906001600160a01b031681565b6103096105c4366004612098565b61116d565b6103096105d7366004612294565b6111fa565b6009546102de906001600160a01b031681565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a0000000000000000000000000000000000000000000000000000000014806106455750610645826114d4565b92915050565b6000818152600360205260408120546001600160a01b03166106da5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b6106fe6115b7565b6103e88111156107765760405162461bcd60e51b815260206004820152602660248201527f726f79616c74792063616e6e6f74206265206d6f7265207468616e203130207060448201527f657263656e74000000000000000000000000000000000000000000000000000060648201526084016106d1565b600d805490829055604051829082907fb4fb93f70c244a4a5ccc896856ac486b87475e23f8050e29a7c790c456cbddc590600090a35050565b6000818152600360205260409020546001600160a01b039081169083168114156108415760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084016106d1565b336001600160a01b038216148061085d575061085d8133611086565b6108cf5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016106d1565b6108d98383611611565b505050565b6108e83382611697565b61095a5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016106d1565b6108d983838361177c565b60008281526003602052604081205481906001600160a01b03166109f15760405162461bcd60e51b815260206004820152602760248201527f526f79616c6974792071756572727920666f72206e6f6e2d6578697374616e7460448201527f20746f6b656e210000000000000000000000000000000000000000000000000060648201526084016106d1565b6000546001600160a01b0316612710600d5485610a0e91906126e0565b610a1891906126cc565b915091509250929050565b610a2b6115b7565b6040516000903390610a2890479084818181858888f193505050503d8060008114610a72576040519150601f19603f3d011682016040523d82523d6000602084013e610a77565b606091505b5050905080610ac85760405162461bcd60e51b815260206004820152601b60248201527f4661696c656420746f207769746864726177207061796d656e7421000000000060448201526064016106d1565b50565b6108d983838360405180602001604052806000815250610dbb565b610aee6115b7565b6108d960028383611fe1565b6000818152600360205260408120546001600160a01b0316806106455760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e000000000000000000000000000000000000000000000060648201526084016106d1565b60028054610b9290612795565b80601f0160208091040260200160405190810160405280929190818152602001828054610bbe90612795565b8015610c0b5780601f10610be057610100808354040283529160200191610c0b565b820191906000526020600020905b815481529060010190602001808311610bee57829003601f168201915b505050505081565b60006001600160a01b038216610c915760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f20616464726573730000000000000000000000000000000000000000000060648201526084016106d1565b506001600160a01b031660009081526004602052604090205490565b610cb56115b7565b610cbf6000611957565b565b6001600160a01b0381166000908152600460205260408120546060919067ffffffffffffffff811115610cf657610cf66128e5565b604051908082528060200260200182016040528015610d1f578160200160208202803683370190505b5090506000600b546001610d3391906126b4565b9050600060015b82811015610da2576000818152600360205260409020546001600160a01b0387811691161415610d905780848381518110610d7757610d776128b6565b602090810291909101015281610d8c8161280b565b9250505b80610d9a8161280b565b915050610d3a565b5091949350505050565b610db73383836119bf565b5050565b610dc53383611697565b610e375760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016106d1565b610e4384848484611aac565b50505050565b610e516115b7565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60606000825167ffffffffffffffff811115610ea957610ea96128e5565b604051908082528060200260200182016040528015610ed2578160200160208202803683370190505b50905060005b8351811015610f6b5760006001600160a01b031660036000868481518110610f0257610f026128b6565b6020026020010151815260200190815260200160002060009054906101000a90046001600160a01b03166001600160a01b03161415828281518110610f4957610f496128b6565b9115156020928302919091019091015280610f638161280b565b915050610ed8565b5092915050565b6000818152600360205260409020546060906001600160a01b0316610fff5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e000000000000000000000000000000000060648201526084016106d1565b600261100a83611b35565b60405160200161101b92919061248e565b6040516020818303038152906040529050919050565b6110396115b7565b600a80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff8116740100000000000000000000000000000000000000009182900460ff1615909102179055565b6001546040517fc45527910000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015260009281169190841690829063c45527919060240160206040518083038186803b1580156110ec57600080fd5b505afa158015611100573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112491906120bc565b6001600160a01b0316141561113d576001915050610645565b50506001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b6111756115b7565b6001600160a01b0381166111f15760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016106d1565b610ac881611957565b600a5474010000000000000000000000000000000000000000900460ff166112645760405162461bcd60e51b815260206004820152601760248201527f4d696e74696e67206973206e6f7420656e61626c65642100000000000000000060448201526064016106d1565b60005b81518110156114b0576000828281518110611284576112846128b6565b602002602001015190506112af816000908152600360205260409020546001600160a01b0316151590565b156112fc5760405162461bcd60e51b815260206004820152601e60248201527f417661746172206d757374206e6f74206265206d696e7465642079657421000060448201526064016106d1565b6009546040517f6352211e0000000000000000000000000000000000000000000000000000000081526004810183905260009133916001600160a01b0390911690636352211e9060240160206040518083038186803b15801561135e57600080fd5b505afa158015611372573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061139691906120bc565b600a546040517fa5cd761f000000000000000000000000000000000000000000000000000000008152600481018690526001600160a01b0392831693909314935060009233929091169063a5cd761f9060240160206040518083038186803b15801561140157600080fd5b505afa158015611415573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061143991906120bc565b6001600160a01b0316149050818061144e5750805b61149a5760405162461bcd60e51b815260206004820152601c60248201527f4d757374206f776e20616c6c20746f6b656e7320746f206d696e74210000000060448201526064016106d1565b50505080806114a89061280b565b915050611267565b508051600c60008282546114c4919061271d565b90915550610ac890503382611c67565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061156757507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061064557507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610645565b6000546001600160a01b03163314610cbf5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106d1565b600081815260056020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038416908117909155819061165e82610afa565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600360205260408120546001600160a01b03166117215760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084016106d1565b6000828152600360205260409020546001600160a01b039081169084168114806117645750836001600160a01b03166117598461064b565b6001600160a01b0316145b8061177457506117748185611086565b949350505050565b6000818152600360205260409020546001600160a01b0384811691161461180b5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e657200000000000000000000000000000000000000000000000000000060648201526084016106d1565b6001600160a01b0382166118865760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016106d1565b611891600082611611565b6001600160a01b03831660009081526004602052604081208054916118b583612760565b90915550506001600160a01b03821660009081526004602052604081208054916118de8361280b565b909155505060008181526003602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b816001600160a01b0316836001600160a01b03161415611a215760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016106d1565b6001600160a01b0383811660008181526006602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611ab784848461177c565b611ac384848484611e16565b610e435760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016106d1565b606081611b7557505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115611b9f5780611b898161280b565b9150611b989050600a836126cc565b9150611b79565b60008167ffffffffffffffff811115611bba57611bba6128e5565b6040519080825280601f01601f191660200182016040528015611be4576020820181803683370190505b5090505b841561177457611bf960018361271d565b9150611c06600a86612844565b611c119060306126b4565b60f81b818381518110611c2657611c266128b6565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611c60600a866126cc565b9450611be8565b60005b81518110156108d9576000828281518110611c8757611c876128b6565b60209081029190910181015160008181526003909252604080832080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0389169081179091559051919350839290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4611d206000858360405180602001604052806000815250611e16565b611d925760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016106d1565b6001600160a01b0384166000908152600460205260408120805491611db68361280b565b90915550506000805474010000000000000000000000000000000000000000900461ffff16906014611de7836127e9565b91906101000a81548161ffff021916908361ffff16021790555050508080611e0e9061280b565b915050611c6a565b60006001600160a01b0384163b15611fd6576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a0290611e73903390899088908890600401612598565b602060405180830381600087803b158015611e8d57600080fd5b505af1925050508015611edb575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611ed89181019061235e565b60015b611f8b573d808015611f09576040519150601f19603f3d011682016040523d82523d6000602084013e611f0e565b606091505b508051611f835760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016106d1565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050611774565b506001949350505050565b828054611fed90612795565b90600052602060002090601f01602090048101928261200f5760008555612073565b82601f10612046578280017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00823516178555612073565b82800160010185558215612073579182015b82811115612073578235825591602001919060010190612058565b5061207f929150612083565b5090565b5b8082111561207f5760008155600101612084565b6000602082840312156120aa57600080fd5b81356120b581612914565b9392505050565b6000602082840312156120ce57600080fd5b81516120b581612914565b600080604083850312156120ec57600080fd5b82356120f781612914565b9150602083013561210781612914565b809150509250929050565b60008060006060848603121561212757600080fd5b833561213281612914565b9250602084013561214281612914565b929592945050506040919091013590565b6000806000806080858703121561216957600080fd5b843561217481612914565b935060208581013561218581612914565b935060408601359250606086013567ffffffffffffffff808211156121a957600080fd5b818801915088601f8301126121bd57600080fd5b8135818111156121cf576121cf6128e5565b6121ff847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601612665565b9150808252898482850101111561221557600080fd5b808484018584013760008482840101525080935050505092959194509250565b6000806040838503121561224857600080fd5b823561225381612914565b91506020830135801515811461210757600080fd5b6000806040838503121561227b57600080fd5b823561228681612914565b946020939093013593505050565b600060208083850312156122a757600080fd5b823567ffffffffffffffff808211156122bf57600080fd5b818501915085601f8301126122d357600080fd5b8135818111156122e5576122e56128e5565b8060051b91506122f6848301612665565b8181528481019084860184860187018a101561231157600080fd5b600095505b83861015612334578035835260019590950194918601918601612316565b5098975050505050505050565b60006020828403121561235357600080fd5b81356120b581612929565b60006020828403121561237057600080fd5b81516120b581612929565b6000806020838503121561238e57600080fd5b823567ffffffffffffffff808211156123a657600080fd5b818501915085601f8301126123ba57600080fd5b8135818111156123c957600080fd5b8660208285010111156123db57600080fd5b60209290920196919550909350505050565b6000602082840312156123ff57600080fd5b5035919050565b6000806040838503121561241957600080fd5b50508035926020909101359150565b60008151808452612440816020860160208601612734565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60008151612484818560208601612734565b9290920192915050565b600080845481600182811c9150808316806124aa57607f831692505b60208084108214156124e3577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b8180156124f7576001811461252657612553565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00861689528489019650612553565b60008b81526020902060005b8681101561254b5781548b820152908501908301612532565b505084890196505b50505050505061258f6125668286612472565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000815260050190565b95945050505050565b60006001600160a01b038087168352808616602084015250836040830152608060608301526125ca6080830184612428565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561260e5783511515835292840192918401916001016125f0565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561260e57835183529284019291840191600101612636565b6020815260006120b56020830184612428565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156126ac576126ac6128e5565b604052919050565b600082198211156126c7576126c7612858565b500190565b6000826126db576126db612887565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561271857612718612858565b500290565b60008282101561272f5761272f612858565b500390565b60005b8381101561274f578181015183820152602001612737565b83811115610e435750506000910152565b60008161276f5761276f612858565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b600181811c908216806127a957607f821691505b602082108114156127e3577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600061ffff8083168181141561280157612801612858565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561283d5761283d612858565b5060010190565b60008261285357612853612887565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6001600160a01b0381168114610ac857600080fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081168114610ac857600080fdfea2646970667358221220d2dc6adb134573b54aac4c2e65402630cd9e4a7f48d2a45f4bfbf8c6dcdd530564736f6c63430008070033

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

000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1000000000000000000000000c7b76846de3db54db45c8b5debcabff4b0834f7800000000000000000000000060d4a9cb8adce7ae0a8d4f110d31ee6f5e56e99600000000000000000000000000000000000000000000000000000000000002ee00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002968747470733a2f2f617661746172732e6170692e6368696c6c626561722e636c75622f746f6b656e2f0000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _openseaProxyRegistry (address): 0xa5409ec958C83C3f309868babACA7c86DCB077c1
Arg [1] : _nftContract (address): 0xc7b76846De3DB54DB45c8b5deBCabfF4b0834F78
Arg [2] : _stakingContract (address): 0x60d4a9CB8aDCE7Ae0a8d4F110D31ee6F5e56e996
Arg [3] : EIP2981RoyaltyPercentage (uint256): 750
Arg [4] : _baseURI (string): https://avatars.api.chillbear.club/token/

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1
Arg [1] : 000000000000000000000000c7b76846de3db54db45c8b5debcabff4b0834f78
Arg [2] : 00000000000000000000000060d4a9cb8adce7ae0a8d4f110d31ee6f5e56e996
Arg [3] : 00000000000000000000000000000000000000000000000000000000000002ee
Arg [4] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000029
Arg [6] : 68747470733a2f2f617661746172732e6170692e6368696c6c626561722e636c
Arg [7] : 75622f746f6b656e2f0000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

36100:4360:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39386:241;;;;;;:::i;:::-;;:::i;:::-;;;10831:14:1;;10824:22;10806:41;;10794:2;10779:18;39386:241:0;;;;;;;;26268:114;26342:32;;;;;;;;;;;;;;;;;26268:114;;;;;;;:::i;27400:213::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;8497:55:1;;;8479:74;;8467:2;8452:18;27400:213:0;8333:226:1;37575:323:0;;;;;;:::i;:::-;;:::i;:::-;;26940:394;;;;;;:::i;:::-;;:::i;23971:25::-;;;;;;;;;;;;;;;19654:6:1;19642:19;;;19624:38;;19612:2;19597:18;23971:25:0;19480:188:1;28600:331:0;;;;;;:::i;:::-;;:::i;39031:283::-;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;9272:55:1;;;9254:74;;9359:2;9344:18;;9337:34;;;;9227:18;39031:283:0;9080:297:1;39635:204:0;;;:::i;29002:179::-;;;;;;:::i;:::-;;:::i;28431:102::-;;;;;;:::i;:::-;;:::i;25384:231::-;;;;;;:::i;:::-;;:::i;24049:21::-;;;:::i;37264:223::-;37409:7;;37454:25;;37264:223;;;20029:25:1;;;20085:2;20070:18;;20063:34;;;;20002:18;37264:223:0;19855:248:1;25120:202:0;;;;;;:::i;:::-;;:::i;:::-;;;19819:25:1;;;19807:2;19792:18;25120:202:0;19673:177:1;14263:103:0;;;:::i;36257:37::-;;;;;-1:-1:-1;;;;;36257:37:0;;;36303:27;;;;;;;;;;;;40080:377;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;13615:87::-;13661:7;13688:6;-1:-1:-1;;;;;13688:6:0;13615:87;;26451:97;26527:13;;;;;;;;;;;;;;;;;26451:97;;27685:147;;;;;;:::i;:::-;;:::i;29252:318::-;;;;;;:::i;:::-;;:::i;28311:112::-;;;;;;:::i;:::-;;:::i;25887:314::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;26619:259::-;;;;;;:::i;:::-;;:::i;25760:119::-;;;;;;:::i;:::-;25817:4;25841:16;;;:7;:16;;;;;;-1:-1:-1;;;;;25841:16:0;:30;;;25760:119;24005:35;;;;;-1:-1:-1;;;;;24005:35:0;;;39978:94;;;:::i;36155:26::-;;;;;-1:-1:-1;;;;;36155:26:0;;;27903:400;;;;;;:::i;:::-;;:::i;36188:30::-;;;;;-1:-1:-1;;;;;36188:30:0;;;14521:201;;;;;;:::i;:::-;;:::i;37906:630::-;;;;;;:::i;:::-;;:::i;36227:23::-;;;;;-1:-1:-1;;;;;36227:23:0;;;39386:241;39488:4;39525:41;;;39540:26;39525:41;;:94;;;39583:36;39607:11;39583:23;:36::i;:::-;39505:114;39386:241;-1:-1:-1;;39386:241:0:o;27400:213::-;27468:7;25841:16;;;:7;:16;;;;;;-1:-1:-1;;;;;25841:16:0;27488:73;;;;-1:-1:-1;;;27488:73:0;;17672:2:1;27488:73:0;;;17654:21:1;17711:2;17691:18;;;17684:30;17750:34;17730:18;;;17723:62;17821:14;17801:18;;;17794:42;17853:19;;27488:73:0;;;;;;;;;-1:-1:-1;27581:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;27581:24:0;;27400:213::o;37575:323::-;13501:13;:11;:13::i;:::-;37681:4:::1;37667:10;:18;;37659:69;;;::::0;-1:-1:-1;;;37659:69:0;;13372:2:1;37659:69:0::1;::::0;::::1;13354:21:1::0;13411:2;13391:18;;;13384:30;13450:34;13430:18;;;13423:62;13521:8;13501:18;;;13494:36;13547:19;;37659:69:0::1;13170:402:1::0;37659:69:0::1;37751:25;::::0;;37787:38;;;;37841:49:::1;::::0;37815:10;;37751:25;;37841:49:::1;::::0;37739:9:::1;::::0;37841:49:::1;37648:250;37575:323:::0;:::o;26940:394::-;27015:13;27031:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27031:16:0;;;;27066:11;;;;;27058:57;;;;-1:-1:-1;;;27058:57:0;;18862:2:1;27058:57:0;;;18844:21:1;18901:2;18881:18;;;18874:30;18940:34;18920:18;;;18913:62;19011:3;18991:18;;;18984:31;19032:19;;27058:57:0;18660:397:1;27058:57:0;27150:10;-1:-1:-1;;;;;27150:19:0;;;;:58;;;27173:35;27190:5;27197:10;27173:16;:35::i;:::-;27128:164;;;;-1:-1:-1;;;27128:164:0;;15662:2:1;27128:164:0;;;15644:21:1;15701:2;15681:18;;;15674:30;15740:34;15720:18;;;15713:62;15811:26;15791:18;;;15784:54;15855:19;;27128:164:0;15460:420:1;27128:164:0;27305:21;27314:2;27318:7;27305:8;:21::i;:::-;27004:330;26940:394;;:::o;28600:331::-;28789:39;28808:10;28820:7;28789:18;:39::i;:::-;28781:101;;;;-1:-1:-1;;;28781:101:0;;19264:2:1;28781:101:0;;;19246:21:1;19303:2;19283:18;;;19276:30;19342:34;19322:18;;;19315:62;19413:19;19393:18;;;19386:47;19450:19;;28781:101:0;19062:413:1;28781:101:0;28895:28;28905:4;28911:2;28915:7;28895:9;:28::i;39031:283::-;39113:16;25841;;;:7;:16;;;;;;39113;;-1:-1:-1;;;;;25841:16:0;39165:68;;;;-1:-1:-1;;;39165:68:0;;17264:2:1;39165:68:0;;;17246:21:1;17303:2;17283:18;;;17276:30;17342:34;17322:18;;;17315:62;17413:9;17393:18;;;17386:37;17440:19;;39165:68:0;17062:403:1;39165:68:0;13661:7;13688:6;-1:-1:-1;;;;;13688:6:0;39300:5;39272:25;;39260:9;:37;;;;:::i;:::-;:45;;;;:::i;:::-;39244:62;;;;39031:283;;;;;:::o;39635:204::-;13501:13;:11;:13::i;:::-;39704:69:::1;::::0;39686:12:::1;::::0;39712:10:::1;::::0;39764:4:::1;::::0;39736:21:::1;::::0;39686:12;39704:69;39686:12;39704:69;39736:21;39712:10;39764:4;39704:69:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39685:88;;;39792:7;39784:47;;;::::0;-1:-1:-1;;;39784:47:0;;16908:2:1;39784:47:0::1;::::0;::::1;16890:21:1::0;16947:2;16927:18;;;16920:30;16986:29;16966:18;;;16959:57;17033:18;;39784:47:0::1;16706:351:1::0;39784:47:0::1;39674:165;39635:204::o:0;29002:179::-;29134:39;29151:4;29157:2;29161:7;29134:39;;;;;;;;;;;;:16;:39::i;28431:102::-;13501:13;:11;:13::i;:::-;28507:18:::1;:7;28517:8:::0;;28507:18:::1;:::i;25384:231::-:0;25448:7;25484:16;;;:7;:16;;;;;;-1:-1:-1;;;;;25484:16:0;25519:19;25511:73;;;;-1:-1:-1;;;25511:73:0;;16498:2:1;25511:73:0;;;16480:21:1;16537:2;16517:18;;;16510:30;16576:34;16556:18;;;16549:62;16647:11;16627:18;;;16620:39;16676:19;;25511:73:0;16296:405:1;24049:21:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25120:202::-;25186:7;-1:-1:-1;;;;;25214:19:0;;25206:74;;;;-1:-1:-1;;;25206:74:0;;16087:2:1;25206:74:0;;;16069:21:1;16126:2;16106:18;;;16099:30;16165:34;16145:18;;;16138:62;16236:12;16216:18;;;16209:40;16266:19;;25206:74:0;15885:406:1;25206:74:0;-1:-1:-1;;;;;;25298:16:0;;;;;:9;:16;;;;;;;25120:202::o;14263:103::-;13501:13;:11;:13::i;:::-;14328:30:::1;14355:1;14328:18;:30::i;:::-;14263:103::o:0;40080:377::-;-1:-1:-1;;;;;40200:16:0;;40166:20;40200:16;;;:9;:16;;;;;;40140:13;;40166:20;40189:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40189:28:0;;40166:51;;40228:6;40237:7;;40247:1;40237:11;;;;:::i;:::-;40228:20;-1:-1:-1;40259:6:0;40292:1;40278:148;40299:1;40295;:5;40278:148;;;25695:4;25719:16;;;:7;:16;;;;;;-1:-1:-1;;;;;25719:25:0;;;:16;;:25;40322:93;;;40376:1;40364:6;40371:1;40364:9;;;;;;;;:::i;:::-;;;;;;;;;;:13;40396:3;;;;:::i;:::-;;;;40322:93;40302:3;;;;:::i;:::-;;;;40278:148;;;-1:-1:-1;40443:6:0;;40080:377;-1:-1:-1;;;;40080:377:0:o;27685:147::-;27774:50;27793:10;27805:8;27815;27774:18;:50::i;:::-;27685:147;;:::o;29252:318::-;29419:39;29438:10;29450:7;29419:18;:39::i;:::-;29411:101;;;;-1:-1:-1;;;29411:101:0;;19264:2:1;29411:101:0;;;19246:21:1;19303:2;19283:18;;;19276:30;19342:34;19322:18;;;19315:62;19413:19;19393:18;;;19386:47;19450:19;;29411:101:0;19062:413:1;29411:101:0;29523:39;29537:4;29543:2;29547:7;29556:5;29523:13;:39::i;:::-;29252:318;;;;:::o;28311:112::-;13501:13;:11;:13::i;:::-;28388:20:::1;:27:::0;;;::::1;-1:-1:-1::0;;;;;28388:27:0;;;::::1;::::0;;;::::1;::::0;;28311:112::o;25887:314::-;25958:13;25984:22;26020:8;:15;26009:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26009:27:0;;25984:52;;26052:9;26047:121;26071:8;:15;26067:1;:19;26047:121;;;26154:1;-1:-1:-1;;;;;26122:34:0;:7;:20;26130:8;26139:1;26130:11;;;;;;;;:::i;:::-;;;;;;;26122:20;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26122:20:0;-1:-1:-1;;;;;26122:34:0;;;26108:8;26117:1;26108:11;;;;;;;;:::i;:::-;:48;;;:11;;;;;;;;;;;:48;26088:3;;;;:::i;:::-;;;;26047:121;;;-1:-1:-1;26185:8:0;25887:314;-1:-1:-1;;25887:314:0:o;26619:259::-;25817:4;25841:16;;;:7;:16;;;;;;26686:13;;-1:-1:-1;;;;;25841:16:0;26712:76;;;;-1:-1:-1;;;26712:76:0;;18446:2:1;26712:76:0;;;18428:21:1;18485:2;18465:18;;;18458:30;18524:34;18504:18;;;18497:62;18595:17;18575:18;;;18568:45;18630:19;;26712:76:0;18244:411:1;26712:76:0;26832:7;26841:18;:7;:16;:18::i;:::-;26815:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;26801:69;;26619:259;;;:::o;39978:94::-;13501:13;:11;:13::i;:::-;40049:15:::1;::::0;;40030:34;;::::1;40049:15:::0;;;;::::1;;;40048:16;40030:34:::0;;::::1;;::::0;;39978:94::o;27903:400::-;28116:20;;28160:28;;;;;-1:-1:-1;;;;;8497:55:1;;;28160:28:0;;;8479:74:1;27992:4:0;;28116:20;;;28152:49;;;;28116:20;;28160:21;;8452:18:1;;28160:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;28152:49:0;;28148:93;;;28225:4;28218:11;;;;;28148:93;-1:-1:-1;;;;;;;28260:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;27903:400::o;14521:201::-;13501:13;:11;:13::i;:::-;-1:-1:-1;;;;;14610:22:0;::::1;14602:73;;;::::0;-1:-1:-1;;;14602:73:0;;12559:2:1;14602:73:0::1;::::0;::::1;12541:21:1::0;12598:2;12578:18;;;12571:30;12637:34;12617:18;;;12610:62;12708:8;12688:18;;;12681:36;12734:19;;14602:73:0::1;12357:402:1::0;14602:73:0::1;14686:28;14705:8;14686:18;:28::i;37906:630::-:0;37975:15;;;;;;;37967:51;;;;-1:-1:-1;;;37967:51:0;;14538:2:1;37967:51:0;;;14520:21:1;14577:2;14557:18;;;14550:30;14616:25;14596:18;;;14589:53;14659:18;;37967:51:0;14336:347:1;37967:51:0;38036:9;38031:409;38055:8;:15;38051:1;:19;38031:409;;;38092:15;38110:8;38119:1;38110:11;;;;;;;;:::i;:::-;;;;;;;38092:29;;38145:16;38153:7;25817:4;25841:16;;;:7;:16;;;;;;-1:-1:-1;;;;;25841:16:0;:30;;;25760:119;38145:16;38144:17;38136:60;;;;-1:-1:-1;;;38136:60:0;;15303:2:1;38136:60:0;;;15285:21:1;15342:2;15322:18;;;15315:30;15381:32;15361:18;;;15354:60;15431:18;;38136:60:0;15101:354:1;38136:60:0;38226:9;;:26;;;;;;;;19819:25:1;;;38211:12:0;;38256:10;;-1:-1:-1;;;;;38226:9:0;;;;:17;;19792:18:1;;38226:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38300:13;;:36;;;;;;;;19819:25:1;;;-1:-1:-1;;;;;38226:40:0;;;;;;;;-1:-1:-1;38281:16:0;;38340:10;;38300:13;;;;:27;;19792:18:1;;38300:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;38300:50:0;;38281:69;;38373:7;:22;;;;38384:11;38373:22;38365:63;;;;-1:-1:-1;;;38365:63:0;;11783:2:1;38365:63:0;;;11765:21:1;11822:2;11802:18;;;11795:30;11861;11841:18;;;11834:58;11909:18;;38365:63:0;11581:352:1;38365:63:0;38077:363;;;38072:3;;;;;:::i;:::-;;;;38031:409;;;;38467:8;:15;38452:11;;:30;;;;;;;:::i;:::-;;;;-1:-1:-1;38493:35:0;;-1:-1:-1;38507:10:0;38519:8;38493:13;:35::i;24751:305::-;24853:4;24890:40;;;24905:25;24890:40;;:105;;-1:-1:-1;24947:48:0;;;24962:33;24947:48;24890:105;:158;;;-1:-1:-1;18040:25:0;18025:40;;;;25012:36;17916:157;13780:132;13661:7;13688:6;-1:-1:-1;;;;;13688:6:0;12246:10;13844:23;13836:68;;;;-1:-1:-1;;;13836:68:0;;18085:2:1;13836:68:0;;;18067:21:1;;;18104:18;;;18097:30;18163:34;18143:18;;;18136:62;18215:18;;13836:68:0;17883:356:1;33134:174:0;33209:24;;;;:15;:24;;;;;:29;;;;-1:-1:-1;;;;;33209:29:0;;;;;;;;:24;;33263:23;33209:24;33263:14;:23::i;:::-;-1:-1:-1;;;;;33254:46:0;;;;;;;;;;;33134:174;;:::o;31303:341::-;31396:4;25841:16;;;:7;:16;;;;;;-1:-1:-1;;;;;25841:16:0;31413:73;;;;-1:-1:-1;;;31413:73:0;;14890:2:1;31413:73:0;;;14872:21:1;14929:2;14909:18;;;14902:30;14968:34;14948:18;;;14941:62;15039:14;15019:18;;;15012:42;15071:19;;31413:73:0;14688:408:1;31413:73:0;31497:13;31513:16;;;:7;:16;;;;;;-1:-1:-1;;;;;31513:16:0;;;;31548;;;;;:51;;;31592:7;-1:-1:-1;;;;;31568:31:0;:20;31580:7;31568:11;:20::i;:::-;-1:-1:-1;;;;;31568:31:0;;31548:51;:87;;;;31603:32;31620:5;31627:7;31603:16;:32::i;:::-;31540:96;31303:341;-1:-1:-1;;;;31303:341:0:o;32505:511::-;32637:16;;;;:7;:16;;;;;;-1:-1:-1;;;;;32637:24:0;;;:16;;:24;32629:74;;;;-1:-1:-1;;;32629:74:0;;12966:2:1;32629:74:0;;;12948:21:1;13005:2;12985:18;;;12978:30;13044:34;13024:18;;;13017:62;13115:7;13095:18;;;13088:35;13140:19;;32629:74:0;12764:401:1;32629:74:0;-1:-1:-1;;;;;32722:16:0;;32714:65;;;;-1:-1:-1;;;32714:65:0;;13779:2:1;32714:65:0;;;13761:21:1;13818:2;13798:18;;;13791:30;13857:34;13837:18;;;13830:62;13928:6;13908:18;;;13901:34;13952:19;;32714:65:0;13577:400:1;32714:65:0;32844:29;32861:1;32865:7;32844:8;:29::i;:::-;-1:-1:-1;;;;;32886:15:0;;;;;;:9;:15;;;;;:17;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;32914:13:0;;;;;;:9;:13;;;;;:15;;;;;;:::i;:::-;;;;-1:-1:-1;;32942:16:0;;;;:7;:16;;;;;;:21;;;;-1:-1:-1;;;;;32942:21:0;;;;;;;;;32981:27;;32942:16;;32981:27;;;;;;;32505:511;;;:::o;14882:191::-;14956:16;14975:6;;-1:-1:-1;;;;;14992:17:0;;;;;;;;;;15025:40;;14975:6;;;;;;;15025:40;;14956:16;15025:40;14945:128;14882:191;:::o;33450:315::-;33605:8;-1:-1:-1;;;;;33596:17:0;:5;-1:-1:-1;;;;;33596:17:0;;;33588:55;;;;-1:-1:-1;;;33588:55:0;;14184:2:1;33588:55:0;;;14166:21:1;14223:2;14203:18;;;14196:30;14262:27;14242:18;;;14235:55;14307:18;;33588:55:0;13982:349:1;33588:55:0;-1:-1:-1;;;;;33654:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;;;;;;;;;;;;33716:41;;10806::1;;;33716::0;;10779:18:1;33716:41:0;;;;;;;33450:315;;;:::o;30452:::-;30609:28;30619:4;30625:2;30629:7;30609:9;:28::i;:::-;30656:48;30679:4;30685:2;30689:7;30698:5;30656:22;:48::i;:::-;30648:111;;;;-1:-1:-1;;;30648:111:0;;12140:2:1;30648:111:0;;;12122:21:1;12179:2;12159:18;;;12152:30;12218:34;12198:18;;;12191:62;12289:20;12269:18;;;12262:48;12327:19;;30648:111:0;11938:414:1;867:723:0;923:13;1144:10;1140:53;;-1:-1:-1;;1171:10:0;;;;;;;;;;;;;;;;;;867:723::o;1140:53::-;1218:5;1203:12;1259:78;1266:9;;1259:78;;1292:8;;;;:::i;:::-;;-1:-1:-1;1315:10:0;;-1:-1:-1;1323:2:0;1315:10;;:::i;:::-;;;1259:78;;;1347:19;1379:6;1369:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1369:17:0;;1347:39;;1397:154;1404:10;;1397:154;;1431:11;1441:1;1431:11;;:::i;:::-;;-1:-1:-1;1500:10:0;1508:2;1500:5;:10;:::i;:::-;1487:24;;:2;:24;:::i;:::-;1474:39;;1457:6;1464;1457:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;1528:11:0;1537:2;1528:11;;:::i;:::-;;;1397:154;;31652:516;31739:9;31734:427;31758:8;:15;31754:1;:19;31734:427;;;31795:15;31813:8;31822:1;31813:11;;;;;;;;:::i;:::-;;;;;;;;;;;;31839:16;;;;:7;:16;;;;;;;:21;;;;-1:-1:-1;;;;;31839:21:0;;;;;;;;31880:33;;31813:11;;-1:-1:-1;31813:11:0;;31839:21;;31880:33;;31839:16;;31880:33;31954:51;31985:1;31989:2;31993:7;31954:51;;;;;;;;;;;;:22;:51::i;:::-;31928:163;;;;-1:-1:-1;;;31928:163:0;;12140:2:1;31928:163:0;;;12122:21:1;12179:2;12159:18;;;12152:30;12218:34;12198:18;;;12191:62;12289:20;12269:18;;;12262:48;12327:19;;31928:163:0;11938:414:1;31928:163:0;-1:-1:-1;;;;;32106:13:0;;;;;;:9;:13;;;;;:15;;;;;;:::i;:::-;;;;-1:-1:-1;;32136:11:0;:13;;;;;;;;:11;:13;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;31780:381;31775:3;;;;;:::i;:::-;;;;31734:427;;34330:797;34485:4;-1:-1:-1;;;;;34506:13:0;;4462:19;:23;34502:618;;34542:70;;;;;-1:-1:-1;;;;;34542:36:0;;;;;:70;;34579:10;;34591:4;;34597:7;;34606:5;;34542:70;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34542:70:0;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;34538:527;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34782:13:0;;34778:272;;34825:60;;-1:-1:-1;;;34825:60:0;;12140:2:1;34825:60:0;;;12122:21:1;12179:2;12159:18;;;12152:30;12218:34;12198:18;;;12191:62;12289:20;12269:18;;;12262:48;12327:19;;34825:60:0;11938:414:1;34778:272:0;35000:6;34994:13;34985:6;34981:2;34977:15;34970:38;34538:527;34663:51;;34673:41;34663:51;;-1:-1:-1;34656:58:0;;34502:618;-1:-1:-1;35104:4:0;34330:797;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:247:1;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;181:9;168:23;200:31;225:5;200:31;:::i;:::-;250:5;14:247;-1:-1:-1;;;14:247:1:o;266:251::-;336:6;389:2;377:9;368:7;364:23;360:32;357:52;;;405:1;402;395:12;357:52;437:9;431:16;456:31;481:5;456:31;:::i;522:388::-;590:6;598;651:2;639:9;630:7;626:23;622:32;619:52;;;667:1;664;657:12;619:52;706:9;693:23;725:31;750:5;725:31;:::i;:::-;775:5;-1:-1:-1;832:2:1;817:18;;804:32;845:33;804:32;845:33;:::i;:::-;897:7;887:17;;;522:388;;;;;:::o;915:456::-;992:6;1000;1008;1061:2;1049:9;1040:7;1036:23;1032:32;1029:52;;;1077:1;1074;1067:12;1029:52;1116:9;1103:23;1135:31;1160:5;1135:31;:::i;:::-;1185:5;-1:-1:-1;1242:2:1;1227:18;;1214:32;1255:33;1214:32;1255:33;:::i;:::-;915:456;;1307:7;;-1:-1:-1;;;1361:2:1;1346:18;;;;1333:32;;915:456::o;1376:1167::-;1471:6;1479;1487;1495;1548:3;1536:9;1527:7;1523:23;1519:33;1516:53;;;1565:1;1562;1555:12;1516:53;1604:9;1591:23;1623:31;1648:5;1623:31;:::i;:::-;1673:5;-1:-1:-1;1697:2:1;1736:18;;;1723:32;1764:33;1723:32;1764:33;:::i;:::-;1816:7;-1:-1:-1;1870:2:1;1855:18;;1842:32;;-1:-1:-1;1925:2:1;1910:18;;1897:32;1948:18;1978:14;;;1975:34;;;2005:1;2002;1995:12;1975:34;2043:6;2032:9;2028:22;2018:32;;2088:7;2081:4;2077:2;2073:13;2069:27;2059:55;;2110:1;2107;2100:12;2059:55;2146:2;2133:16;2168:2;2164;2161:10;2158:36;;;2174:18;;:::i;:::-;2216:112;2324:2;2255:66;2248:4;2244:2;2240:13;2236:86;2232:95;2216:112;:::i;:::-;2203:125;;2351:2;2344:5;2337:17;2391:7;2386:2;2381;2377;2373:11;2369:20;2366:33;2363:53;;;2412:1;2409;2402:12;2363:53;2467:2;2462;2458;2454:11;2449:2;2442:5;2438:14;2425:45;2511:1;2506:2;2501;2494:5;2490:14;2486:23;2479:34;;2532:5;2522:15;;;;;1376:1167;;;;;;;:::o;2548:416::-;2613:6;2621;2674:2;2662:9;2653:7;2649:23;2645:32;2642:52;;;2690:1;2687;2680:12;2642:52;2729:9;2716:23;2748:31;2773:5;2748:31;:::i;:::-;2798:5;-1:-1:-1;2855:2:1;2840:18;;2827:32;2897:15;;2890:23;2878:36;;2868:64;;2928:1;2925;2918:12;2969:315;3037:6;3045;3098:2;3086:9;3077:7;3073:23;3069:32;3066:52;;;3114:1;3111;3104:12;3066:52;3153:9;3140:23;3172:31;3197:5;3172:31;:::i;:::-;3222:5;3274:2;3259:18;;;;3246:32;;-1:-1:-1;;;2969:315:1:o;3289:957::-;3373:6;3404:2;3447;3435:9;3426:7;3422:23;3418:32;3415:52;;;3463:1;3460;3453:12;3415:52;3503:9;3490:23;3532:18;3573:2;3565:6;3562:14;3559:34;;;3589:1;3586;3579:12;3559:34;3627:6;3616:9;3612:22;3602:32;;3672:7;3665:4;3661:2;3657:13;3653:27;3643:55;;3694:1;3691;3684:12;3643:55;3730:2;3717:16;3752:2;3748;3745:10;3742:36;;;3758:18;;:::i;:::-;3804:2;3801:1;3797:10;3787:20;;3827:28;3851:2;3847;3843:11;3827:28;:::i;:::-;3889:15;;;3920:12;;;;3952:11;;;3982;;;3978:20;;3975:33;-1:-1:-1;3972:53:1;;;4021:1;4018;4011:12;3972:53;4043:1;4034:10;;4053:163;4067:2;4064:1;4061:9;4053:163;;;4124:17;;4112:30;;4085:1;4078:9;;;;;4162:12;;;;4194;;4053:163;;;-1:-1:-1;4235:5:1;3289:957;-1:-1:-1;;;;;;;;3289:957:1:o;4251:245::-;4309:6;4362:2;4350:9;4341:7;4337:23;4333:32;4330:52;;;4378:1;4375;4368:12;4330:52;4417:9;4404:23;4436:30;4460:5;4436:30;:::i;4501:249::-;4570:6;4623:2;4611:9;4602:7;4598:23;4594:32;4591:52;;;4639:1;4636;4629:12;4591:52;4671:9;4665:16;4690:30;4714:5;4690:30;:::i;5038:592::-;5109:6;5117;5170:2;5158:9;5149:7;5145:23;5141:32;5138:52;;;5186:1;5183;5176:12;5138:52;5226:9;5213:23;5255:18;5296:2;5288:6;5285:14;5282:34;;;5312:1;5309;5302:12;5282:34;5350:6;5339:9;5335:22;5325:32;;5395:7;5388:4;5384:2;5380:13;5376:27;5366:55;;5417:1;5414;5407:12;5366:55;5457:2;5444:16;5483:2;5475:6;5472:14;5469:34;;;5499:1;5496;5489:12;5469:34;5544:7;5539:2;5530:6;5526:2;5522:15;5518:24;5515:37;5512:57;;;5565:1;5562;5555:12;5512:57;5596:2;5588:11;;;;;5618:6;;-1:-1:-1;5038:592:1;;-1:-1:-1;;;;5038:592:1:o;5635:180::-;5694:6;5747:2;5735:9;5726:7;5722:23;5718:32;5715:52;;;5763:1;5760;5753:12;5715:52;-1:-1:-1;5786:23:1;;5635:180;-1:-1:-1;5635:180:1:o;5820:248::-;5888:6;5896;5949:2;5937:9;5928:7;5924:23;5920:32;5917:52;;;5965:1;5962;5955:12;5917:52;-1:-1:-1;;5988:23:1;;;6058:2;6043:18;;;6030:32;;-1:-1:-1;5820:248:1:o;6073:316::-;6114:3;6152:5;6146:12;6179:6;6174:3;6167:19;6195:63;6251:6;6244:4;6239:3;6235:14;6228:4;6221:5;6217:16;6195:63;:::i;:::-;6303:2;6291:15;6308:66;6287:88;6278:98;;;;6378:4;6274:109;;6073:316;-1:-1:-1;;6073:316:1:o;6394:185::-;6436:3;6474:5;6468:12;6489:52;6534:6;6529:3;6522:4;6515:5;6511:16;6489:52;:::i;:::-;6557:16;;;;;6394:185;-1:-1:-1;;6394:185:1:o;6702:1416::-;6979:3;7008:1;7041:6;7035:13;7071:3;7093:1;7121:9;7117:2;7113:18;7103:28;;7181:2;7170:9;7166:18;7203;7193:61;;7247:4;7239:6;7235:17;7225:27;;7193:61;7273:2;7321;7313:6;7310:14;7290:18;7287:38;7284:222;;;7360:77;7355:3;7348:90;7461:4;7458:1;7451:15;7491:4;7486:3;7479:17;7284:222;7522:18;7549:162;;;;7725:1;7720:320;;;;7515:525;;7549:162;7597:66;7586:9;7582:82;7577:3;7570:95;7694:6;7689:3;7685:16;7678:23;;7549:162;;7720:320;20520:1;20513:14;;;20557:4;20544:18;;7815:1;7829:165;7843:6;7840:1;7837:13;7829:165;;;7921:14;;7908:11;;;7901:35;7964:16;;;;7858:10;;7829:165;;;7833:3;;8023:6;8018:3;8014:16;8007:23;;7515:525;;;;;;;8056:56;8081:30;8107:3;8099:6;8081:30;:::i;:::-;6656:7;6644:20;;6689:1;6680:11;;6584:113;8056:56;8049:63;6702:1416;-1:-1:-1;;;;;6702:1416:1:o;8564:511::-;8758:4;-1:-1:-1;;;;;8868:2:1;8860:6;8856:15;8845:9;8838:34;8920:2;8912:6;8908:15;8903:2;8892:9;8888:18;8881:43;;8960:6;8955:2;8944:9;8940:18;8933:34;9003:3;8998:2;8987:9;8983:18;8976:31;9024:45;9064:3;9053:9;9049:19;9041:6;9024:45;:::i;:::-;9016:53;8564:511;-1:-1:-1;;;;;;8564:511:1:o;9382:642::-;9547:2;9599:21;;;9669:13;;9572:18;;;9691:22;;;9518:4;;9547:2;9770:15;;;;9744:2;9729:18;;;9518:4;9813:185;9827:6;9824:1;9821:13;9813:185;;;9902:13;;9895:21;9888:29;9876:42;;9973:15;;;;9938:12;;;;9849:1;9842:9;9813:185;;;-1:-1:-1;10015:3:1;;9382:642;-1:-1:-1;;;;;;9382:642:1:o;10029:632::-;10200:2;10252:21;;;10322:13;;10225:18;;;10344:22;;;10171:4;;10200:2;10423:15;;;;10397:2;10382:18;;;10171:4;10466:169;10480:6;10477:1;10474:13;10466:169;;;10541:13;;10529:26;;10610:15;;;;10575:12;;;;10502:1;10495:9;10466:169;;11357:219;11506:2;11495:9;11488:21;11469:4;11526:44;11566:2;11555:9;11551:18;11543:6;11526:44;:::i;20108:334::-;20179:2;20173:9;20235:2;20225:13;;20240:66;20221:86;20209:99;;20338:18;20323:34;;20359:22;;;20320:62;20317:88;;;20385:18;;:::i;:::-;20421:2;20414:22;20108:334;;-1:-1:-1;20108:334:1:o;20573:128::-;20613:3;20644:1;20640:6;20637:1;20634:13;20631:39;;;20650:18;;:::i;:::-;-1:-1:-1;20686:9:1;;20573:128::o;20706:120::-;20746:1;20772;20762:35;;20777:18;;:::i;:::-;-1:-1:-1;20811:9:1;;20706:120::o;20831:228::-;20871:7;20997:1;20929:66;20925:74;20922:1;20919:81;20914:1;20907:9;20900:17;20896:105;20893:131;;;21004:18;;:::i;:::-;-1:-1:-1;21044:9:1;;20831:228::o;21064:125::-;21104:4;21132:1;21129;21126:8;21123:34;;;21137:18;;:::i;:::-;-1:-1:-1;21174:9:1;;21064:125::o;21194:258::-;21266:1;21276:113;21290:6;21287:1;21284:13;21276:113;;;21366:11;;;21360:18;21347:11;;;21340:39;21312:2;21305:10;21276:113;;;21407:6;21404:1;21401:13;21398:48;;;-1:-1:-1;;21442:1:1;21424:16;;21417:27;21194:258::o;21457:196::-;21496:3;21524:5;21514:39;;21533:18;;:::i;:::-;-1:-1:-1;21580:66:1;21569:78;;21457:196::o;21658:437::-;21737:1;21733:12;;;;21780;;;21801:61;;21855:4;21847:6;21843:17;21833:27;;21801:61;21908:2;21900:6;21897:14;21877:18;21874:38;21871:218;;;21945:77;21942:1;21935:88;22046:4;22043:1;22036:15;22074:4;22071:1;22064:15;21871:218;;21658:437;;;:::o;22100:197::-;22138:3;22166:6;22207:2;22200:5;22196:14;22234:2;22225:7;22222:15;22219:41;;;22240:18;;:::i;:::-;22289:1;22276:15;;22100:197;-1:-1:-1;;;22100:197:1:o;22302:195::-;22341:3;22372:66;22365:5;22362:77;22359:103;;;22442:18;;:::i;:::-;-1:-1:-1;22489:1:1;22478:13;;22302:195::o;22502:112::-;22534:1;22560;22550:35;;22565:18;;:::i;:::-;-1:-1:-1;22599:9:1;;22502:112::o;22619:184::-;22671:77;22668:1;22661:88;22768:4;22765:1;22758:15;22792:4;22789:1;22782:15;22808:184;22860:77;22857:1;22850:88;22957:4;22954:1;22947:15;22981:4;22978:1;22971:15;22997:184;23049:77;23046:1;23039:88;23146:4;23143:1;23136:15;23170:4;23167:1;23160:15;23186:184;23238:77;23235:1;23228:88;23335:4;23332:1;23325:15;23359:4;23356:1;23349:15;23375:154;-1:-1:-1;;;;;23454:5:1;23450:54;23443:5;23440:65;23430:93;;23519:1;23516;23509:12;23534:177;23619:66;23612:5;23608:78;23601:5;23598:89;23588:117;;23701:1;23698;23691:12

Swarm Source

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