Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
Qzuki
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-02-01 */ // Sources flattened with hardhat v2.12.6 https://hardhat.org // File @openzeppelin/contracts-upgradeable/utils/[email protected] // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @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 functionCallWithValue(target, data, 0, "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"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or 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 { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // 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-upgradeable/proxy/utils/[email protected] // OpenZeppelin Contracts (last updated v4.8.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ``` * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. * * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a * constructor. * * Emits an {Initialized} event. */ modifier initializer() { bool isTopLevelCall = !_initializing; require( (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1), "Initializable: contract is already initialized" ); _initialized = 1; if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * A reinitializer may be used after the original initialization step. This is essential to configure modules that * are added through upgrades and that require initialization. * * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer` * cannot be nested. If one is invoked in the context of another, execution will revert. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. * * WARNING: setting the version to 255 will prevent any future reinitialization. * * Emits an {Initialized} event. */ modifier reinitializer(uint8 version) { require(!_initializing && _initialized < version, "Initializable: contract is already initialized"); _initialized = version; _initializing = true; _; _initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. * * Emits an {Initialized} event the first time it is successfully executed. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); if (_initialized < type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } /** * @dev Internal function that returns the initialized version. Returns `_initialized` */ function _getInitializedVersion() internal view returns (uint8) { return _initialized; } /** * @dev Internal function that returns the initialized version. Returns `_initializing` */ function _isInitializing() internal view returns (bool) { return _initializing; } } // File @openzeppelin/contracts-upgradeable/utils/[email protected] // 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 ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/access/[email protected] // 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 OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal onlyInitializing { __Ownable_init_unchained(); } function __Ownable_init_unchained() internal onlyInitializing { _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); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; } // File @openzeppelin/contracts-upgradeable/utils/cryptography/[email protected] // OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The tree and the proofs can be generated using our * https://github.com/OpenZeppelin/merkle-tree[JavaScript library]. * You will find a quickstart guide in the readme. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. * OpenZeppelin's JavaScript library generates merkle trees that are safe * against this attack out of the box. */ library MerkleProofUpgradeable { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} * * _Available since v4.7._ */ function verifyCalldata( bytes32[] calldata proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} * * _Available since v4.7._ */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false * respectively. * * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer). * * _Available since v4.7._ */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } // File erc721a-upgradeable/contracts/[email protected] pragma solidity ^0.8.0; /** * @dev This is a base storage for the initialization function for upgradeable diamond facet contracts **/ library ERC721A__InitializableStorage { struct Layout { /* * Indicates that the contract has been initialized. */ bool _initialized; /* * Indicates that the contract is in the process of being initialized. */ bool _initializing; } bytes32 internal constant STORAGE_SLOT = keccak256('ERC721A.contracts.storage.initializable.facet'); function layout() internal pure returns (Layout storage l) { bytes32 slot = STORAGE_SLOT; assembly { l.slot := slot } } } // File erc721a-upgradeable/contracts/[email protected] pragma solidity ^0.8.0; /** * @dev This is a base contract to aid in writing upgradeable diamond facet contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. */ abstract contract ERC721A__Initializable { using ERC721A__InitializableStorage for ERC721A__InitializableStorage.Layout; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializerERC721A() { // If the contract is initializing we ignore whether _initialized is set in order to support multiple // inheritance patterns, but we only do this in the context of a constructor, because in other contexts the // contract may have been reentered. require( ERC721A__InitializableStorage.layout()._initializing ? _isConstructor() : !ERC721A__InitializableStorage.layout()._initialized, 'ERC721A__Initializable: contract is already initialized' ); bool isTopLevelCall = !ERC721A__InitializableStorage.layout()._initializing; if (isTopLevelCall) { ERC721A__InitializableStorage.layout()._initializing = true; ERC721A__InitializableStorage.layout()._initialized = true; } _; if (isTopLevelCall) { ERC721A__InitializableStorage.layout()._initializing = false; } } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} modifier, directly or indirectly. */ modifier onlyInitializingERC721A() { require( ERC721A__InitializableStorage.layout()._initializing, 'ERC721A__Initializable: contract is not initializing' ); _; } /// @dev Returns true if and only if the function is running in the constructor function _isConstructor() private view returns (bool) { // extcodesize checks the size of the code stored in an address, and // address returns the current address. Since the code is still not // deployed when running a constructor, any checks on its code size will // yield zero, making it an effective way to detect if a contract is // under construction or not. address self = address(this); uint256 cs; assembly { cs := extcodesize(self) } return cs == 0; } } // File erc721a-upgradeable/contracts/[email protected] pragma solidity ^0.8.0; library ERC721AStorage { // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364). struct TokenApprovalRef { address value; } struct Layout { // ============================================================= // STORAGE // ============================================================= // The next token ID to be minted. uint256 _currentIndex; // The number of tokens burned. uint256 _burnCounter; // Token name string _name; // Token symbol string _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See {_packedOwnershipOf} implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => ERC721AStorage.TokenApprovalRef) _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) _operatorApprovals; } bytes32 internal constant STORAGE_SLOT = keccak256('ERC721A.contracts.storage.ERC721A'); function layout() internal pure returns (Layout storage l) { bytes32 slot = STORAGE_SLOT; assembly { l.slot := slot } } } // File erc721a-upgradeable/contracts/[email protected] // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721A. */ interface IERC721AUpgradeable { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================================================= // IERC721 // ============================================================= /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables * (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, * checking first that contract recipients are aware of the ERC721 protocol * to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move * this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external payable; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Transfers `tokenId` 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 payable; /** * @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 payable; /** * @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); // ============================================================= // IERC721Metadata // ============================================================= /** * @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); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } // File erc721a-upgradeable/contracts/[email protected] // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721 token receiver. */ interface ERC721A__IERC721ReceiverUpgradeable { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC721A * * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721) * Non-Fungible Token Standard, including the Metadata extension. * Optimized for lower gas during batch mints. * * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...) * starting from `_startTokenId()`. * * Assumptions: * * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721AUpgradeable is ERC721A__Initializable, IERC721AUpgradeable { using ERC721AStorage for ERC721AStorage.Layout; // ============================================================= // CONSTANTS // ============================================================= // Mask of an entry in packed address data. uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant _BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant _BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant _BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant _BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant _BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant _BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with {_mintERC2309}. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309} // is required to cause an overflow, which is unrealistic. uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // ============================================================= // CONSTRUCTOR // ============================================================= function __ERC721A_init(string memory name_, string memory symbol_) internal onlyInitializingERC721A { __ERC721A_init_unchained(name_, symbol_); } function __ERC721A_init_unchained(string memory name_, string memory symbol_) internal onlyInitializingERC721A { ERC721AStorage.layout()._name = name_; ERC721AStorage.layout()._symbol = symbol_; ERC721AStorage.layout()._currentIndex = _startTokenId(); } // ============================================================= // TOKEN COUNTING OPERATIONS // ============================================================= /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view virtual returns (uint256) { return ERC721AStorage.layout()._currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() public view virtual override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return ERC721AStorage.layout()._currentIndex - ERC721AStorage.layout()._burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view virtual returns (uint256) { // Counter underflow is impossible as `_currentIndex` does not decrement, // and it is initialized to `_startTokenId()`. unchecked { return ERC721AStorage.layout()._currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view virtual returns (uint256) { return ERC721AStorage.layout()._burnCounter; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return ERC721AStorage.layout()._packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (ERC721AStorage.layout()._packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (ERC721AStorage.layout()._packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(ERC721AStorage.layout()._packedAddressData[owner] >> _BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal virtual { uint256 packed = ERC721AStorage.layout()._packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); ERC721AStorage.layout()._packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes // of the XOR of all function selectors in the interface. // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165) // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`) return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return ERC721AStorage.layout()._name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return ERC721AStorage.layout()._symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(ERC721AStorage.layout()._packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (ERC721AStorage.layout()._packedOwnerships[index] == 0) { ERC721AStorage.layout()._packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256 packed) { if (_startTokenId() <= tokenId) { packed = ERC721AStorage.layout()._packedOwnerships[tokenId]; // If not burned. if (packed & _BITMASK_BURNED == 0) { // If the data at the starting slot does not exist, start the scan. if (packed == 0) { if (tokenId >= ERC721AStorage.layout()._currentIndex) revert OwnerQueryForNonexistentToken(); // Invariant: // There will always be an initialized ownership slot // (i.e. `ownership.addr != address(0) && ownership.burned == false`) // before an unintialized ownership slot // (i.e. `ownership.addr == address(0) && ownership.burned == false`) // Hence, `tokenId` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. for (;;) { unchecked { packed = ERC721AStorage.layout()._packedOwnerships[--tokenId]; } if (packed == 0) continue; return packed; } } // Otherwise, the data exists and is not burned. We can skip the scan. // This is possible because we have already achieved the target condition. // This saves 2143 gas on transfers of initialized tokens. return packed; } } revert OwnerQueryForNonexistentToken(); } /** * @dev Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`. result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. See {ERC721A-_approve}. * * Requirements: * * - The caller must own the token or be an approved operator. */ function approve(address to, uint256 tokenId) public payable virtual override { _approve(to, tokenId, true); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return ERC721AStorage.layout()._tokenApprovals[tokenId].value; } /** * @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) public virtual override { ERC721AStorage.layout()._operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return ERC721AStorage.layout()._operatorApprovals[owner][operator]; } /** * @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. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _startTokenId() <= tokenId && tokenId < ERC721AStorage.layout()._currentIndex && // If within bounds, ERC721AStorage.layout()._packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned. } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { ERC721AStorage.TokenApprovalRef storage tokenApproval = ERC721AStorage.layout()._tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) public payable virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --ERC721AStorage.layout()._packedAddressData[from]; // Updates: `balance -= 1`. ++ERC721AStorage.layout()._packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. ERC721AStorage.layout()._packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (ERC721AStorage.layout()._packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != ERC721AStorage.layout()._currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. ERC721AStorage.layout()._packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public payable virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @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 memory _data ) public payable virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Hook that is called before a set of serially-ordered token IDs * are about to be transferred. This includes minting. * And also called before burning one token. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token IDs * have been transferred. This includes minting. * And also called after one token has been burned. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns whether the call correctly returned the expected magic value. */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721ReceiverUpgradeable(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (bytes4 retval) { return retval == ERC721A__IERC721ReceiverUpgradeable(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = ERC721AStorage.layout()._currentIndex; if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. ERC721AStorage.layout()._packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. ERC721AStorage.layout()._packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 toMasked; uint256 end = startTokenId + quantity; // Use assembly to loop and emit the `Transfer` event for gas savings. // The duplicated `log4` removes an extra check and reduces stack juggling. // The assembly, together with the surrounding Solidity code, have been // delicately arranged to nudge the compiler into producing optimized opcodes. assembly { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(to, _BITMASK_ADDRESS) // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. startTokenId // `tokenId`. ) // The `iszero(eq(,))` check ensures that large values of `quantity` // that overflows uint256 will make the loop run out of gas. // The compiler will optimize the `iszero` away for performance. for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { // Emit the `Transfer` event. Similar to above. log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } if (toMasked == 0) revert MintToZeroAddress(); ERC721AStorage.layout()._currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = ERC721AStorage.layout()._currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. ERC721AStorage.layout()._packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. ERC721AStorage.layout()._packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); ERC721AStorage.layout()._currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = ERC721AStorage.layout()._currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (ERC721AStorage.layout()._currentIndex != end) revert(); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @dev Equivalent to `_approve(to, tokenId, false)`. */ function _approve(address to, uint256 tokenId) internal virtual { _approve(to, tokenId, false); } /** * @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: * * - `tokenId` must exist. * * Emits an {Approval} event. */ function _approve( address to, uint256 tokenId, bool approvalCheck ) internal virtual { address owner = ownerOf(tokenId); if (approvalCheck) if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } ERC721AStorage.layout()._tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. ERC721AStorage.layout()._packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. ERC721AStorage.layout()._packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (ERC721AStorage.layout()._packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != ERC721AStorage.layout()._currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. ERC721AStorage.layout()._packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { ERC721AStorage.layout()._burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = ERC721AStorage.layout()._packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); ERC721AStorage.layout()._packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function _toString(uint256 value) internal pure virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), but // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned. // We will need 1 word for the trailing zeros padding, 1 word for the length, // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0. let m := add(mload(0x40), 0xa0) // Update the free memory pointer to allocate. mstore(0x40, m) // Assign the `str` to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } } // File contracts/Qzuki.sol pragma solidity ^0.8.4; contract Qzuki is ERC721AUpgradeable, OwnableUpgradeable { uint16 constant public MAX_AMOUNT = 10000; uint16 constant public AZUKI_MINT_AMOUNT = 3000; uint16 constant public BEANZ_MINT_AMOUNT = 2000; uint16 constant public TEAM_HOLD_NUM = 500; uint256 public constant PRICE = 10000000000000000;//0.01ETH address private AZUKI_ADDR; address private BEANZ_ADDR; uint8 public mintStatus; string private baseURI; bytes32 private whitelistMerkleRoot; mapping(address => bool) public whitelistMintedList; mapping(uint16 => bool) public mintByAzukiList; mapping(uint16 => bool) public mintByBeanzList; uint16 public azukiRemainCount; uint16 public beanzRemainCount; mapping(address => bool) public publicMintedList; // Take note of the initializer modifiers. // - `initializerERC721A` for `ERC721AUpgradeable`. // - `initializer` for OpenZeppelin's `OwnableUpgradeable`. function initialize(string memory name, string memory symbol, string memory baseURI_, address azuki, address beanz) initializerERC721A initializer public { __ERC721A_init(name, symbol); __Ownable_init(); baseURI = baseURI_; AZUKI_ADDR = azuki; BEANZ_ADDR = beanz; azukiRemainCount = AZUKI_MINT_AMOUNT; beanzRemainCount = BEANZ_MINT_AMOUNT; } function changeBaseURI(string memory newUri) public onlyOwner { baseURI = newUri; } function _baseURI() internal view virtual override returns (string memory) { return baseURI; } function updateMintStatus(uint8 status) public onlyOwner { mintStatus = status; } function updateWhitelistMerkleRoot(bytes32 root) public onlyOwner { whitelistMerkleRoot = root; } function whitelistMint(bytes32[] memory proof) public { require(mintStatus == 1, "Whitelist Mint is not available"); require(getAvailable() > 0, "No more NFT"); require(checkWhitelist(whitelistMerkleRoot, proof), "You are not in whitelist"); require(!whitelistMintedList[_msgSender()], "You have minted"); whitelistMintedList[_msgSender()] = true; _safeMint(_msgSender(), 1); } function holderMint(address to, uint16[] memory azukiTokenIds, uint16[] memory beanzTokenIds) public { require(mintStatus == 2, "Holder Mint is not available"); require(to != address(0), "Can't mint to empty address"); uint16 azukiNum=0; uint16 beanzNum=0; //check azuki tokenIds for (uint i = 0; i < azukiTokenIds.length; i++) { require(!mintByAzukiList[azukiTokenIds[i]], "Azuki tokenId is used"); require(IERC721AUpgradeable(AZUKI_ADDR).ownerOf(azukiTokenIds[i]) == to, "Don't have this nft"); mintByAzukiList[azukiTokenIds[i]] = true; azukiNum += 2; if(azukiNum >= azukiRemainCount){ azukiNum = azukiRemainCount; break; } } //check beanz tokenIds for (uint i = 0; i < beanzTokenIds.length; i++) { require(!mintByBeanzList[beanzTokenIds[i]], "BEANZ tokenId is used"); require(IERC721AUpgradeable(BEANZ_ADDR).ownerOf(beanzTokenIds[i]) == to, "Don't have this nft"); mintByBeanzList[beanzTokenIds[i]] = true; beanzNum++; if(beanzNum >= beanzRemainCount){ beanzNum = beanzRemainCount; break; } } //check num uint16 mintNum = azukiNum + beanzNum; require(mintNum > 0, "Reached holder mint max supply"); require(mintNum <= 10, "One can only mint 10"); //mint _safeMint(to, (uint256)(mintNum)); //update remain count if(azukiNum > 0){ azukiRemainCount -= azukiNum; } if(beanzNum > 0){ beanzRemainCount -= beanzNum; } } function publicMint() public payable { require(mintStatus == 3, "Public Mint is not available!"); require(tx.origin == _msgSender(), "The caller is another contract!"); require(getAvailable() > 0, "No more NFT!"); require(!publicMintedList[_msgSender()], "You have minted!"); require(PRICE == msg.value, "Insufficient value!"); publicMintedList[_msgSender()] = true; _safeMint(_msgSender(), 1); } function withdraw() public onlyOwner { uint balance = address(this).balance; payable(_msgSender()).transfer(balance); } function ownerMint(bool mintBeforeHolderMint,address[] memory accounts, uint16[] memory nums) public onlyOwner { require(accounts.length > 0 && accounts.length == nums.length, "Length not match"); uint16 mintNum = 0; for (uint i = 0; i < accounts.length; i++) { _safeMint(accounts[i], nums[i]); mintNum += nums[i]; } require(_totalMinted() <= MAX_AMOUNT, "No more NFT"); if(mintBeforeHolderMint){ azukiRemainCount -= mintNum; } } function getAvailable() public view returns (uint16) { if(MAX_AMOUNT >= ((uint16)(_totalMinted()) + TEAM_HOLD_NUM)){ return MAX_AMOUNT - (uint16)(_totalMinted()) - TEAM_HOLD_NUM; } return 0; } function checkTokensMinted(uint16[] memory tokenIds, bool azuki) public view returns (bool[] memory) { bool[] memory results = new bool[](tokenIds.length); for (uint i = 0; i < tokenIds.length; i++) { if (azuki) { results[i] = mintByAzukiList[tokenIds[i]]; } else { results[i] = mintByBeanzList[tokenIds[i]]; } } return results; } function checkWhitelist(bytes32 root, bytes32[] memory proof) public view returns (bool){ return MerkleProofUpgradeable.verify(proof, root, keccak256(abi.encodePacked(_msgSender()))); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"AZUKI_MINT_AMOUNT","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BEANZ_MINT_AMOUNT","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_AMOUNT","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TEAM_HOLD_NUM","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"azukiRemainCount","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beanzRemainCount","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"newUri","type":"string"}],"name":"changeBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"tokenIds","type":"uint16[]"},{"internalType":"bool","name":"azuki","type":"bool"}],"name":"checkTokensMinted","outputs":[{"internalType":"bool[]","name":"","type":"bool[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"root","type":"bytes32"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"checkWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"getAvailable","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint16[]","name":"azukiTokenIds","type":"uint16[]"},{"internalType":"uint16[]","name":"beanzTokenIds","type":"uint16[]"}],"name":"holderMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"baseURI_","type":"string"},{"internalType":"address","name":"azuki","type":"address"},{"internalType":"address","name":"beanz","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"mintByAzukiList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"mintByBeanzList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintStatus","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"mintBeforeHolderMint","type":"bool"},{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint16[]","name":"nums","type":"uint16[]"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"publicMintedList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"status","type":"uint8"}],"name":"updateMintStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"updateWhitelistMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistMintedList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50612ecf806100206000396000f3fe6080604052600436106102465760003560e01c8063715018a611610139578063b88d4fde116100b6578063d6d0faee1161007a578063d6d0faee146106b2578063e985e9c5146106d2578063f2fde38b146106f2578063f78ebbed14610712578063f905f15414610732578063f9cc06051461075257600080fd5b8063b88d4fde14610609578063c87b56dd1461061c578063cf2806d21461063c578063d1dbd7651461066c578063d40dc8701461069c57600080fd5b806395d89b41116100fd57806395d89b41146105665780639cfc53861461057b5780639da3f8fd14610596578063a22cb465146105c9578063b138e155146105e957600080fd5b8063715018a6146104bb57806378268c3e146104d057806380ac49e5146105005780638d859f3e1461052d5780638da5cb5b1461054857600080fd5b806339a0c6f9116101c75780636352211e1161018b5780636352211e146104155780636957637b1461043557806369def03f146104555780636e654ea11461048557806370a082311461049b57600080fd5b806339a0c6f9146103975780633ccfd60b146103b757806342842e0e146103cc57806356ab4243146103df5780635f1cf0e2146103ff57600080fd5b80631a1b979d1161020e5780631a1b979d1461031257806323b872dd1461034657806326092b8314610359578063372f657c146103615780633880292a1461038157600080fd5b806301ffc9a71461024b57806306fdde0314610280578063081812fc146102a2578063095ea7b3146102da57806318160ddd146102ef575b600080fd5b34801561025757600080fd5b5061026b6102663660046124f1565b610767565b60405190151581526020015b60405180910390f35b34801561028c57600080fd5b506102956107b9565b6040516102779190612566565b3480156102ae57600080fd5b506102c26102bd366004612579565b610854565b6040516001600160a01b039091168152602001610277565b6102ed6102e83660046125a7565b6108a1565b005b3480156102fb57600080fd5b506103046108b1565b604051908152602001610277565b34801561031e57600080fd5b50606c546103339062010000900461ffff1681565b60405161ffff9091168152602001610277565b6102ed6103543660046125d3565b6108d0565b6102ed610ac0565b34801561036d57600080fd5b506102ed61037c3660046126e8565b610c81565b34801561038d57600080fd5b50610333610bb881565b3480156103a357600080fd5b506102ed6103b2366004612793565b610df6565b3480156103c357600080fd5b506102ed610e11565b6102ed6103da3660046125d3565b610e48565b3480156103eb57600080fd5b506102ed6103fa36600461283b565b610e68565b34801561040b57600080fd5b506103336107d081565b34801561042157600080fd5b506102c2610430366004612579565b611457565b34801561044157600080fd5b506102ed610450366004612579565b611462565b34801561046157600080fd5b5061026b6104703660046128b0565b606d6020526000908152604090205460ff1681565b34801561049157600080fd5b506103336101f481565b3480156104a757600080fd5b506103046104b63660046128b0565b61146f565b3480156104c757600080fd5b506102ed6114d7565b3480156104dc57600080fd5b5061026b6104eb3660046128cd565b606b6020526000908152604090205460ff1681565b34801561050c57600080fd5b5061052061051b3660046128f8565b6114e9565b6040516102779190612945565b34801561053957600080fd5b50610304662386f26fc1000081565b34801561055457600080fd5b506033546001600160a01b03166102c2565b34801561057257600080fd5b5061029561162c565b34801561058757600080fd5b50606c546103339061ffff1681565b3480156105a257600080fd5b506066546105b790600160a01b900460ff1681565b60405160ff9091168152602001610277565b3480156105d557600080fd5b506102ed6105e436600461298b565b611644565b3480156105f557600080fd5b5061026b6106043660046129b7565b6116c1565b6102ed6106173660046129fd565b61170c565b34801561062857600080fd5b50610295610637366004612579565b611756565b34801561064857600080fd5b5061026b6106573660046128cd565b606a6020526000908152604090205460ff1681565b34801561067857600080fd5b5061026b6106873660046128b0565b60696020526000908152604090205460ff1681565b3480156106a857600080fd5b5061033361271081565b3480156106be57600080fd5b506102ed6106cd366004612a7c565b6117da565b3480156106de57600080fd5b5061026b6106ed366004612b2b565b611a59565b3480156106fe57600080fd5b506102ed61070d3660046128b0565b611a96565b34801561071e57600080fd5b506102ed61072d366004612b64565b611b0c565b34801561073e57600080fd5b506102ed61074d366004612c2d565b611c72565b34801561075e57600080fd5b50610333611c9a565b60006301ffc9a760e01b6001600160e01b03198316148061079857506380ac58cd60e01b6001600160e01b03198316145b806107b35750635b5e139f60e01b6001600160e01b03198316145b92915050565b60606107c3611ce9565b60020180546107d190612c50565b80601f01602080910402602001604051908101604052809291908181526020018280546107fd90612c50565b801561084a5780601f1061081f5761010080835404028352916020019161084a565b820191906000526020600020905b81548152906001019060200180831161082d57829003601f168201915b5050505050905090565b600061085f82611d0d565b61087c576040516333d1c03960e21b815260040160405180910390fd5b610884611ce9565b60009283526006016020525060409020546001600160a01b031690565b6108ad82826001611d49565b5050565b6000806108bc611ce9565b600101546108c8611ce9565b540303919050565b60006108db82611dfe565b9050836001600160a01b0316816001600160a01b03161461090e5760405162a1148160e81b815260040160405180910390fd5b60008061091a84611ea1565b9150915061093f818761092a3390565b6001600160a01b039081169116811491141790565b61096a5761094d8633611a59565b61096a57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03851661099157604051633a954ecd60e21b815260040160405180910390fd5b801561099c57600082555b6109a4611ce9565b6001600160a01b03871660009081526005919091016020526040902080546000190190556109d0611ce9565b6001600160a01b03861660008181526005929092016020526040909120805460010190554260a01b17600160e11b17610a07611ce9565b60008681526004919091016020526040902055600160e11b8316610a765760018401610a31611ce9565b60008281526004919091016020526040902054610a7457610a50611ce9565b548114610a745783610a60611ce9565b600083815260049190910160205260409020555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b606654600160a01b900460ff16600314610b215760405162461bcd60e51b815260206004820152601d60248201527f5075626c6963204d696e74206973206e6f7420617661696c61626c652100000060448201526064015b60405180910390fd5b323314610b705760405162461bcd60e51b815260206004820152601f60248201527f5468652063616c6c657220697320616e6f7468657220636f6e747261637421006044820152606401610b18565b6000610b7a611c9a565b61ffff1611610bba5760405162461bcd60e51b815260206004820152600c60248201526b4e6f206d6f7265204e46542160a01b6044820152606401610b18565b336000908152606d602052604090205460ff1615610c0d5760405162461bcd60e51b815260206004820152601060248201526f596f752068617665206d696e7465642160801b6044820152606401610b18565b34662386f26fc1000014610c595760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742076616c75652160681b6044820152606401610b18565b336000818152606d60205260409020805460ff19166001179055610c7f905b6001611ec9565b565b606654600160a01b900460ff16600114610cdd5760405162461bcd60e51b815260206004820152601f60248201527f57686974656c697374204d696e74206973206e6f7420617661696c61626c65006044820152606401610b18565b6000610ce7611c9a565b61ffff1611610d265760405162461bcd60e51b815260206004820152600b60248201526a139bc81b5bdc994813919560aa1b6044820152606401610b18565b610d32606854826116c1565b610d7e5760405162461bcd60e51b815260206004820152601860248201527f596f7520617265206e6f7420696e2077686974656c69737400000000000000006044820152606401610b18565b3360009081526069602052604090205460ff1615610dd05760405162461bcd60e51b815260206004820152600f60248201526e165bdd481a185d99481b5a5b9d1959608a1b6044820152606401610b18565b336000818152606960205260409020805460ff19166001179055610df390610c78565b50565b610dfe611ee3565b80516108ad906067906020840190612442565b610e19611ee3565b6040514790339082156108fc029083906000818181858888f193505050501580156108ad573d6000803e3d6000fd5b610e638383836040518060200160405280600081525061170c565b505050565b606654600160a01b900460ff16600214610ec45760405162461bcd60e51b815260206004820152601c60248201527f486f6c646572204d696e74206973206e6f7420617661696c61626c65000000006044820152606401610b18565b6001600160a01b038316610f1a5760405162461bcd60e51b815260206004820152601b60248201527f43616e2774206d696e7420746f20656d707479206164647265737300000000006044820152606401610b18565b60008060005b845181101561111057606a6000868381518110610f3f57610f3f612c8b565b60209081029190910181015161ffff1682528101919091526040016000205460ff1615610fa65760405162461bcd60e51b8152602060048201526015602482015274105e9d5ada481d1bdad95b9259081a5cc81d5cd959605a1b6044820152606401610b18565b60655485516001600160a01b03808916921690636352211e90889085908110610fd157610fd1612c8b565b60200260200101516040518263ffffffff1660e01b8152600401610fff919061ffff91909116815260200190565b602060405180830381865afa15801561101c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110409190612ca1565b6001600160a01b03161461108c5760405162461bcd60e51b8152602060048201526013602482015272111bdb89dd081a185d99481d1a1a5cc81b999d606a1b6044820152606401610b18565b6001606a60008784815181106110a4576110a4612c8b565b60209081029190910181015161ffff168252810191909152604001600020805460ff19169115159190911790556110dc600284612cd4565b606c5490935061ffff908116908416106110fe57606c5461ffff169250611110565b8061110881612cfa565b915050610f20565b5060005b835181101561131157606b600085838151811061113357611133612c8b565b60209081029190910181015161ffff1682528101919091526040016000205460ff161561119a5760405162461bcd60e51b81526020600482015260156024820152741091505396881d1bdad95b9259081a5cc81d5cd959605a1b6044820152606401610b18565b60665484516001600160a01b03808916921690636352211e908790859081106111c5576111c5612c8b565b60200260200101516040518263ffffffff1660e01b81526004016111f3919061ffff91909116815260200190565b602060405180830381865afa158015611210573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112349190612ca1565b6001600160a01b0316146112805760405162461bcd60e51b8152602060048201526013602482015272111bdb89dd081a185d99481d1a1a5cc81b999d606a1b6044820152606401610b18565b6001606b600086848151811061129857611298612c8b565b60209081029190910181015161ffff168252810191909152604001600020805460ff1916911515919091179055816112cf81612d15565b606c5490935061ffff6201000090910481169084161090506112ff57606c5462010000900461ffff169150611311565b8061130981612cfa565b915050611114565b50600061131e8284612cd4565b905060008161ffff16116113745760405162461bcd60e51b815260206004820152601e60248201527f5265616368656420686f6c646572206d696e74206d617820737570706c7900006044820152606401610b18565b600a8161ffff1611156113c05760405162461bcd60e51b815260206004820152601460248201527304f6e652063616e206f6e6c79206d696e742031360641b6044820152606401610b18565b6113ce868261ffff16611ec9565b61ffff83161561140c57606c80548491906000906113f190849061ffff16612d37565b92506101000a81548161ffff021916908361ffff1602179055505b61ffff821615610ab85781606c60028282829054906101000a900461ffff166114359190612d37565b92506101000a81548161ffff021916908361ffff160217905550505050505050565b60006107b382611dfe565b61146a611ee3565b606855565b60006001600160a01b038216611498576040516323d3ad8160e21b815260040160405180910390fd5b6001600160401b036114a8611ce9565b6005016000846001600160a01b03166001600160a01b0316815260200190815260200160002054169050919050565b6114df611ee3565b610c7f6000611f3d565b6060600083516001600160401b0381111561150657611506612614565b60405190808252806020026020018201604052801561152f578160200160208202803683370190505b50905060005b84518110156116245783156115ad57606a600086838151811061155a5761155a612c8b565b602002602001015161ffff1661ffff16815260200190815260200160002060009054906101000a900460ff1682828151811061159857611598612c8b565b91151560209283029190910190910152611612565b606b60008683815181106115c3576115c3612c8b565b602002602001015161ffff1661ffff16815260200190815260200160002060009054906101000a900460ff1682828151811061160157611601612c8b565b911515602092830291909101909101525b8061161c81612cfa565b915050611535565b509392505050565b6060611636611ce9565b60030180546107d190612c50565b8061164d611ce9565b336000818152600792909201602090815260408084206001600160a01b03881680865290835293819020805460ff19169515159590951790945592518415158152919290917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6040516bffffffffffffffffffffffff193360601b166020820152600090611705908390859060340160405160208183030381529060405280519060200120611f8f565b9392505050565b6117178484846108d0565b6001600160a01b0383163b156117505761173384848484611fa5565b611750576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b606061176182611d0d565b61177e57604051630a14c4b560e41b815260040160405180910390fd5b600061178861208e565b90508051600014156117a95760405180602001604052806000815250611705565b806117b38461209d565b6040516020016117c4929190612d5a565b6040516020818303038152906040529392505050565b600080516020612e7a83398151915254610100900460ff1661180f57600080516020612e7a8339815191525460ff1615611813565b303b155b6118855760405162461bcd60e51b815260206004820152603760248201527f455243373231415f5f496e697469616c697a61626c653a20636f6e747261637460448201527f20697320616c726561647920696e697469616c697a65640000000000000000006064820152608401610b18565b600080516020612e7a83398151915254610100900460ff161580156118c157600080516020612e7a833981519152805461ffff19166101011790555b600054610100900460ff16158080156118e15750600054600160ff909116105b806118fb5750303b1580156118fb575060005460ff166001145b61195e5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610b18565b6000805460ff191660011790558015611981576000805461ff0019166101001790555b61198b87876120eb565b611993612129565b84516119a6906067906020880190612442565b50606580546001600160a01b038087166001600160a01b0319928316179092556066805492861692909116919091179055606c80546307d00bb863ffffffff199091161790558015611a32576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b508015610ab8575050600080516020612e7a833981519152805461ff001916905550505050565b6000611a63611ce9565b6001600160a01b039384166000908152600791909101602090815260408083209490951682529290925250205460ff1690565b611a9e611ee3565b6001600160a01b038116611b035760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b18565b610df381611f3d565b611b14611ee3565b60008251118015611b26575080518251145b611b655760405162461bcd60e51b815260206004820152601060248201526f098cadccee8d040dcdee840dac2e8c6d60831b6044820152606401610b18565b6000805b8351811015611beb57611bb2848281518110611b8757611b87612c8b565b6020026020010151848381518110611ba157611ba1612c8b565b602002602001015161ffff16611ec9565b828181518110611bc457611bc4612c8b565b602002602001015182611bd79190612cd4565b915080611be381612cfa565b915050611b69565b50612710611bf7612158565b1115611c335760405162461bcd60e51b815260206004820152600b60248201526a139bc81b5bdc994813919560aa1b6044820152606401610b18565b831561175057606c8054829190600090611c5290849061ffff16612d37565b92506101000a81548161ffff021916908361ffff16021790555050505050565b611c7a611ee3565b6066805460ff909216600160a01b0260ff60a01b19909216919091179055565b60006101f4611ca7612158565b611cb19190612cd4565b61ffff1661271010611ce3576101f4611cc8612158565b611cd490612710612d37565b611cde9190612d37565b905090565b50600090565b7f2569078dfb4b0305704d3008e7403993ae9601b85f7ae5e742de3de8f8011c4090565b6000611d17611ce9565b54821080156107b35750600160e01b611d2e611ce9565b60008481526004919091016020526040902054161592915050565b6000611d5483611457565b90508115611d9357336001600160a01b03821614611d9357611d768133611a59565b611d93576040516367d9dca160e11b815260040160405180910390fd5b83611d9c611ce9565b6000858152600691909101602052604080822080546001600160a01b0319166001600160a01b0394851617905551859287811692908516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259190a450505050565b6000611e08611ce9565b600083815260049190910160205260409020549050600160e01b8116611e885780611e8357611e35611ce9565b548210611e5557604051636f96cda160e11b815260040160405180910390fd5b611e5d611ce9565b6000199092016000818152600493909301602052604090922054905080611e8357611e55565b919050565b604051636f96cda160e11b815260040160405180910390fd5b6000806000611eae611ce9565b60009485526006016020525050604090912080549092909150565b6108ad82826040518060200160405280600081525061216a565b6033546001600160a01b03163314610c7f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b18565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600082611f9c85846121e7565b14949350505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611fda903390899088908890600401612d80565b6020604051808303816000875af1925050508015612015575060408051601f3d908101601f1916820190925261201291810190612dbd565b60015b612070573d808015612043576040519150601f19603f3d011682016040523d82523d6000602084013e612048565b606091505b508051612068576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060606780546107d190612c50565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a9004806120d4576120d9565b6120b7565b50819003601f19909101908152919050565b600080516020612e7a83398151915254610100900460ff1661211f5760405162461bcd60e51b8152600401610b1890612dda565b6108ad828261222c565b600054610100900460ff166121505760405162461bcd60e51b8152600401610b1890612e2e565b610c7f6122af565b600080612163611ce9565b5403919050565b61217483836122df565b6001600160a01b0383163b15610e6357600061218e611ce9565b5490508281035b6121a86000868380600101945086611fa5565b6121c5576040516368d2bf6b60e11b815260040160405180910390fd5b81811061219557816121d5611ce9565b54146121e057600080fd5b5050505050565b600081815b8451811015611624576122188286838151811061220b5761220b612c8b565b6020026020010151612413565b91508061222481612cfa565b9150506121ec565b600080516020612e7a83398151915254610100900460ff166122605760405162461bcd60e51b8152600401610b1890612dda565b81612269611ce9565b600201908051906020019061227f929190612442565b5080612289611ce9565b600301908051906020019061229f929190612442565b5060006122aa611ce9565b555050565b600054610100900460ff166122d65760405162461bcd60e51b8152600401610b1890612e2e565b610c7f33611f3d565b60006122e9611ce9565b5490508161230a5760405163b562e8dd60e01b815260040160405180910390fd5b68010000000000000001820261231e611ce9565b6001600160a01b038516600081815260059290920160205260409091208054929092019091554260a01b6001841460e11b1717612359611ce9565b600083815260049190910160205260408120919091556001600160a01b0384169083830190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b8181146123e357808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001016123ab565b508161240157604051622e076360e81b815260040160405180910390fd5b8061240a611ce9565b5550610e639050565b600081831061242f576000828152602084905260409020611705565b6000838152602083905260409020611705565b82805461244e90612c50565b90600052602060002090601f01602090048101928261247057600085556124b6565b82601f1061248957805160ff19168380011785556124b6565b828001600101855582156124b6579182015b828111156124b657825182559160200191906001019061249b565b506124c29291506124c6565b5090565b5b808211156124c257600081556001016124c7565b6001600160e01b031981168114610df357600080fd5b60006020828403121561250357600080fd5b8135611705816124db565b60005b83811015612529578181015183820152602001612511565b838111156117505750506000910152565b6000815180845261255281602086016020860161250e565b601f01601f19169290920160200192915050565b602081526000611705602083018461253a565b60006020828403121561258b57600080fd5b5035919050565b6001600160a01b0381168114610df357600080fd5b600080604083850312156125ba57600080fd5b82356125c581612592565b946020939093013593505050565b6000806000606084860312156125e857600080fd5b83356125f381612592565b9250602084013561260381612592565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561265257612652612614565b604052919050565b60006001600160401b0382111561267357612673612614565b5060051b60200190565b600082601f83011261268e57600080fd5b813560206126a361269e8361265a565b61262a565b82815260059290921b840181019181810190868411156126c257600080fd5b8286015b848110156126dd57803583529183019183016126c6565b509695505050505050565b6000602082840312156126fa57600080fd5b81356001600160401b0381111561271057600080fd5b6120868482850161267d565b60006001600160401b0383111561273557612735612614565b612748601f8401601f191660200161262a565b905082815283838301111561275c57600080fd5b828260208301376000602084830101529392505050565b600082601f83011261278457600080fd5b6117058383356020850161271c565b6000602082840312156127a557600080fd5b81356001600160401b038111156127bb57600080fd5b61208684828501612773565b803561ffff81168114611e8357600080fd5b600082601f8301126127ea57600080fd5b813560206127fa61269e8361265a565b82815260059290921b8401810191818101908684111561281957600080fd5b8286015b848110156126dd5761282e816127c7565b835291830191830161281d565b60008060006060848603121561285057600080fd5b833561285b81612592565b925060208401356001600160401b038082111561287757600080fd5b612883878388016127d9565b9350604086013591508082111561289957600080fd5b506128a6868287016127d9565b9150509250925092565b6000602082840312156128c257600080fd5b813561170581612592565b6000602082840312156128df57600080fd5b611705826127c7565b80358015158114611e8357600080fd5b6000806040838503121561290b57600080fd5b82356001600160401b0381111561292157600080fd5b61292d858286016127d9565b92505061293c602084016128e8565b90509250929050565b6020808252825182820181905260009190848201906040850190845b8181101561297f578351151583529284019291840191600101612961565b50909695505050505050565b6000806040838503121561299e57600080fd5b82356129a981612592565b915061293c602084016128e8565b600080604083850312156129ca57600080fd5b8235915060208301356001600160401b038111156129e757600080fd5b6129f38582860161267d565b9150509250929050565b60008060008060808587031215612a1357600080fd5b8435612a1e81612592565b93506020850135612a2e81612592565b92506040850135915060608501356001600160401b03811115612a5057600080fd5b8501601f81018713612a6157600080fd5b612a708782356020840161271c565b91505092959194509250565b600080600080600060a08688031215612a9457600080fd5b85356001600160401b0380821115612aab57600080fd5b612ab789838a01612773565b96506020880135915080821115612acd57600080fd5b612ad989838a01612773565b95506040880135915080821115612aef57600080fd5b50612afc88828901612773565b9350506060860135612b0d81612592565b91506080860135612b1d81612592565b809150509295509295909350565b60008060408385031215612b3e57600080fd5b8235612b4981612592565b91506020830135612b5981612592565b809150509250929050565b600080600060608486031215612b7957600080fd5b612b82846128e8565b92506020808501356001600160401b0380821115612b9f57600080fd5b818701915087601f830112612bb357600080fd5b8135612bc161269e8261265a565b81815260059190911b8301840190848101908a831115612be057600080fd5b938501935b82851015612c07578435612bf881612592565b82529385019390850190612be5565b965050506040870135925080831115612c1f57600080fd5b50506128a6868287016127d9565b600060208284031215612c3f57600080fd5b813560ff8116811461170557600080fd5b600181811c90821680612c6457607f821691505b60208210811415612c8557634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b600060208284031215612cb357600080fd5b815161170581612592565b634e487b7160e01b600052601160045260246000fd5b600061ffff808316818516808303821115612cf157612cf1612cbe565b01949350505050565b6000600019821415612d0e57612d0e612cbe565b5060010190565b600061ffff80831681811415612d2d57612d2d612cbe565b6001019392505050565b600061ffff83811690831681811015612d5257612d52612cbe565b039392505050565b60008351612d6c81846020880161250e565b835190830190612cf181836020880161250e565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612db39083018461253a565b9695505050505050565b600060208284031215612dcf57600080fd5b8151611705816124db565b60208082526034908201527f455243373231415f5f496e697469616c697a61626c653a20636f6e7472616374604082015273206973206e6f7420696e697469616c697a696e6760601b606082015260800190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b60608201526080019056feee151c8401928dc223602bb187aff91b9a56c7cae5476ef1b3287b085a16c85fa264697066735822122082f93be88be29ae46cfc2c77020eb5061bb53c402341fc4ca1e72c8556c0c14c64736f6c634300080b0033
Deployed Bytecode
0x6080604052600436106102465760003560e01c8063715018a611610139578063b88d4fde116100b6578063d6d0faee1161007a578063d6d0faee146106b2578063e985e9c5146106d2578063f2fde38b146106f2578063f78ebbed14610712578063f905f15414610732578063f9cc06051461075257600080fd5b8063b88d4fde14610609578063c87b56dd1461061c578063cf2806d21461063c578063d1dbd7651461066c578063d40dc8701461069c57600080fd5b806395d89b41116100fd57806395d89b41146105665780639cfc53861461057b5780639da3f8fd14610596578063a22cb465146105c9578063b138e155146105e957600080fd5b8063715018a6146104bb57806378268c3e146104d057806380ac49e5146105005780638d859f3e1461052d5780638da5cb5b1461054857600080fd5b806339a0c6f9116101c75780636352211e1161018b5780636352211e146104155780636957637b1461043557806369def03f146104555780636e654ea11461048557806370a082311461049b57600080fd5b806339a0c6f9146103975780633ccfd60b146103b757806342842e0e146103cc57806356ab4243146103df5780635f1cf0e2146103ff57600080fd5b80631a1b979d1161020e5780631a1b979d1461031257806323b872dd1461034657806326092b8314610359578063372f657c146103615780633880292a1461038157600080fd5b806301ffc9a71461024b57806306fdde0314610280578063081812fc146102a2578063095ea7b3146102da57806318160ddd146102ef575b600080fd5b34801561025757600080fd5b5061026b6102663660046124f1565b610767565b60405190151581526020015b60405180910390f35b34801561028c57600080fd5b506102956107b9565b6040516102779190612566565b3480156102ae57600080fd5b506102c26102bd366004612579565b610854565b6040516001600160a01b039091168152602001610277565b6102ed6102e83660046125a7565b6108a1565b005b3480156102fb57600080fd5b506103046108b1565b604051908152602001610277565b34801561031e57600080fd5b50606c546103339062010000900461ffff1681565b60405161ffff9091168152602001610277565b6102ed6103543660046125d3565b6108d0565b6102ed610ac0565b34801561036d57600080fd5b506102ed61037c3660046126e8565b610c81565b34801561038d57600080fd5b50610333610bb881565b3480156103a357600080fd5b506102ed6103b2366004612793565b610df6565b3480156103c357600080fd5b506102ed610e11565b6102ed6103da3660046125d3565b610e48565b3480156103eb57600080fd5b506102ed6103fa36600461283b565b610e68565b34801561040b57600080fd5b506103336107d081565b34801561042157600080fd5b506102c2610430366004612579565b611457565b34801561044157600080fd5b506102ed610450366004612579565b611462565b34801561046157600080fd5b5061026b6104703660046128b0565b606d6020526000908152604090205460ff1681565b34801561049157600080fd5b506103336101f481565b3480156104a757600080fd5b506103046104b63660046128b0565b61146f565b3480156104c757600080fd5b506102ed6114d7565b3480156104dc57600080fd5b5061026b6104eb3660046128cd565b606b6020526000908152604090205460ff1681565b34801561050c57600080fd5b5061052061051b3660046128f8565b6114e9565b6040516102779190612945565b34801561053957600080fd5b50610304662386f26fc1000081565b34801561055457600080fd5b506033546001600160a01b03166102c2565b34801561057257600080fd5b5061029561162c565b34801561058757600080fd5b50606c546103339061ffff1681565b3480156105a257600080fd5b506066546105b790600160a01b900460ff1681565b60405160ff9091168152602001610277565b3480156105d557600080fd5b506102ed6105e436600461298b565b611644565b3480156105f557600080fd5b5061026b6106043660046129b7565b6116c1565b6102ed6106173660046129fd565b61170c565b34801561062857600080fd5b50610295610637366004612579565b611756565b34801561064857600080fd5b5061026b6106573660046128cd565b606a6020526000908152604090205460ff1681565b34801561067857600080fd5b5061026b6106873660046128b0565b60696020526000908152604090205460ff1681565b3480156106a857600080fd5b5061033361271081565b3480156106be57600080fd5b506102ed6106cd366004612a7c565b6117da565b3480156106de57600080fd5b5061026b6106ed366004612b2b565b611a59565b3480156106fe57600080fd5b506102ed61070d3660046128b0565b611a96565b34801561071e57600080fd5b506102ed61072d366004612b64565b611b0c565b34801561073e57600080fd5b506102ed61074d366004612c2d565b611c72565b34801561075e57600080fd5b50610333611c9a565b60006301ffc9a760e01b6001600160e01b03198316148061079857506380ac58cd60e01b6001600160e01b03198316145b806107b35750635b5e139f60e01b6001600160e01b03198316145b92915050565b60606107c3611ce9565b60020180546107d190612c50565b80601f01602080910402602001604051908101604052809291908181526020018280546107fd90612c50565b801561084a5780601f1061081f5761010080835404028352916020019161084a565b820191906000526020600020905b81548152906001019060200180831161082d57829003601f168201915b5050505050905090565b600061085f82611d0d565b61087c576040516333d1c03960e21b815260040160405180910390fd5b610884611ce9565b60009283526006016020525060409020546001600160a01b031690565b6108ad82826001611d49565b5050565b6000806108bc611ce9565b600101546108c8611ce9565b540303919050565b60006108db82611dfe565b9050836001600160a01b0316816001600160a01b03161461090e5760405162a1148160e81b815260040160405180910390fd5b60008061091a84611ea1565b9150915061093f818761092a3390565b6001600160a01b039081169116811491141790565b61096a5761094d8633611a59565b61096a57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03851661099157604051633a954ecd60e21b815260040160405180910390fd5b801561099c57600082555b6109a4611ce9565b6001600160a01b03871660009081526005919091016020526040902080546000190190556109d0611ce9565b6001600160a01b03861660008181526005929092016020526040909120805460010190554260a01b17600160e11b17610a07611ce9565b60008681526004919091016020526040902055600160e11b8316610a765760018401610a31611ce9565b60008281526004919091016020526040902054610a7457610a50611ce9565b548114610a745783610a60611ce9565b600083815260049190910160205260409020555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b606654600160a01b900460ff16600314610b215760405162461bcd60e51b815260206004820152601d60248201527f5075626c6963204d696e74206973206e6f7420617661696c61626c652100000060448201526064015b60405180910390fd5b323314610b705760405162461bcd60e51b815260206004820152601f60248201527f5468652063616c6c657220697320616e6f7468657220636f6e747261637421006044820152606401610b18565b6000610b7a611c9a565b61ffff1611610bba5760405162461bcd60e51b815260206004820152600c60248201526b4e6f206d6f7265204e46542160a01b6044820152606401610b18565b336000908152606d602052604090205460ff1615610c0d5760405162461bcd60e51b815260206004820152601060248201526f596f752068617665206d696e7465642160801b6044820152606401610b18565b34662386f26fc1000014610c595760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742076616c75652160681b6044820152606401610b18565b336000818152606d60205260409020805460ff19166001179055610c7f905b6001611ec9565b565b606654600160a01b900460ff16600114610cdd5760405162461bcd60e51b815260206004820152601f60248201527f57686974656c697374204d696e74206973206e6f7420617661696c61626c65006044820152606401610b18565b6000610ce7611c9a565b61ffff1611610d265760405162461bcd60e51b815260206004820152600b60248201526a139bc81b5bdc994813919560aa1b6044820152606401610b18565b610d32606854826116c1565b610d7e5760405162461bcd60e51b815260206004820152601860248201527f596f7520617265206e6f7420696e2077686974656c69737400000000000000006044820152606401610b18565b3360009081526069602052604090205460ff1615610dd05760405162461bcd60e51b815260206004820152600f60248201526e165bdd481a185d99481b5a5b9d1959608a1b6044820152606401610b18565b336000818152606960205260409020805460ff19166001179055610df390610c78565b50565b610dfe611ee3565b80516108ad906067906020840190612442565b610e19611ee3565b6040514790339082156108fc029083906000818181858888f193505050501580156108ad573d6000803e3d6000fd5b610e638383836040518060200160405280600081525061170c565b505050565b606654600160a01b900460ff16600214610ec45760405162461bcd60e51b815260206004820152601c60248201527f486f6c646572204d696e74206973206e6f7420617661696c61626c65000000006044820152606401610b18565b6001600160a01b038316610f1a5760405162461bcd60e51b815260206004820152601b60248201527f43616e2774206d696e7420746f20656d707479206164647265737300000000006044820152606401610b18565b60008060005b845181101561111057606a6000868381518110610f3f57610f3f612c8b565b60209081029190910181015161ffff1682528101919091526040016000205460ff1615610fa65760405162461bcd60e51b8152602060048201526015602482015274105e9d5ada481d1bdad95b9259081a5cc81d5cd959605a1b6044820152606401610b18565b60655485516001600160a01b03808916921690636352211e90889085908110610fd157610fd1612c8b565b60200260200101516040518263ffffffff1660e01b8152600401610fff919061ffff91909116815260200190565b602060405180830381865afa15801561101c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110409190612ca1565b6001600160a01b03161461108c5760405162461bcd60e51b8152602060048201526013602482015272111bdb89dd081a185d99481d1a1a5cc81b999d606a1b6044820152606401610b18565b6001606a60008784815181106110a4576110a4612c8b565b60209081029190910181015161ffff168252810191909152604001600020805460ff19169115159190911790556110dc600284612cd4565b606c5490935061ffff908116908416106110fe57606c5461ffff169250611110565b8061110881612cfa565b915050610f20565b5060005b835181101561131157606b600085838151811061113357611133612c8b565b60209081029190910181015161ffff1682528101919091526040016000205460ff161561119a5760405162461bcd60e51b81526020600482015260156024820152741091505396881d1bdad95b9259081a5cc81d5cd959605a1b6044820152606401610b18565b60665484516001600160a01b03808916921690636352211e908790859081106111c5576111c5612c8b565b60200260200101516040518263ffffffff1660e01b81526004016111f3919061ffff91909116815260200190565b602060405180830381865afa158015611210573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112349190612ca1565b6001600160a01b0316146112805760405162461bcd60e51b8152602060048201526013602482015272111bdb89dd081a185d99481d1a1a5cc81b999d606a1b6044820152606401610b18565b6001606b600086848151811061129857611298612c8b565b60209081029190910181015161ffff168252810191909152604001600020805460ff1916911515919091179055816112cf81612d15565b606c5490935061ffff6201000090910481169084161090506112ff57606c5462010000900461ffff169150611311565b8061130981612cfa565b915050611114565b50600061131e8284612cd4565b905060008161ffff16116113745760405162461bcd60e51b815260206004820152601e60248201527f5265616368656420686f6c646572206d696e74206d617820737570706c7900006044820152606401610b18565b600a8161ffff1611156113c05760405162461bcd60e51b815260206004820152601460248201527304f6e652063616e206f6e6c79206d696e742031360641b6044820152606401610b18565b6113ce868261ffff16611ec9565b61ffff83161561140c57606c80548491906000906113f190849061ffff16612d37565b92506101000a81548161ffff021916908361ffff1602179055505b61ffff821615610ab85781606c60028282829054906101000a900461ffff166114359190612d37565b92506101000a81548161ffff021916908361ffff160217905550505050505050565b60006107b382611dfe565b61146a611ee3565b606855565b60006001600160a01b038216611498576040516323d3ad8160e21b815260040160405180910390fd5b6001600160401b036114a8611ce9565b6005016000846001600160a01b03166001600160a01b0316815260200190815260200160002054169050919050565b6114df611ee3565b610c7f6000611f3d565b6060600083516001600160401b0381111561150657611506612614565b60405190808252806020026020018201604052801561152f578160200160208202803683370190505b50905060005b84518110156116245783156115ad57606a600086838151811061155a5761155a612c8b565b602002602001015161ffff1661ffff16815260200190815260200160002060009054906101000a900460ff1682828151811061159857611598612c8b565b91151560209283029190910190910152611612565b606b60008683815181106115c3576115c3612c8b565b602002602001015161ffff1661ffff16815260200190815260200160002060009054906101000a900460ff1682828151811061160157611601612c8b565b911515602092830291909101909101525b8061161c81612cfa565b915050611535565b509392505050565b6060611636611ce9565b60030180546107d190612c50565b8061164d611ce9565b336000818152600792909201602090815260408084206001600160a01b03881680865290835293819020805460ff19169515159590951790945592518415158152919290917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6040516bffffffffffffffffffffffff193360601b166020820152600090611705908390859060340160405160208183030381529060405280519060200120611f8f565b9392505050565b6117178484846108d0565b6001600160a01b0383163b156117505761173384848484611fa5565b611750576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b606061176182611d0d565b61177e57604051630a14c4b560e41b815260040160405180910390fd5b600061178861208e565b90508051600014156117a95760405180602001604052806000815250611705565b806117b38461209d565b6040516020016117c4929190612d5a565b6040516020818303038152906040529392505050565b600080516020612e7a83398151915254610100900460ff1661180f57600080516020612e7a8339815191525460ff1615611813565b303b155b6118855760405162461bcd60e51b815260206004820152603760248201527f455243373231415f5f496e697469616c697a61626c653a20636f6e747261637460448201527f20697320616c726561647920696e697469616c697a65640000000000000000006064820152608401610b18565b600080516020612e7a83398151915254610100900460ff161580156118c157600080516020612e7a833981519152805461ffff19166101011790555b600054610100900460ff16158080156118e15750600054600160ff909116105b806118fb5750303b1580156118fb575060005460ff166001145b61195e5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610b18565b6000805460ff191660011790558015611981576000805461ff0019166101001790555b61198b87876120eb565b611993612129565b84516119a6906067906020880190612442565b50606580546001600160a01b038087166001600160a01b0319928316179092556066805492861692909116919091179055606c80546307d00bb863ffffffff199091161790558015611a32576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b508015610ab8575050600080516020612e7a833981519152805461ff001916905550505050565b6000611a63611ce9565b6001600160a01b039384166000908152600791909101602090815260408083209490951682529290925250205460ff1690565b611a9e611ee3565b6001600160a01b038116611b035760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b18565b610df381611f3d565b611b14611ee3565b60008251118015611b26575080518251145b611b655760405162461bcd60e51b815260206004820152601060248201526f098cadccee8d040dcdee840dac2e8c6d60831b6044820152606401610b18565b6000805b8351811015611beb57611bb2848281518110611b8757611b87612c8b565b6020026020010151848381518110611ba157611ba1612c8b565b602002602001015161ffff16611ec9565b828181518110611bc457611bc4612c8b565b602002602001015182611bd79190612cd4565b915080611be381612cfa565b915050611b69565b50612710611bf7612158565b1115611c335760405162461bcd60e51b815260206004820152600b60248201526a139bc81b5bdc994813919560aa1b6044820152606401610b18565b831561175057606c8054829190600090611c5290849061ffff16612d37565b92506101000a81548161ffff021916908361ffff16021790555050505050565b611c7a611ee3565b6066805460ff909216600160a01b0260ff60a01b19909216919091179055565b60006101f4611ca7612158565b611cb19190612cd4565b61ffff1661271010611ce3576101f4611cc8612158565b611cd490612710612d37565b611cde9190612d37565b905090565b50600090565b7f2569078dfb4b0305704d3008e7403993ae9601b85f7ae5e742de3de8f8011c4090565b6000611d17611ce9565b54821080156107b35750600160e01b611d2e611ce9565b60008481526004919091016020526040902054161592915050565b6000611d5483611457565b90508115611d9357336001600160a01b03821614611d9357611d768133611a59565b611d93576040516367d9dca160e11b815260040160405180910390fd5b83611d9c611ce9565b6000858152600691909101602052604080822080546001600160a01b0319166001600160a01b0394851617905551859287811692908516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259190a450505050565b6000611e08611ce9565b600083815260049190910160205260409020549050600160e01b8116611e885780611e8357611e35611ce9565b548210611e5557604051636f96cda160e11b815260040160405180910390fd5b611e5d611ce9565b6000199092016000818152600493909301602052604090922054905080611e8357611e55565b919050565b604051636f96cda160e11b815260040160405180910390fd5b6000806000611eae611ce9565b60009485526006016020525050604090912080549092909150565b6108ad82826040518060200160405280600081525061216a565b6033546001600160a01b03163314610c7f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b18565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600082611f9c85846121e7565b14949350505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611fda903390899088908890600401612d80565b6020604051808303816000875af1925050508015612015575060408051601f3d908101601f1916820190925261201291810190612dbd565b60015b612070573d808015612043576040519150601f19603f3d011682016040523d82523d6000602084013e612048565b606091505b508051612068576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060606780546107d190612c50565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a9004806120d4576120d9565b6120b7565b50819003601f19909101908152919050565b600080516020612e7a83398151915254610100900460ff1661211f5760405162461bcd60e51b8152600401610b1890612dda565b6108ad828261222c565b600054610100900460ff166121505760405162461bcd60e51b8152600401610b1890612e2e565b610c7f6122af565b600080612163611ce9565b5403919050565b61217483836122df565b6001600160a01b0383163b15610e6357600061218e611ce9565b5490508281035b6121a86000868380600101945086611fa5565b6121c5576040516368d2bf6b60e11b815260040160405180910390fd5b81811061219557816121d5611ce9565b54146121e057600080fd5b5050505050565b600081815b8451811015611624576122188286838151811061220b5761220b612c8b565b6020026020010151612413565b91508061222481612cfa565b9150506121ec565b600080516020612e7a83398151915254610100900460ff166122605760405162461bcd60e51b8152600401610b1890612dda565b81612269611ce9565b600201908051906020019061227f929190612442565b5080612289611ce9565b600301908051906020019061229f929190612442565b5060006122aa611ce9565b555050565b600054610100900460ff166122d65760405162461bcd60e51b8152600401610b1890612e2e565b610c7f33611f3d565b60006122e9611ce9565b5490508161230a5760405163b562e8dd60e01b815260040160405180910390fd5b68010000000000000001820261231e611ce9565b6001600160a01b038516600081815260059290920160205260409091208054929092019091554260a01b6001841460e11b1717612359611ce9565b600083815260049190910160205260408120919091556001600160a01b0384169083830190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b8181146123e357808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001016123ab565b508161240157604051622e076360e81b815260040160405180910390fd5b8061240a611ce9565b5550610e639050565b600081831061242f576000828152602084905260409020611705565b6000838152602083905260409020611705565b82805461244e90612c50565b90600052602060002090601f01602090048101928261247057600085556124b6565b82601f1061248957805160ff19168380011785556124b6565b828001600101855582156124b6579182015b828111156124b657825182559160200191906001019061249b565b506124c29291506124c6565b5090565b5b808211156124c257600081556001016124c7565b6001600160e01b031981168114610df357600080fd5b60006020828403121561250357600080fd5b8135611705816124db565b60005b83811015612529578181015183820152602001612511565b838111156117505750506000910152565b6000815180845261255281602086016020860161250e565b601f01601f19169290920160200192915050565b602081526000611705602083018461253a565b60006020828403121561258b57600080fd5b5035919050565b6001600160a01b0381168114610df357600080fd5b600080604083850312156125ba57600080fd5b82356125c581612592565b946020939093013593505050565b6000806000606084860312156125e857600080fd5b83356125f381612592565b9250602084013561260381612592565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561265257612652612614565b604052919050565b60006001600160401b0382111561267357612673612614565b5060051b60200190565b600082601f83011261268e57600080fd5b813560206126a361269e8361265a565b61262a565b82815260059290921b840181019181810190868411156126c257600080fd5b8286015b848110156126dd57803583529183019183016126c6565b509695505050505050565b6000602082840312156126fa57600080fd5b81356001600160401b0381111561271057600080fd5b6120868482850161267d565b60006001600160401b0383111561273557612735612614565b612748601f8401601f191660200161262a565b905082815283838301111561275c57600080fd5b828260208301376000602084830101529392505050565b600082601f83011261278457600080fd5b6117058383356020850161271c565b6000602082840312156127a557600080fd5b81356001600160401b038111156127bb57600080fd5b61208684828501612773565b803561ffff81168114611e8357600080fd5b600082601f8301126127ea57600080fd5b813560206127fa61269e8361265a565b82815260059290921b8401810191818101908684111561281957600080fd5b8286015b848110156126dd5761282e816127c7565b835291830191830161281d565b60008060006060848603121561285057600080fd5b833561285b81612592565b925060208401356001600160401b038082111561287757600080fd5b612883878388016127d9565b9350604086013591508082111561289957600080fd5b506128a6868287016127d9565b9150509250925092565b6000602082840312156128c257600080fd5b813561170581612592565b6000602082840312156128df57600080fd5b611705826127c7565b80358015158114611e8357600080fd5b6000806040838503121561290b57600080fd5b82356001600160401b0381111561292157600080fd5b61292d858286016127d9565b92505061293c602084016128e8565b90509250929050565b6020808252825182820181905260009190848201906040850190845b8181101561297f578351151583529284019291840191600101612961565b50909695505050505050565b6000806040838503121561299e57600080fd5b82356129a981612592565b915061293c602084016128e8565b600080604083850312156129ca57600080fd5b8235915060208301356001600160401b038111156129e757600080fd5b6129f38582860161267d565b9150509250929050565b60008060008060808587031215612a1357600080fd5b8435612a1e81612592565b93506020850135612a2e81612592565b92506040850135915060608501356001600160401b03811115612a5057600080fd5b8501601f81018713612a6157600080fd5b612a708782356020840161271c565b91505092959194509250565b600080600080600060a08688031215612a9457600080fd5b85356001600160401b0380821115612aab57600080fd5b612ab789838a01612773565b96506020880135915080821115612acd57600080fd5b612ad989838a01612773565b95506040880135915080821115612aef57600080fd5b50612afc88828901612773565b9350506060860135612b0d81612592565b91506080860135612b1d81612592565b809150509295509295909350565b60008060408385031215612b3e57600080fd5b8235612b4981612592565b91506020830135612b5981612592565b809150509250929050565b600080600060608486031215612b7957600080fd5b612b82846128e8565b92506020808501356001600160401b0380821115612b9f57600080fd5b818701915087601f830112612bb357600080fd5b8135612bc161269e8261265a565b81815260059190911b8301840190848101908a831115612be057600080fd5b938501935b82851015612c07578435612bf881612592565b82529385019390850190612be5565b965050506040870135925080831115612c1f57600080fd5b50506128a6868287016127d9565b600060208284031215612c3f57600080fd5b813560ff8116811461170557600080fd5b600181811c90821680612c6457607f821691505b60208210811415612c8557634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b600060208284031215612cb357600080fd5b815161170581612592565b634e487b7160e01b600052601160045260246000fd5b600061ffff808316818516808303821115612cf157612cf1612cbe565b01949350505050565b6000600019821415612d0e57612d0e612cbe565b5060010190565b600061ffff80831681811415612d2d57612d2d612cbe565b6001019392505050565b600061ffff83811690831681811015612d5257612d52612cbe565b039392505050565b60008351612d6c81846020880161250e565b835190830190612cf181836020880161250e565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612db39083018461253a565b9695505050505050565b600060208284031215612dcf57600080fd5b8151611705816124db565b60208082526034908201527f455243373231415f5f496e697469616c697a61626c653a20636f6e7472616374604082015273206973206e6f7420696e697469616c697a696e6760601b606082015260800190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b60608201526080019056feee151c8401928dc223602bb187aff91b9a56c7cae5476ef1b3287b085a16c85fa264697066735822122082f93be88be29ae46cfc2c77020eb5061bb53c402341fc4ca1e72c8556c0c14c64736f6c634300080b0033
Deployed Bytecode Sourcemap
88811:6125:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53542:639;;;;;;;;;;-1:-1:-1;53542:639:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;53542:639:0;;;;;;;;54444:124;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;61036:242::-;;;;;;;;;;-1:-1:-1;61036:242:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:1;;;1674:51;;1662:2;1647:18;61036:242:0;1528:203:1;60753:124:0;;;;;;:::i;:::-;;:::i;:::-;;49929:371;;;;;;;;;;;;;:::i;:::-;;;2338:25:1;;;2326:2;2311:18;49929:371:0;2192:177:1;89522:30:0;;;;;;;;;;-1:-1:-1;89522:30:0;;;;;;;;;;;;;;2548:6:1;2536:19;;;2518:38;;2506:2;2491:18;89522:30:0;2374:188:1;64834:2969:0;;;;;;:::i;:::-;;:::i;92869:466::-;;;:::i;90648:438::-;;;;;;;;;;-1:-1:-1;90648:438:0;;;;;:::i;:::-;;:::i;88924:47::-;;;;;;;;;;;;88967:4;88924:47;;90205:97;;;;;;;;;;-1:-1:-1;90205:97:0;;;;;:::i;:::-;;:::i;93343:142::-;;;;;;;;;;;;;:::i;67899:193::-;;;;;;:::i;:::-;;:::i;91094:1767::-;;;;;;;;;;-1:-1:-1;91094:1767:0;;;;;:::i;:::-;;:::i;88978:47::-;;;;;;;;;;;;89021:4;88978:47;;55885:152;;;;;;;;;;-1:-1:-1;55885:152:0;;;;;:::i;:::-;;:::i;90529:111::-;;;;;;;;;;-1:-1:-1;90529:111:0;;;;;:::i;:::-;;:::i;89561:48::-;;;;;;;;;;-1:-1:-1;89561:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;89032:42;;;;;;;;;;;;89071:3;89032:42;;51209:257;;;;;;;;;;-1:-1:-1;51209:257:0;;;;;:::i;:::-;;:::i;18922:103::-;;;;;;;;;;;;;:::i;89432:46::-;;;;;;;;;;-1:-1:-1;89432:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;94282:444;;;;;;;;;;-1:-1:-1;94282:444:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;89081:49::-;;;;;;;;;;;;89113:17;89081:49;;18274:87;;;;;;;;;;-1:-1:-1;18347:6:0;;-1:-1:-1;;;;;18347:6:0;18274:87;;54644:128;;;;;;;;;;;;;:::i;89485:30::-;;;;;;;;;;-1:-1:-1;89485:30:0;;;;;;;;89216:23;;;;;;;;;;-1:-1:-1;89216:23:0;;;;-1:-1:-1;;;89216:23:0;;;;;;;;;9209:4:1;9197:17;;;9179:36;;9167:2;9152:18;89216:23:0;9037:184:1;61618:258:0;;;;;;;;;;-1:-1:-1;61618:258:0;;;;;:::i;:::-;;:::i;94734:199::-;;;;;;;;;;-1:-1:-1;94734:199:0;;;;;:::i;:::-;;:::i;68690:407::-;;;;;;:::i;:::-;;:::i;54878:318::-;;;;;;;;;;-1:-1:-1;54878:318:0;;;;;:::i;:::-;;:::i;89379:46::-;;;;;;;;;;-1:-1:-1;89379:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;89321:51;;;;;;;;;;-1:-1:-1;89321:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;88876:41;;;;;;;;;;;;88912:5;88876:41;;89788:409;;;;;;;;;;-1:-1:-1;89788:409:0;;;;;:::i;:::-;;:::i;62033:188::-;;;;;;;;;;-1:-1:-1;62033:188:0;;;;;:::i;:::-;;:::i;19180:201::-;;;;;;;;;;-1:-1:-1;19180:201:0;;;;;:::i;:::-;;:::i;93493:536::-;;;;;;;;;;-1:-1:-1;93493:536:0;;;;;:::i;:::-;;:::i;90426:95::-;;;;;;;;;;-1:-1:-1;90426:95:0;;;;;:::i;:::-;;:::i;94037:237::-;;;;;;;;;;;;;:::i;53542:639::-;53627:4;-1:-1:-1;;;;;;;;;53951:25:0;;;;:102;;-1:-1:-1;;;;;;;;;;54028:25:0;;;53951:102;:179;;;-1:-1:-1;;;;;;;;;;54105:25:0;;;53951:179;53931:199;53542:639;-1:-1:-1;;53542:639:0:o;54444:124::-;54498:13;54531:23;:21;:23::i;:::-;:29;;54524:36;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54444:124;:::o;61036:242::-;61112:7;61137:16;61145:7;61137;:16::i;:::-;61132:64;;61162:34;;-1:-1:-1;;;61162:34:0;;;;;;;;;;;61132:64;61216:23;:21;:23::i;:::-;:48;;;;:39;;:48;;-1:-1:-1;61216:48:0;;;:54;-1:-1:-1;;;;;61216:54:0;;61036:242::o;60753:124::-;60842:27;60851:2;60855:7;60864:4;60842:8;:27::i;:::-;60753:124;;:::o;49929:371::-;49990:7;;50227:23;:21;:23::i;:::-;:36;;;50187:23;:21;:23::i;:::-;:37;:76;:94;;49929:371;-1:-1:-1;49929:371:0:o;64834:2969::-;64976:27;65006;65025:7;65006:18;:27::i;:::-;64976:57;;65091:4;-1:-1:-1;;;;;65050:45:0;65066:19;-1:-1:-1;;;;;65050:45:0;;65046:86;;65104:28;;-1:-1:-1;;;65104:28:0;;;;;;;;;;;65046:86;65146:27;65175:23;65202:35;65229:7;65202:26;:35::i;:::-;65145:92;;;;65337:68;65362:15;65379:4;65385:19;86879:10;;86792:105;65385:19;-1:-1:-1;;;;;63377:32:0;;;63221:28;;63506:20;;63528:30;;63503:56;;62918:659;65337:68;65332:180;;65425:43;65442:4;86879:10;62033:188;:::i;65425:43::-;65420:92;;65477:35;;-1:-1:-1;;;65477:35:0;;;;;;;;;;;65420:92;-1:-1:-1;;;;;65529:16:0;;65525:52;;65554:23;;-1:-1:-1;;;65554:23:0;;;;;;;;;;;65525:52;65726:15;65723:160;;;65866:1;65845:19;65838:30;65723:160;66263:23;:21;:23::i;:::-;-1:-1:-1;;;;;66263:48:0;;;;;;:42;;;;;:48;;;;;66261:50;;-1:-1:-1;;66261:50:0;;;66356:23;:21;:23::i;:::-;-1:-1:-1;;;;;66356:46:0;;;;;;:42;;;;;:46;;;;;;66354:48;;;;;;59855:11;59830:23;59826:41;59813:63;-1:-1:-1;;;59813:63:0;66673:23;:21;:23::i;:::-;:50;;;;:41;;;;;:50;;;;;:199;-1:-1:-1;;;66992:47:0;;66988:699;;67097:1;67087:11;;67220:23;:21;:23::i;:::-;:54;;;;:41;;;;;:54;;;;;;67216:456;;67382:23;:21;:23::i;:::-;:37;67367:52;;67363:290;;67610:19;67553:23;:21;:23::i;:::-;:54;;;;:41;;;;;:54;;;;;:76;67363:290;67046:641;66988:699;67734:7;67730:2;-1:-1:-1;;;;;67715:27:0;67724:4;-1:-1:-1;;;;;67715:27:0;;;;;;;;;;;67753:42;64965:2838;;;64834:2969;;;:::o;92869:466::-;92925:10;;-1:-1:-1;;;92925:10:0;;;;92939:1;92925:15;92917:57;;;;-1:-1:-1;;;92917:57:0;;14331:2:1;92917:57:0;;;14313:21:1;14370:2;14350:18;;;14343:30;14409:31;14389:18;;;14382:59;14458:18;;92917:57:0;;;;;;;;;92993:9;86879:10;92993:25;92985:69;;;;-1:-1:-1;;;92985:69:0;;14689:2:1;92985:69:0;;;14671:21:1;14728:2;14708:18;;;14701:30;14767:33;14747:18;;;14740:61;14818:18;;92985:69:0;14487:355:1;92985:69:0;93090:1;93073:14;:12;:14::i;:::-;:18;;;93065:43;;;;-1:-1:-1;;;93065:43:0;;15049:2:1;93065:43:0;;;15031:21:1;15088:2;15068:18;;;15061:30;-1:-1:-1;;;15107:18:1;;;15100:42;15159:18;;93065:43:0;14847:336:1;93065:43:0;86879:10;93128:30;;;;:16;:30;;;;;;;;93127:31;93119:60;;;;-1:-1:-1;;;93119:60:0;;15390:2:1;93119:60:0;;;15372:21:1;15429:2;15409:18;;;15402:30;-1:-1:-1;;;15448:18:1;;;15441:46;15504:18;;93119:60:0;15188:340:1;93119:60:0;93207:9;89113:17;93198:18;93190:50;;;;-1:-1:-1;;;93190:50:0;;15735:2:1;93190:50:0;;;15717:21:1;15774:2;15754:18;;;15747:30;-1:-1:-1;;;15793:18:1;;;15786:49;15852:18;;93190:50:0;15533:343:1;93190:50:0;86879:10;93253:30;;;;:16;:30;;;;;:37;;-1:-1:-1;;93253:37:0;93286:4;93253:37;;;93301:26;;93311:12;93325:1;93301:9;:26::i;:::-;92869:466::o;90648:438::-;90721:10;;-1:-1:-1;;;90721:10:0;;;;90735:1;90721:15;90713:59;;;;-1:-1:-1;;;90713:59:0;;16083:2:1;90713:59:0;;;16065:21:1;16122:2;16102:18;;;16095:30;16161:33;16141:18;;;16134:61;16212:18;;90713:59:0;15881:355:1;90713:59:0;90808:1;90791:14;:12;:14::i;:::-;:18;;;90783:42;;;;-1:-1:-1;;;90783:42:0;;16443:2:1;90783:42:0;;;16425:21:1;16482:2;16462:18;;;16455:30;-1:-1:-1;;;16501:18:1;;;16494:41;16552:18;;90783:42:0;16241:335:1;90783:42:0;90844;90859:19;;90880:5;90844:14;:42::i;:::-;90836:79;;;;-1:-1:-1;;;90836:79:0;;16783:2:1;90836:79:0;;;16765:21:1;16822:2;16802:18;;;16795:30;16861:26;16841:18;;;16834:54;16905:18;;90836:79:0;16581:348:1;90836:79:0;86879:10;90935:33;;;;:19;:33;;;;;;;;90934:34;90926:62;;;;-1:-1:-1;;;90926:62:0;;17136:2:1;90926:62:0;;;17118:21:1;17175:2;17155:18;;;17148:30;-1:-1:-1;;;17194:18:1;;;17187:45;17249:18;;90926:62:0;16934:339:1;90926:62:0;86879:10;91001:33;;;;:19;:33;;;;;:40;;-1:-1:-1;;91001:40:0;91037:4;91001:40;;;91052:26;;91062:12;86792:105;91052:26;90648:438;:::o;90205:97::-;18160:13;:11;:13::i;:::-;90278:16;;::::1;::::0;:7:::1;::::0;:16:::1;::::0;::::1;::::0;::::1;:::i;93343:142::-:0;18160:13;:11;:13::i;:::-;93438:39:::1;::::0;93406:21:::1;::::0;86879:10;;93438:39;::::1;;;::::0;93406:21;;93438:39:::1;::::0;;;93406:21;86879:10;93438:39;::::1;;;;;;;;;;;;;::::0;::::1;;;;67899:193:::0;68045:39;68062:4;68068:2;68072:7;68045:39;;;;;;;;;;;;:16;:39::i;:::-;67899:193;;;:::o;91094:1767::-;91214:10;;-1:-1:-1;;;91214:10:0;;;;91228:1;91214:15;91206:56;;;;-1:-1:-1;;;91206:56:0;;17480:2:1;91206:56:0;;;17462:21:1;17519:2;17499:18;;;17492:30;17558;17538:18;;;17531:58;17606:18;;91206:56:0;17278:352:1;91206:56:0;-1:-1:-1;;;;;91281:16:0;;91273:56;;;;-1:-1:-1;;;91273:56:0;;17837:2:1;91273:56:0;;;17819:21:1;17876:2;17856:18;;;17849:30;17915:29;17895:18;;;17888:57;17962:18;;91273:56:0;17635:351:1;91273:56:0;91340:15;91368;91433:6;91428:468;91449:13;:20;91445:1;:24;91428:468;;;91500:15;:33;91516:13;91530:1;91516:16;;;;;;;;:::i;:::-;;;;;;;;;;;;91500:33;;;;;;;;;;;;-1:-1:-1;91500:33:0;;;;91499:34;91491:68;;;;-1:-1:-1;;;91491:68:0;;18325:2:1;91491:68:0;;;18307:21:1;18364:2;18344:18;;;18337:30;-1:-1:-1;;;18383:18:1;;;18376:51;18444:18;;91491:68:0;18123:345:1;91491:68:0;91602:10;;91622:16;;-1:-1:-1;;;;;91582:63:0;;;;91602:10;;91582:39;;91622:13;;91636:1;;91622:16;;;;;;:::i;:::-;;;;;;;91582:57;;;;;;;;;;;;;;2548:6:1;2536:19;;;;2518:38;;2506:2;2491:18;;2374:188;91582:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;91582:63:0;;91574:95;;;;-1:-1:-1;;;91574:95:0;;19125:2:1;91574:95:0;;;19107:21:1;19164:2;19144:18;;;19137:30;-1:-1:-1;;;19183:18:1;;;19176:49;19242:18;;91574:95:0;18923:343:1;91574:95:0;91720:4;91684:15;:33;91700:13;91714:1;91700:16;;;;;;;;:::i;:::-;;;;;;;;;;;;91684:33;;;;;;;;;;;;-1:-1:-1;91684:33:0;:40;;-1:-1:-1;;91684:40:0;;;;;;;;;;91739:13;91751:1;91739:13;;:::i;:::-;91782:16;;91739:13;;-1:-1:-1;91782:16:0;;;;91770:28;;;;91767:118;;91829:16;;;;;-1:-1:-1;91864:5:0;;91767:118;91471:3;;;;:::i;:::-;;;;91428:468;;;;91945:6;91940:465;91961:13;:20;91957:1;:24;91940:465;;;92012:15;:33;92028:13;92042:1;92028:16;;;;;;;;:::i;:::-;;;;;;;;;;;;92012:33;;;;;;;;;;;;-1:-1:-1;92012:33:0;;;;92011:34;92003:68;;;;-1:-1:-1;;;92003:68:0;;19974:2:1;92003:68:0;;;19956:21:1;20013:2;19993:18;;;19986:30;-1:-1:-1;;;20032:18:1;;;20025:51;20093:18;;92003:68:0;19772:345:1;92003:68:0;92114:10;;92134:16;;-1:-1:-1;;;;;92094:63:0;;;;92114:10;;92094:39;;92134:13;;92148:1;;92134:16;;;;;;:::i;:::-;;;;;;;92094:57;;;;;;;;;;;;;;2548:6:1;2536:19;;;;2518:38;;2506:2;2491:18;;2374:188;92094:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;92094:63:0;;92086:95;;;;-1:-1:-1;;;92086:95:0;;19125:2:1;92086:95:0;;;19107:21:1;19164:2;19144:18;;;19137:30;-1:-1:-1;;;19183:18:1;;;19176:49;19242:18;;92086:95:0;18923:343:1;92086:95:0;92232:4;92196:15;:33;92212:13;92226:1;92212:16;;;;;;;;:::i;:::-;;;;;;;;;;;;92196:33;;;;;;;;;;;;-1:-1:-1;92196:33:0;:40;;-1:-1:-1;;92196:40:0;;;;;;;;;;92251:10;;;;:::i;:::-;92291:16;;92251:10;;-1:-1:-1;92291:16:0;;;;;;;92279:28;;;;;-1:-1:-1;92276:118:0;;92338:16;;;;;;;;-1:-1:-1;92373:5:0;;92276:118;91983:3;;;;:::i;:::-;;;;91940:465;;;-1:-1:-1;92438:14:0;92455:19;92466:8;92455;:19;:::i;:::-;92438:36;;92503:1;92493:7;:11;;;92485:54;;;;-1:-1:-1;;;92485:54:0;;20526:2:1;92485:54:0;;;20508:21:1;20565:2;20545:18;;;20538:30;20604:32;20584:18;;;20577:60;20654:18;;92485:54:0;20324:354:1;92485:54:0;92569:2;92558:7;:13;;;;92550:46;;;;-1:-1:-1;;;92550:46:0;;20885:2:1;92550:46:0;;;20867:21:1;20924:2;20904:18;;;20897:30;-1:-1:-1;;;20943:18:1;;;20936:50;21003:18;;92550:46:0;20683:344:1;92550:46:0;92625:33;92635:2;92649:7;92639:18;;92625:9;:33::i;:::-;92705:12;;;;92702:71;;92733:16;:28;;92753:8;;92733:16;;;:28;;92753:8;;92733:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;92702:71;92786:12;;;;92783:71;;92834:8;92814:16;;:28;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;91195:1666;;;91094:1767;;;:::o;55885:152::-;55957:7;56000:27;56019:7;56000:18;:27::i;90529:111::-;18160:13;:11;:13::i;:::-;90606:19:::1;:26:::0;90529:111::o;51209:257::-;51281:7;-1:-1:-1;;;;;51305:19:0;;51301:60;;51333:28;;-1:-1:-1;;;51333:28:0;;;;;;;;;;;51301:60;-1:-1:-1;;;;;51379:23:0;:21;:23::i;:::-;:42;;:49;51422:5;-1:-1:-1;;;;;51379:49:0;-1:-1:-1;;;;;51379:49:0;;;;;;;;;;;;;:79;51372:86;;51209:257;;;:::o;18922:103::-;18160:13;:11;:13::i;:::-;18987:30:::1;19014:1;18987:18;:30::i;94282:444::-:0;94368:13;94394:21;94429:8;:15;-1:-1:-1;;;;;94418:27:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;94418:27:0;;94394:51;;94461:6;94456:238;94477:8;:15;94473:1;:19;94456:238;;;94518:5;94514:169;;;94557:15;:28;94573:8;94582:1;94573:11;;;;;;;;:::i;:::-;;;;;;;94557:28;;;;;;;;;;;;;;;;;;;;;;;;;94544:7;94552:1;94544:10;;;;;;;;:::i;:::-;:41;;;:10;;;;;;;;;;;:41;94514:169;;;94639:15;:28;94655:8;94664:1;94655:11;;;;;;;;:::i;:::-;;;;;;;94639:28;;;;;;;;;;;;;;;;;;;;;;;;;94626:7;94634:1;94626:10;;;;;;;;:::i;:::-;:41;;;:10;;;;;;;;;;;:41;94514:169;94494:3;;;;:::i;:::-;;;;94456:238;;;-1:-1:-1;94711:7:0;94282:444;-1:-1:-1;;;94282:444:0:o;54644:128::-;54700:13;54733:23;:21;:23::i;:::-;:31;;54726:38;;;;;:::i;61618:258::-;61789:8;61713:23;:21;:23::i;:::-;86879:10;61713:63;;;;:42;;;;;:63;;;;;;;;-1:-1:-1;;;;;61713:73:0;;;;;;;;;;;;:84;;-1:-1:-1;;61713:84:0;;;;;;;;;;;61813:55;;565:14:1;;558:22;540:41;;61713:73:0;;86879:10;;61813:55;;513:18:1;61813:55:0;;;;;;;61618:258;;:::o;94734:199::-;94893:30;;-1:-1:-1;;86879:10:0;21403:2:1;21399:15;21395:53;94893:30:0;;;21383:66:1;94817:4:0;;94840:85;;94870:5;;94877:4;;21465:12:1;;94893:30:0;;;;;;;;;;;;94883:41;;;;;;94840:29;:85::i;:::-;94833:92;94734:199;-1:-1:-1;;;94734:199:0:o;68690:407::-;68865:31;68878:4;68884:2;68888:7;68865:12;:31::i;:::-;-1:-1:-1;;;;;68911:14:0;;;:19;68907:183;;68950:56;68981:4;68987:2;68991:7;69000:5;68950:30;:56::i;:::-;68945:145;;69034:40;;-1:-1:-1;;;69034:40:0;;;;;;;;;;;68945:145;68690:407;;;;:::o;54878:318::-;54951:13;54982:16;54990:7;54982;:16::i;:::-;54977:59;;55007:29;;-1:-1:-1;;;55007:29:0;;;;;;;;;;;54977:59;55049:21;55073:10;:8;:10::i;:::-;55049:34;;55107:7;55101:21;55126:1;55101:26;;:87;;;;;;;;;;;;;;;;;55154:7;55163:18;55173:7;55163:9;:18::i;:::-;55137:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55094:94;54878:318;-1:-1:-1;;;54878:318:0:o;89788:409::-;-1:-1:-1;;;;;;;;;;;32123:52:0;;;;;;:160;;-1:-1:-1;;;;;;;;;;;32232:51:0;;;32231:52;32123:160;;;33734:4;33801:17;33846:7;32195:16;32101:265;;;;-1:-1:-1;;;32101:265:0;;22165:2:1;32101:265:0;;;22147:21:1;22204:2;22184:18;;;22177:30;22243:34;22223:18;;;22216:62;22314:25;22294:18;;;22287:53;22357:19;;32101:265:0;21963:419:1;32101:265:0;-1:-1:-1;;;;;;;;;;;32402:52:0;;;;;;32401:53;32465:179;;;;-1:-1:-1;;;;;;;;;;;32500:59:0;;-1:-1:-1;;32574:58:0;;;;;32465:179;11978:19:::1;12001:13:::0;::::1;::::0;::::1;;;12000:14;::::0;12048:34;::::1;;;-1:-1:-1::0;12066:12:0::1;::::0;12081:1:::1;12066:12;::::0;;::::1;:16;12048:34;12047:108;;;-1:-1:-1::0;12127:4:0::1;1633:19:::0;:23;;;12088:66:::1;;-1:-1:-1::0;12137:12:0::1;::::0;::::1;;::::0;:17:::1;12088:66;12025:204;;;::::0;-1:-1:-1;;;12025:204:0;;22589:2:1;12025:204:0::1;::::0;::::1;22571:21:1::0;22628:2;22608:18;;;22601:30;22667:34;22647:18;;;22640:62;-1:-1:-1;;;22718:18:1;;;22711:44;22772:19;;12025:204:0::1;22387:410:1::0;12025:204:0::1;12240:12;:16:::0;;-1:-1:-1;;12240:16:0::1;12255:1;12240:16;::::0;;12267:67;::::1;;;12302:13;:20:::0;;-1:-1:-1;;12302:20:0::1;;;::::0;;12267:67:::1;89953:28:::2;89968:4;89974:6;89953:14;:28::i;:::-;89992:16;:14;:16::i;:::-;90019:18:::0;;::::2;::::0;:7:::2;::::0;:18:::2;::::0;::::2;::::0;::::2;:::i;:::-;-1:-1:-1::0;90048:10:0::2;:18:::0;;-1:-1:-1;;;;;90048:18:0;;::::2;-1:-1:-1::0;;;;;;90048:18:0;;::::2;;::::0;;;90077:10:::2;:18:::0;;;;::::2;::::0;;;::::2;::::0;;;::::2;::::0;;90106:16:::2;:36:::0;;90153;-1:-1:-1;;90153:36:0;;;;;;12356:102;::::1;;;12407:5;12391:21:::0;;-1:-1:-1;;12391:21:0::1;::::0;;12432:14:::1;::::0;-1:-1:-1;9179:36:1;;12432:14:0::1;::::0;9167:2:1;9152:18;12432:14:0::1;;;;;;;12356:102;11967:498;32674:14:::0;32670:107;;;-1:-1:-1;;;;;;;;;;;;;32705:60:0;;-1:-1:-1;;32705:60:0;;;-1:-1:-1;;;;89788:409:0:o;62033:188::-;62130:4;62154:23;:21;:23::i;:::-;-1:-1:-1;;;;;62154:49:0;;;;;;;:42;;;;;:49;;;;;;;;:59;;;;;;;;;;-1:-1:-1;62154:59:0;;;;;62033:188::o;19180:201::-;18160:13;:11;:13::i;:::-;-1:-1:-1;;;;;19269:22:0;::::1;19261:73;;;::::0;-1:-1:-1;;;19261:73:0;;23203:2:1;19261:73:0::1;::::0;::::1;23185:21:1::0;23242:2;23222:18;;;23215:30;23281:34;23261:18;;;23254:62;-1:-1:-1;;;23332:18:1;;;23325:36;23378:19;;19261:73:0::1;23001:402:1::0;19261:73:0::1;19345:28;19364:8;19345:18;:28::i;93493:536::-:0;18160:13;:11;:13::i;:::-;93641:1:::1;93623:8;:15;:19;:53;;;;;93665:4;:11;93646:8;:15;:30;93623:53;93615:82;;;::::0;-1:-1:-1;;;93615:82:0;;23610:2:1;93615:82:0::1;::::0;::::1;23592:21:1::0;23649:2;23629:18;;;23622:30;-1:-1:-1;;;23668:18:1;;;23661:46;23724:18;;93615:82:0::1;23408:340:1::0;93615:82:0::1;93708:14;93742:6:::0;93737:134:::1;93758:8;:15;93754:1;:19;93737:134;;;93795:31;93805:8;93814:1;93805:11;;;;;;;;:::i;:::-;;;;;;;93818:4;93823:1;93818:7;;;;;;;;:::i;:::-;;;;;;;93795:31;;:9;:31::i;:::-;93852:4;93857:1;93852:7;;;;;;;;:::i;:::-;;;;;;;93841:18;;;;;:::i;:::-;::::0;-1:-1:-1;93775:3:0;::::1;::::0;::::1;:::i;:::-;;;;93737:134;;;-1:-1:-1::0;88912:5:0::1;93889:14;:12;:14::i;:::-;:28;;93881:52;;;::::0;-1:-1:-1;;;93881:52:0;;16443:2:1;93881:52:0::1;::::0;::::1;16425:21:1::0;16482:2;16462:18;;;16455:30;-1:-1:-1;;;16501:18:1;;;16494:41;16552:18;;93881:52:0::1;16241:335:1::0;93881:52:0::1;93947:20;93944:78;;;93983:16;:27:::0;;94003:7;;93983:16;::::1;::::0;:27:::1;::::0;94003:7;;93983:27:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;93604:425;93493:536:::0;;;:::o;90426:95::-;18160:13;:11;:13::i;:::-;90494:10:::1;:19:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;90494:19:0::1;-1:-1:-1::0;;;;90494:19:0;;::::1;::::0;;;::::1;::::0;;90426:95::o;94037:237::-;94082:6;89071:3;94128:14;:12;:14::i;:::-;94119:40;;;;:::i;:::-;94104:56;;88912:5;94104:56;94101:147;;89071:3;94205:14;:12;:14::i;:::-;94183:37;;88912:5;94183:37;:::i;:::-;:53;;;;:::i;:::-;94176:60;;94037:237;:::o;94101:147::-;-1:-1:-1;94265:1:0;;94037:237::o;35749:164::-;35694:46;;35749:164::o;62479:330::-;62544:4;62634:23;:21;:23::i;:::-;:37;62624:47;;62581:201;;;;;-1:-1:-1;;;62709:23:0;:21;:23::i;:::-;:50;;;;:41;;;;;:50;;;;;;:68;:73;62561:221;62479:330;-1:-1:-1;;62479:330:0:o;80028:516::-;80157:13;80173:16;80181:7;80173;:16::i;:::-;80157:32;;80206:13;80202:219;;;86879:10;-1:-1:-1;;;;;80238:28:0;;;80234:187;;80290:44;80307:5;86879:10;62033:188;:::i;80290:44::-;80285:136;;80366:35;;-1:-1:-1;;;80366:35:0;;;;;;;;;;;80285:136;80490:2;80433:23;:21;:23::i;:::-;:48;;;;:39;;;;;:48;;;;;;:59;;-1:-1:-1;;;;;;80433:59:0;-1:-1:-1;;;;;80433:59:0;;;;;;80508:28;80433:48;;80508:28;;;;;;;;;;80433:48;80508:28;80146:398;80028:516;;;:::o;57112:1784::-;57179:14;57262:23;:21;:23::i;:::-;:50;;;;:41;;;;;:50;;;;;;;-1:-1:-1;;;;57362:24:0;;57358:1471;;57501:11;57497:1029;;57552:23;:21;:23::i;:::-;:37;57541:48;;57537:92;;57598:31;;-1:-1:-1;;;57598:31:0;;;;;;;;;;;57537:92;58312:23;:21;:23::i;:::-;-1:-1:-1;;58354:9:0;;;58312:52;;;;:41;;;;;:52;;;;;;;;-1:-1:-1;58422:11:0;58418:25;;58226:281;;58418:25;57112:1784;;;:::o;57358:1471::-;58857:31;;-1:-1:-1;;;58857:31:0;;;;;;;;;;;63690:524;63792:27;63821:23;63862:53;63918:23;:21;:23::i;:::-;:48;;;;:39;;:48;;-1:-1:-1;;63918:48:0;;;;64170:26;;63918:48;;64170:26;;-1:-1:-1;63690:524:0:o;79110:112::-;79187:27;79197:2;79201:8;79187:27;;;;;;;;;;;;:9;:27::i;18439:132::-;18347:6;;-1:-1:-1;;;;;18347:6:0;86879:10;18503:23;18495:68;;;;-1:-1:-1;;;18495:68:0;;23955:2:1;18495:68:0;;;23937:21:1;;;23974:18;;;23967:30;24033:34;24013:18;;;24006:62;24085:18;;18495:68:0;23753:356:1;19541:191:0;19634:6;;;-1:-1:-1;;;;;19651:17:0;;;-1:-1:-1;;;;;;19651:17:0;;;;;;;19684:40;;19634:6;;;19651:17;19634:6;;19684:40;;19615:16;;19684:40;19604:128;19541:191;:::o;21301:190::-;21426:4;21479;21450:25;21463:5;21470:4;21450:12;:25::i;:::-;:33;;21301:190;-1:-1:-1;;;;21301:190:0:o;71181:736::-;71378:99;;-1:-1:-1;;;71378:99:0;;71344:4;;-1:-1:-1;;;;;71378:56:0;;;;;:99;;86879:10;;71456:4;;71462:7;;71471:5;;71378:99;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;71378:99:0;;;;;;;;-1:-1:-1;;71378:99:0;;;;;;;;;;;;:::i;:::-;;;71361:549;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;71668:13:0;;71664:235;;71714:40;;-1:-1:-1;;;71714:40:0;;;;;;;;;;;71664:235;71857:6;71851:13;71842:6;71838:2;71834:15;71827:38;71361:549;-1:-1:-1;;;;;;71533:75:0;-1:-1:-1;;;71533:75:0;;-1:-1:-1;71361:549:0;71181:736;;;;;;:::o;90310:108::-;90370:13;90403:7;90396:14;;;;;:::i;86999:1745::-;87064:17;87498:4;87491;87485:11;87481:22;87590:1;87584:4;87577:15;87665:4;87662:1;87658:12;87651:19;;;87747:1;87742:3;87735:14;87851:3;88090:5;88072:428;88138:1;88133:3;88129:11;88122:18;;88309:2;88303:4;88299:13;88295:2;88291:22;88286:3;88278:36;88403:2;88393:13;;;88460:25;;88478:5;;88460:25;88072:428;;;-1:-1:-1;88530:13:0;;;-1:-1:-1;;88645:14:0;;;88707:19;;;88645:14;86999:1745;-1:-1:-1;86999:1745:0:o;48632:160::-;-1:-1:-1;;;;;;;;;;;33047:52:0;;;;;;33025:154;;;;-1:-1:-1;;;33025:154:0;;;;;;;:::i;:::-;48744:40:::1;48769:5;48776:7;48744:24;:40::i;17817:97::-:0;14121:13;;;;;;;14113:69;;;;-1:-1:-1;;;14113:69:0;;;;;;;:::i;:::-;17880:26:::1;:24;:26::i;50398:320::-:0;50453:7;;50644:23;:21;:23::i;:::-;:37;:55;;50398:320;-1:-1:-1;50398:320:0:o;78289:737::-;78420:19;78426:2;78430:8;78420:5;:19::i;:::-;-1:-1:-1;;;;;78481:14:0;;;:19;78477:531;;78521:11;78535:23;:21;:23::i;:::-;:37;;-1:-1:-1;78607:14:0;;;78640:233;78671:62;78710:1;78714:2;78718:7;;;;;;78727:5;78671:30;:62::i;:::-;78666:167;;78769:40;;-1:-1:-1;;;78769:40:0;;;;;;;;;;;78666:167;78868:3;78860:5;:11;78640:233;;78979:3;78938:23;:21;:23::i;:::-;:37;:44;78934:58;;78984:8;;;78934:58;78502:506;;78289:737;;;:::o;22168:296::-;22251:7;22294:4;22251:7;22309:118;22333:5;:12;22329:1;:16;22309:118;;;22382:33;22392:12;22406:5;22412:1;22406:8;;;;;;;;:::i;:::-;;;;;;;22382:9;:33::i;:::-;22367:48;-1:-1:-1;22347:3:0;;;;:::i;:::-;;;;22309:118;;48800:285;-1:-1:-1;;;;;;;;;;;33047:52:0;;;;;;33025:154;;;;-1:-1:-1;;;33025:154:0;;;;;;;:::i;:::-;48954:5:::1;48922:23;:21;:23::i;:::-;:29;;:37;;;;;;;;;;;;:::i;:::-;;49004:7;48970:23;:21;:23::i;:::-;:31;;:41;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;49477:7:0;49022:23:::1;:21;:23::i;:::-;:55:::0;-1:-1:-1;;48800:285:0:o;17922:113::-;14121:13;;;;;;;14113:69;;;;-1:-1:-1;;;14113:69:0;;;;;;;:::i;:::-;17995:32:::1;86879:10:::0;17995:18:::1;:32::i;72379:3062::-:0;72452:20;72475:23;:21;:23::i;:::-;:37;;-1:-1:-1;72527:13:0;72523:44;;72549:18;;-1:-1:-1;;;72549:18:0;;;;;;;;;;;72523:44;73117:32;73105:45;;73055:23;:21;:23::i;:::-;-1:-1:-1;;;;;73055:46:0;;;;;;:42;;;;;:46;;;;;;:95;;;;;;;;;59855:11;59830:23;59826:41;-1:-1:-1;60286:15:0;;60260:24;60256:46;59823:52;59813:63;73393:23;:21;:23::i;:::-;:55;;;;:41;;;;;:55;;;;;:197;;;;-1:-1:-1;;;;;74180:25:0;;;73652:23;;;;73435:12;;74180:25;;74417;73393:55;;74270:335;74931:1;74917:12;74913:20;74871:346;74972:3;74963:7;74960:16;74871:346;;75190:7;75180:8;75177:1;75150:25;75147:1;75144;75139:59;75025:1;75012:15;74871:346;;;-1:-1:-1;75250:13:0;75246:45;;75272:19;;-1:-1:-1;;;75272:19:0;;;;;;;;;;;75246:45;75348:3;75308:23;:21;:23::i;:::-;:43;-1:-1:-1;75373:60:0;;-1:-1:-1;68690:407:0;29208:149;29271:7;29302:1;29298;:5;:51;;29433:13;29527:15;;;29563:4;29556:15;;;29610:4;29594:21;;29298:51;;;29433:13;29527:15;;;29563:4;29556:15;;;29610:4;29594:21;;29306:20;29365:268;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:1;;1343:180;-1:-1:-1;1343:180:1:o;1736:131::-;-1:-1:-1;;;;;1811:31:1;;1801:42;;1791:70;;1857:1;1854;1847:12;1872:315;1940:6;1948;2001:2;1989:9;1980:7;1976:23;1972:32;1969:52;;;2017:1;2014;2007:12;1969:52;2056:9;2043:23;2075:31;2100:5;2075:31;:::i;:::-;2125:5;2177:2;2162:18;;;;2149:32;;-1:-1:-1;;;1872:315:1:o;2567:456::-;2644:6;2652;2660;2713:2;2701:9;2692:7;2688:23;2684:32;2681:52;;;2729:1;2726;2719:12;2681:52;2768:9;2755:23;2787:31;2812:5;2787:31;:::i;:::-;2837:5;-1:-1:-1;2894:2:1;2879:18;;2866:32;2907:33;2866:32;2907:33;:::i;:::-;2567:456;;2959:7;;-1:-1:-1;;;3013:2:1;2998:18;;;;2985:32;;2567:456::o;3028:127::-;3089:10;3084:3;3080:20;3077:1;3070:31;3120:4;3117:1;3110:15;3144:4;3141:1;3134:15;3160:275;3231:2;3225:9;3296:2;3277:13;;-1:-1:-1;;3273:27:1;3261:40;;-1:-1:-1;;;;;3316:34:1;;3352:22;;;3313:62;3310:88;;;3378:18;;:::i;:::-;3414:2;3407:22;3160:275;;-1:-1:-1;3160:275:1:o;3440:183::-;3500:4;-1:-1:-1;;;;;3525:6:1;3522:30;3519:56;;;3555:18;;:::i;:::-;-1:-1:-1;3600:1:1;3596:14;3612:4;3592:25;;3440:183::o;3628:662::-;3682:5;3735:3;3728:4;3720:6;3716:17;3712:27;3702:55;;3753:1;3750;3743:12;3702:55;3789:6;3776:20;3815:4;3839:60;3855:43;3895:2;3855:43;:::i;:::-;3839:60;:::i;:::-;3933:15;;;4019:1;4015:10;;;;4003:23;;3999:32;;;3964:12;;;;4043:15;;;4040:35;;;4071:1;4068;4061:12;4040:35;4107:2;4099:6;4095:15;4119:142;4135:6;4130:3;4127:15;4119:142;;;4201:17;;4189:30;;4239:12;;;;4152;;4119:142;;;-1:-1:-1;4279:5:1;3628:662;-1:-1:-1;;;;;;3628:662:1:o;4295:348::-;4379:6;4432:2;4420:9;4411:7;4407:23;4403:32;4400:52;;;4448:1;4445;4438:12;4400:52;4488:9;4475:23;-1:-1:-1;;;;;4513:6:1;4510:30;4507:50;;;4553:1;4550;4543:12;4507:50;4576:61;4629:7;4620:6;4609:9;4605:22;4576:61;:::i;4648:407::-;4713:5;-1:-1:-1;;;;;4739:6:1;4736:30;4733:56;;;4769:18;;:::i;:::-;4807:57;4852:2;4831:15;;-1:-1:-1;;4827:29:1;4858:4;4823:40;4807:57;:::i;:::-;4798:66;;4887:6;4880:5;4873:21;4927:3;4918:6;4913:3;4909:16;4906:25;4903:45;;;4944:1;4941;4934:12;4903:45;4993:6;4988:3;4981:4;4974:5;4970:16;4957:43;5047:1;5040:4;5031:6;5024:5;5020:18;5016:29;5009:40;4648:407;;;;;:::o;5060:222::-;5103:5;5156:3;5149:4;5141:6;5137:17;5133:27;5123:55;;5174:1;5171;5164:12;5123:55;5196:80;5272:3;5263:6;5250:20;5243:4;5235:6;5231:17;5196:80;:::i;5287:322::-;5356:6;5409:2;5397:9;5388:7;5384:23;5380:32;5377:52;;;5425:1;5422;5415:12;5377:52;5465:9;5452:23;-1:-1:-1;;;;;5490:6:1;5487:30;5484:50;;;5530:1;5527;5520:12;5484:50;5553;5595:7;5586:6;5575:9;5571:22;5553:50;:::i;5614:159::-;5681:20;;5741:6;5730:18;;5720:29;;5710:57;;5763:1;5760;5753:12;5778:666;5831:5;5884:3;5877:4;5869:6;5865:17;5861:27;5851:55;;5902:1;5899;5892:12;5851:55;5938:6;5925:20;5964:4;5988:60;6004:43;6044:2;6004:43;:::i;5988:60::-;6082:15;;;6168:1;6164:10;;;;6152:23;;6148:32;;;6113:12;;;;6192:15;;;6189:35;;;6220:1;6217;6210:12;6189:35;6256:2;6248:6;6244:15;6268:147;6284:6;6279:3;6276:15;6268:147;;;6350:22;6368:3;6350:22;:::i;:::-;6338:35;;6393:12;;;;6301;;6268:147;;6449:726;6574:6;6582;6590;6643:2;6631:9;6622:7;6618:23;6614:32;6611:52;;;6659:1;6656;6649:12;6611:52;6698:9;6685:23;6717:31;6742:5;6717:31;:::i;:::-;6767:5;-1:-1:-1;6823:2:1;6808:18;;6795:32;-1:-1:-1;;;;;6876:14:1;;;6873:34;;;6903:1;6900;6893:12;6873:34;6926:60;6978:7;6969:6;6958:9;6954:22;6926:60;:::i;:::-;6916:70;;7039:2;7028:9;7024:18;7011:32;6995:48;;7068:2;7058:8;7055:16;7052:36;;;7084:1;7081;7074:12;7052:36;;7107:62;7161:7;7150:8;7139:9;7135:24;7107:62;:::i;:::-;7097:72;;;6449:726;;;;;:::o;7365:247::-;7424:6;7477:2;7465:9;7456:7;7452:23;7448:32;7445:52;;;7493:1;7490;7483:12;7445:52;7532:9;7519:23;7551:31;7576:5;7551:31;:::i;7617:184::-;7675:6;7728:2;7716:9;7707:7;7703:23;7699:32;7696:52;;;7744:1;7741;7734:12;7696:52;7767:28;7785:9;7767:28;:::i;7806:160::-;7871:20;;7927:13;;7920:21;7910:32;;7900:60;;7956:1;7953;7946:12;7971:414;8060:6;8068;8121:2;8109:9;8100:7;8096:23;8092:32;8089:52;;;8137:1;8134;8127:12;8089:52;8177:9;8164:23;-1:-1:-1;;;;;8202:6:1;8199:30;8196:50;;;8242:1;8239;8232:12;8196:50;8265:60;8317:7;8308:6;8297:9;8293:22;8265:60;:::i;:::-;8255:70;;;8344:35;8375:2;8364:9;8360:18;8344:35;:::i;:::-;8334:45;;7971:414;;;;;:::o;8390:642::-;8555:2;8607:21;;;8677:13;;8580:18;;;8699:22;;;8526:4;;8555:2;8778:15;;;;8752:2;8737:18;;;8526:4;8821:185;8835:6;8832:1;8829:13;8821:185;;;8910:13;;8903:21;8896:29;8884:42;;8981:15;;;;8946:12;;;;8857:1;8850:9;8821:185;;;-1:-1:-1;9023:3:1;;8390:642;-1:-1:-1;;;;;;8390:642:1:o;9226:315::-;9291:6;9299;9352:2;9340:9;9331:7;9327:23;9323:32;9320:52;;;9368:1;9365;9358:12;9320:52;9407:9;9394:23;9426:31;9451:5;9426:31;:::i;:::-;9476:5;-1:-1:-1;9500:35:1;9531:2;9516:18;;9500:35;:::i;9546:416::-;9639:6;9647;9700:2;9688:9;9679:7;9675:23;9671:32;9668:52;;;9716:1;9713;9706:12;9668:52;9752:9;9739:23;9729:33;;9813:2;9802:9;9798:18;9785:32;-1:-1:-1;;;;;9832:6:1;9829:30;9826:50;;;9872:1;9869;9862:12;9826:50;9895:61;9948:7;9939:6;9928:9;9924:22;9895:61;:::i;:::-;9885:71;;;9546:416;;;;;:::o;9967:795::-;10062:6;10070;10078;10086;10139:3;10127:9;10118:7;10114:23;10110:33;10107:53;;;10156:1;10153;10146:12;10107:53;10195:9;10182:23;10214:31;10239:5;10214:31;:::i;:::-;10264:5;-1:-1:-1;10321:2:1;10306:18;;10293:32;10334:33;10293:32;10334:33;:::i;:::-;10386:7;-1:-1:-1;10440:2:1;10425:18;;10412:32;;-1:-1:-1;10495:2:1;10480:18;;10467:32;-1:-1:-1;;;;;10511:30:1;;10508:50;;;10554:1;10551;10544:12;10508:50;10577:22;;10630:4;10622:13;;10618:27;-1:-1:-1;10608:55:1;;10659:1;10656;10649:12;10608:55;10682:74;10748:7;10743:2;10730:16;10725:2;10721;10717:11;10682:74;:::i;:::-;10672:84;;;9967:795;;;;;;;:::o;10767:1021::-;10892:6;10900;10908;10916;10924;10977:3;10965:9;10956:7;10952:23;10948:33;10945:53;;;10994:1;10991;10984:12;10945:53;11034:9;11021:23;-1:-1:-1;;;;;11104:2:1;11096:6;11093:14;11090:34;;;11120:1;11117;11110:12;11090:34;11143:50;11185:7;11176:6;11165:9;11161:22;11143:50;:::i;:::-;11133:60;;11246:2;11235:9;11231:18;11218:32;11202:48;;11275:2;11265:8;11262:16;11259:36;;;11291:1;11288;11281:12;11259:36;11314:52;11358:7;11347:8;11336:9;11332:24;11314:52;:::i;:::-;11304:62;;11419:2;11408:9;11404:18;11391:32;11375:48;;11448:2;11438:8;11435:16;11432:36;;;11464:1;11461;11454:12;11432:36;;11487:52;11531:7;11520:8;11509:9;11505:24;11487:52;:::i;:::-;11477:62;;;11589:2;11578:9;11574:18;11561:32;11602:31;11627:5;11602:31;:::i;:::-;11652:5;-1:-1:-1;11709:3:1;11694:19;;11681:33;11723;11681;11723;:::i;:::-;11775:7;11765:17;;;10767:1021;;;;;;;;:::o;11793:388::-;11861:6;11869;11922:2;11910:9;11901:7;11897:23;11893:32;11890:52;;;11938:1;11935;11928:12;11890:52;11977:9;11964:23;11996:31;12021:5;11996:31;:::i;:::-;12046:5;-1:-1:-1;12103:2:1;12088:18;;12075:32;12116:33;12075:32;12116:33;:::i;:::-;12168:7;12158:17;;;11793:388;;;;;:::o;12186:1279::-;12309:6;12317;12325;12378:2;12366:9;12357:7;12353:23;12349:32;12346:52;;;12394:1;12391;12384:12;12346:52;12417:26;12433:9;12417:26;:::i;:::-;12407:36;;12462:2;12515;12504:9;12500:18;12487:32;-1:-1:-1;;;;;12579:2:1;12571:6;12568:14;12565:34;;;12595:1;12592;12585:12;12565:34;12633:6;12622:9;12618:22;12608:32;;12678:7;12671:4;12667:2;12663:13;12659:27;12649:55;;12700:1;12697;12690:12;12649:55;12736:2;12723:16;12759:60;12775:43;12815:2;12775:43;:::i;12759:60::-;12853:15;;;12935:1;12931:10;;;;12923:19;;12919:28;;;12884:12;;;;12959:19;;;12956:39;;;12991:1;12988;12981:12;12956:39;13015:11;;;;13035:217;13051:6;13046:3;13043:15;13035:217;;;13131:3;13118:17;13148:31;13173:5;13148:31;:::i;:::-;13192:18;;13068:12;;;;13230;;;;13035:217;;;13271:5;-1:-1:-1;;;13329:2:1;13314:18;;13301:32;;-1:-1:-1;13345:16:1;;;13342:36;;;13374:1;13371;13364:12;13342:36;;;13397:62;13451:7;13440:8;13429:9;13425:24;13397:62;:::i;13470:269::-;13527:6;13580:2;13568:9;13559:7;13555:23;13551:32;13548:52;;;13596:1;13593;13586:12;13548:52;13635:9;13622:23;13685:4;13678:5;13674:16;13667:5;13664:27;13654:55;;13705:1;13702;13695:12;13744:380;13823:1;13819:12;;;;13866;;;13887:61;;13941:4;13933:6;13929:17;13919:27;;13887:61;13994:2;13986:6;13983:14;13963:18;13960:38;13957:161;;;14040:10;14035:3;14031:20;14028:1;14021:31;14075:4;14072:1;14065:15;14103:4;14100:1;14093:15;13957:161;;13744:380;;;:::o;17991:127::-;18052:10;18047:3;18043:20;18040:1;18033:31;18083:4;18080:1;18073:15;18107:4;18104:1;18097:15;18667:251;18737:6;18790:2;18778:9;18769:7;18765:23;18761:32;18758:52;;;18806:1;18803;18796:12;18758:52;18838:9;18832:16;18857:31;18882:5;18857:31;:::i;19271:127::-;19332:10;19327:3;19323:20;19320:1;19313:31;19363:4;19360:1;19353:15;19387:4;19384:1;19377:15;19403:224;19442:3;19470:6;19503:2;19500:1;19496:10;19533:2;19530:1;19526:10;19564:3;19560:2;19556:12;19551:3;19548:21;19545:47;;;19572:18;;:::i;:::-;19608:13;;19403:224;-1:-1:-1;;;;19403:224:1:o;19632:135::-;19671:3;-1:-1:-1;;19692:17:1;;19689:43;;;19712:18;;:::i;:::-;-1:-1:-1;19759:1:1;19748:13;;19632:135::o;20122:197::-;20160:3;20188:6;20229:2;20222:5;20218:14;20256:2;20247:7;20244:15;20241:41;;;20262:18;;:::i;:::-;20311:1;20298:15;;20122:197;-1:-1:-1;;;20122:197:1:o;21032:217::-;21071:4;21100:6;21156:10;;;;21126;;21178:12;;;21175:38;;;21193:18;;:::i;:::-;21230:13;;21032:217;-1:-1:-1;;;21032:217:1:o;21488:470::-;21667:3;21705:6;21699:13;21721:53;21767:6;21762:3;21755:4;21747:6;21743:17;21721:53;:::i;:::-;21837:13;;21796:16;;;;21859:57;21837:13;21796:16;21893:4;21881:17;;21859:57;:::i;24114:489::-;-1:-1:-1;;;;;24383:15:1;;;24365:34;;24435:15;;24430:2;24415:18;;24408:43;24482:2;24467:18;;24460:34;;;24530:3;24525:2;24510:18;;24503:31;;;24308:4;;24551:46;;24577:19;;24569:6;24551:46;:::i;:::-;24543:54;24114:489;-1:-1:-1;;;;;;24114:489:1:o;24608:249::-;24677:6;24730:2;24718:9;24709:7;24705:23;24701:32;24698:52;;;24746:1;24743;24736:12;24698:52;24778:9;24772:16;24797:30;24821:5;24797:30;:::i;24862:416::-;25064:2;25046:21;;;25103:2;25083:18;;;25076:30;25142:34;25137:2;25122:18;;25115:62;-1:-1:-1;;;25208:2:1;25193:18;;25186:50;25268:3;25253:19;;24862:416::o;25283:407::-;25485:2;25467:21;;;25524:2;25504:18;;;25497:30;25563:34;25558:2;25543:18;;25536:62;-1:-1:-1;;;25629:2:1;25614:18;;25607:41;25680:3;25665:19;;25283:407::o
Swarm Source
ipfs://82f93be88be29ae46cfc2c77020eb5061bb53c402341fc4ca1e72c8556c0c14c
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.