Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 319 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 16747241 | 549 days ago | IN | 0 ETH | 0.00091485 | ||||
Set Approval For... | 15910148 | 666 days ago | IN | 0 ETH | 0.00052533 | ||||
Withdraw | 15909198 | 667 days ago | IN | 0 ETH | 0.00036682 | ||||
Set Approval For... | 15907453 | 667 days ago | IN | 0 ETH | 0.00048576 | ||||
Set Approval For... | 15906627 | 667 days ago | IN | 0 ETH | 0.0005723 | ||||
Set Approval For... | 15905549 | 667 days ago | IN | 0 ETH | 0.00059232 | ||||
Set Approval For... | 15905193 | 667 days ago | IN | 0 ETH | 0.00061818 | ||||
Transfer From | 15905160 | 667 days ago | IN | 0 ETH | 0.00091427 | ||||
Transfer From | 15905159 | 667 days ago | IN | 0 ETH | 0.00088418 | ||||
Set Approval For... | 15905149 | 667 days ago | IN | 0 ETH | 0.00066465 | ||||
Set Approval For... | 15905135 | 667 days ago | IN | 0 ETH | 0.00060252 | ||||
Set Approval For... | 15905135 | 667 days ago | IN | 0 ETH | 0.00060252 | ||||
Set Approval For... | 15905127 | 667 days ago | IN | 0 ETH | 0.00067731 | ||||
Set Approval For... | 15905126 | 667 days ago | IN | 0 ETH | 0.00064928 | ||||
Set Approval For... | 15905122 | 667 days ago | IN | 0 ETH | 0.00061961 | ||||
Set Approval For... | 15905122 | 667 days ago | IN | 0 ETH | 0.00061961 | ||||
Set Approval For... | 15905121 | 667 days ago | IN | 0 ETH | 0.00055958 | ||||
Set Approval For... | 15905114 | 667 days ago | IN | 0 ETH | 0.00054022 | ||||
Set Approval For... | 15905104 | 667 days ago | IN | 0 ETH | 0.00066791 | ||||
Transfer From | 15905097 | 667 days ago | IN | 0 ETH | 0.00058587 | ||||
Transfer From | 15905097 | 667 days ago | IN | 0 ETH | 0.00083444 | ||||
Set Approval For... | 15905093 | 667 days ago | IN | 0 ETH | 0.00054862 | ||||
Set Approval For... | 15905091 | 667 days ago | IN | 0 ETH | 0.00057019 | ||||
Set Approval For... | 15905088 | 667 days ago | IN | 0 ETH | 0.0005364 | ||||
Set Approval For... | 15905086 | 667 days ago | IN | 0 ETH | 0.00057587 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
15909198 | 667 days ago | 0.035 ETH |
Loading...
Loading
Contract Name:
B612Cats
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-10-04 */ // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. * * 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. */ library MerkleProof { /** * @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 proved to be a part of a Merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * _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} * * _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 the sibling nodes in `proof`, * consuming from one or the other at each step according to the instructions given by * `proofFlags`. * * _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} * * _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: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: erc721a/contracts/IERC721A.sol // ERC721A Contracts v4.2.2 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721A. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * 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; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @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; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================================================= // 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/contracts/ERC721A.sol // ERC721A Contracts v4.2.2 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721 token receiver. */ interface ERC721A__IERC721Receiver { 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 ERC721A is IERC721A { // Reference type for token approval. struct TokenApprovalRef { address value; } // ============================================================= // 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; // ============================================================= // STORAGE // ============================================================= // The next token ID to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See {_packedOwnershipOf} implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => TokenApprovalRef) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // ============================================================= // CONSTRUCTOR // ============================================================= constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _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 _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 _currentIndex - _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 _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view virtual returns (uint256) { return _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 _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_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 (_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(_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 = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); _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 _name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return _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(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & _BITMASK_BURNED == 0) { // 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, `curr` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } 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. * 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) public virtual override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } /** * @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 _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 { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _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 _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 < _currentIndex && // If within bounds, _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) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`. 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 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. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _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 (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _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 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 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__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(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 = _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`. _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`. _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. 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`. ) 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(); _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 = _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`. _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`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _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 = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } // ============================================================= // 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;`. _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`. _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 (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _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 { _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 = _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); _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 0x80 bytes to keep the free memory pointer 32-byte word aliged. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 0x20 + 3 * 0x20 = 0x80. str := add(mload(0x40), 0x80) // Update the free memory pointer to allocate. mstore(0x40, str) // 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: erc721a/contracts/extensions/IERC721AQueryable.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721AQueryable. */ interface IERC721AQueryable is IERC721A { /** * Invalid query range (`start` >= `stop`). */ error InvalidQueryRange(); /** * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting. * * If the `tokenId` is out of bounds: * * - `addr = address(0)` * - `startTimestamp = 0` * - `burned = false` * - `extraData = 0` * * If the `tokenId` is burned: * * - `addr = <Address of owner before token was burned>` * - `startTimestamp = <Timestamp when token was burned>` * - `burned = true` * - `extraData = <Extra data when token was burned>` * * Otherwise: * * - `addr = <Address of owner>` * - `startTimestamp = <Timestamp of start of ownership>` * - `burned = false` * - `extraData = <Extra data at start of ownership>` */ function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory); /** * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory); /** * @dev Returns an array of token IDs owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - `start < stop` */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) external view returns (uint256[] memory); /** * @dev Returns an array of token IDs owned by `owner`. * * This function scans the ownership mapping and is O(`totalSupply`) in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K collections should be fine). */ function tokensOfOwner(address owner) external view returns (uint256[] memory); } // File: erc721a/contracts/extensions/ERC721AQueryable.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @title ERC721AQueryable. * * @dev ERC721A subclass with convenience query functions. */ abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable { /** * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting. * * If the `tokenId` is out of bounds: * * - `addr = address(0)` * - `startTimestamp = 0` * - `burned = false` * - `extraData = 0` * * If the `tokenId` is burned: * * - `addr = <Address of owner before token was burned>` * - `startTimestamp = <Timestamp when token was burned>` * - `burned = true` * - `extraData = <Extra data when token was burned>` * * Otherwise: * * - `addr = <Address of owner>` * - `startTimestamp = <Timestamp of start of ownership>` * - `burned = false` * - `extraData = <Extra data at start of ownership>` */ function explicitOwnershipOf(uint256 tokenId) public view virtual override returns (TokenOwnership memory) { TokenOwnership memory ownership; if (tokenId < _startTokenId() || tokenId >= _nextTokenId()) { return ownership; } ownership = _ownershipAt(tokenId); if (ownership.burned) { return ownership; } return _ownershipOf(tokenId); } /** * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] calldata tokenIds) external view virtual override returns (TokenOwnership[] memory) { unchecked { uint256 tokenIdsLength = tokenIds.length; TokenOwnership[] memory ownerships = new TokenOwnership[](tokenIdsLength); for (uint256 i; i != tokenIdsLength; ++i) { ownerships[i] = explicitOwnershipOf(tokenIds[i]); } return ownerships; } } /** * @dev Returns an array of token IDs owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - `start < stop` */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) external view virtual override returns (uint256[] memory) { unchecked { if (start >= stop) revert InvalidQueryRange(); uint256 tokenIdsIdx; uint256 stopLimit = _nextTokenId(); // Set `start = max(start, _startTokenId())`. if (start < _startTokenId()) { start = _startTokenId(); } // Set `stop = min(stop, stopLimit)`. if (stop > stopLimit) { stop = stopLimit; } uint256 tokenIdsMaxLength = balanceOf(owner); // Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`, // to cater for cases where `balanceOf(owner)` is too big. if (start < stop) { uint256 rangeLength = stop - start; if (rangeLength < tokenIdsMaxLength) { tokenIdsMaxLength = rangeLength; } } else { tokenIdsMaxLength = 0; } uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength); if (tokenIdsMaxLength == 0) { return tokenIds; } // We need to call `explicitOwnershipOf(start)`, // because the slot at `start` may not be initialized. TokenOwnership memory ownership = explicitOwnershipOf(start); address currOwnershipAddr; // If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`. // `ownership.address` will not be zero, as `start` is clamped to the valid token ID range. if (!ownership.burned) { currOwnershipAddr = ownership.addr; } for (uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i) { ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } // Downsize the array to fit. assembly { mstore(tokenIds, tokenIdsIdx) } return tokenIds; } } /** * @dev Returns an array of token IDs owned by `owner`. * * This function scans the ownership mapping and is O(`totalSupply`) in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K collections should be fine). */ function tokensOfOwner(address owner) external view virtual override returns (uint256[] memory) { unchecked { uint256 tokenIdsIdx; address currOwnershipAddr; uint256 tokenIdsLength = balanceOf(owner); uint256[] memory tokenIds = new uint256[](tokenIdsLength); TokenOwnership memory ownership; for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i) { ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } return tokenIds; } } } // File: contracts/B612Cats.sol // B612Cats pragma solidity >=0.8.9 <0.9.0; contract B612Cats is ERC721AQueryable, Ownable, ReentrancyGuard { using Strings for uint256; bytes32 public merkleRoot; mapping(address => bool) public whitelistClaimed; string public uriPrefix = ''; string public uriSuffix = '.json'; string public hiddenMetadataUri; uint256 public cost = 0.003 ether; uint256 public maxSupply = 444; uint256 public maxMintAmountPerTx = 2; bool public paused = false; bool public whitelistMintEnabled = false; bool public revealed = true; constructor( string memory _tokenName, string memory _tokenSymbol, uint256 _cost, uint256 _maxSupply, uint256 _maxMintAmountPerTx, string memory _hiddenMetadataUri ) ERC721A(_tokenName, _tokenSymbol) { setCost(_cost); maxSupply = _maxSupply; setMaxMintAmountPerTx(_maxMintAmountPerTx); setHiddenMetadataUri(_hiddenMetadataUri); } modifier mintCompliance(uint256 _mintAmount) { require(_mintAmount > 0 && _mintAmount <= maxMintAmountPerTx, 'Invalid mint amount!'); require(totalSupply() + _mintAmount <= maxSupply, 'Max supply exceeded!'); _; } modifier mintPriceCompliance(uint256 _mintAmount) { require(msg.value >= cost * _mintAmount, 'Insufficient funds!'); _; } //whitelisted people can claim 1 free no need to change the function name function whitelistMint(uint256 _mintAmount, bytes32[] calldata _merkleProof) public payable mintCompliance(_mintAmount) { // Verify claimlist requirements require(whitelistMintEnabled, 'The whitelist sale is not enabled!'); require(!whitelistClaimed[_msgSender()], 'Address already claimed!'); bytes32 leaf = keccak256(abi.encodePacked(_msgSender())); require(MerkleProof.verify(_merkleProof, merkleRoot, leaf), 'Invalid proof!'); _mintAmount = 1; whitelistClaimed[_msgSender()] = true; _safeMint(_msgSender(), _mintAmount); } function mint(uint256 _mintAmount) public payable mintCompliance(_mintAmount) mintPriceCompliance(_mintAmount) { require(!paused, 'The contract is paused!'); _safeMint(_msgSender(), _mintAmount); } function mintForAddress(uint256 _mintAmount, address _receiver) public mintCompliance(_mintAmount) onlyOwner { _safeMint(_receiver, _mintAmount); } function _startTokenId() internal view virtual override returns (uint256) { return 1; } function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) { require(_exists(_tokenId), 'ERC721Metadata: URI query for nonexistent token'); if (revealed == false) { return hiddenMetadataUri; } string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), uriSuffix)) : ''; } function setRevealed(bool _state) public onlyOwner { revealed = _state; } function setCost(uint256 _cost) public onlyOwner { cost = _cost; } function setMaxMintAmountPerTx(uint256 _maxMintAmountPerTx) public onlyOwner { maxMintAmountPerTx = _maxMintAmountPerTx; } function setHiddenMetadataUri(string memory _hiddenMetadataUri) public onlyOwner { hiddenMetadataUri = _hiddenMetadataUri; } function setUriPrefix(string memory _uriPrefix) public onlyOwner { uriPrefix = _uriPrefix; } function setUriSuffix(string memory _uriSuffix) public onlyOwner { uriSuffix = _uriSuffix; } function setPaused(bool _state) public onlyOwner { paused = _state; } function setMerkleRoot(bytes32 _merkleRoot) public onlyOwner { merkleRoot = _merkleRoot; } function setWhitelistMintEnabled(bool _state) public onlyOwner { whitelistMintEnabled = _state; } function withdraw() public onlyOwner nonReentrant { (bool os, ) = payable(owner()).call{value: address(this).balance}(''); require(os); } function _baseURI() internal view virtual override returns (string memory) { return uriPrefix; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_tokenName","type":"string"},{"internalType":"string","name":"_tokenSymbol","type":"string"},{"internalType":"uint256","name":"_cost","type":"uint256"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"},{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"},{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","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":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"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":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"}],"name":"setMaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setWhitelistMintEnabled","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":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"whitelistMintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260405180602001604052806000815250600c90805190602001906200002b929190620003c0565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600d908051906020019062000079929190620003c0565b50660aa87bee538000600f556101bc60105560026011556000601260006101000a81548160ff0219169083151502179055506000601260016101000a81548160ff0219169083151502179055506001601260026101000a81548160ff021916908315150217905550348015620000ee57600080fd5b5060405162004eb938038062004eb9833981810160405281019062000114919062000648565b858581600290805190602001906200012e929190620003c0565b50806003908051906020019062000147929190620003c0565b5062000158620001ce60201b60201c565b60008190555050506200018062000174620001d760201b60201c565b620001df60201b60201c565b60016009819055506200019984620002a560201b60201c565b82601081905550620001b182620002bf60201b60201c565b620001c281620002d960201b60201c565b50505050505062000829565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002b56200030560201b60201c565b80600f8190555050565b620002cf6200030560201b60201c565b8060118190555050565b620002e96200030560201b60201c565b80600e908051906020019062000301929190620003c0565b5050565b62000315620001d760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200033b6200039660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000394576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200038b90620007a2565b60405180910390fd5b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620003ce90620007f3565b90600052602060002090601f016020900481019282620003f257600085556200043e565b82601f106200040d57805160ff19168380011785556200043e565b828001600101855582156200043e579182015b828111156200043d57825182559160200191906001019062000420565b5b5090506200044d919062000451565b5090565b5b808211156200046c57600081600090555060010162000452565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620004d9826200048e565b810181811067ffffffffffffffff82111715620004fb57620004fa6200049f565b5b80604052505050565b60006200051062000470565b90506200051e8282620004ce565b919050565b600067ffffffffffffffff8211156200054157620005406200049f565b5b6200054c826200048e565b9050602081019050919050565b60005b83811015620005795780820151818401526020810190506200055c565b8381111562000589576000848401525b50505050565b6000620005a6620005a08462000523565b62000504565b905082815260208101848484011115620005c557620005c462000489565b5b620005d284828562000559565b509392505050565b600082601f830112620005f257620005f162000484565b5b8151620006048482602086016200058f565b91505092915050565b6000819050919050565b62000622816200060d565b81146200062e57600080fd5b50565b600081519050620006428162000617565b92915050565b60008060008060008060c087890312156200066857620006676200047a565b5b600087015167ffffffffffffffff8111156200068957620006886200047f565b5b6200069789828a01620005da565b965050602087015167ffffffffffffffff811115620006bb57620006ba6200047f565b5b620006c989828a01620005da565b9550506040620006dc89828a0162000631565b9450506060620006ef89828a0162000631565b93505060806200070289828a0162000631565b92505060a087015167ffffffffffffffff8111156200072657620007256200047f565b5b6200073489828a01620005da565b9150509295509295509295565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006200078a60208362000741565b9150620007978262000752565b602082019050919050565b60006020820190508181036000830152620007bd816200077b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200080c57607f821691505b60208210811415620008235762000822620007c4565b5b50919050565b61468080620008396000396000f3fe6080604052600436106102725760003560e01c8063715018a61161014f578063b071401b116100c1578063d5abeb011161007a578063d5abeb0114610946578063db4bec4414610971578063e0a80853146109ae578063e985e9c5146109d7578063efbd73f414610a14578063f2fde38b14610a3d57610272565b8063b071401b14610835578063b767a0981461085e578063b88d4fde14610887578063c23dc68f146108b0578063c87b56dd146108ed578063d2cab0561461092a57610272565b806394354fd01161011357806394354fd01461073257806395d89b411461075d57806399a2557a14610788578063a0712d68146107c5578063a22cb465146107e1578063a45ba8e71461080a57610272565b8063715018a6146106615780637cb64759146106785780637ec4a659146106a15780638462151c146106ca5780638da5cb5b1461070757610272565b806342842e0e116101e85780635bbb2177116101ac5780635bbb2177146105295780635c975abb1461056657806362b99ad4146105915780636352211e146105bc5780636caede3d146105f957806370a082311461062457610272565b806342842e0e1461045857806344a0d68a146104815780634fdd43cb146104aa57806351830227146104d35780635503a0e8146104fe57610272565b806316ba10e01161023a57806316ba10e01461037057806316c38b3c1461039957806318160ddd146103c257806323b872dd146103ed5780632eb4a7ab146104165780633ccfd60b1461044157610272565b806301ffc9a71461027757806306fdde03146102b4578063081812fc146102df578063095ea7b31461031c57806313faede614610345575b600080fd5b34801561028357600080fd5b5061029e60048036038101906102999190613064565b610a66565b6040516102ab91906130ac565b60405180910390f35b3480156102c057600080fd5b506102c9610af8565b6040516102d69190613160565b60405180910390f35b3480156102eb57600080fd5b50610306600480360381019061030191906131b8565b610b8a565b6040516103139190613226565b60405180910390f35b34801561032857600080fd5b50610343600480360381019061033e919061326d565b610c09565b005b34801561035157600080fd5b5061035a610d4d565b60405161036791906132bc565b60405180910390f35b34801561037c57600080fd5b506103976004803603810190610392919061340c565b610d53565b005b3480156103a557600080fd5b506103c060048036038101906103bb9190613481565b610d75565b005b3480156103ce57600080fd5b506103d7610d9a565b6040516103e491906132bc565b60405180910390f35b3480156103f957600080fd5b50610414600480360381019061040f91906134ae565b610db1565b005b34801561042257600080fd5b5061042b6110d6565b604051610438919061351a565b60405180910390f35b34801561044d57600080fd5b506104566110dc565b005b34801561046457600080fd5b5061047f600480360381019061047a91906134ae565b6111ba565b005b34801561048d57600080fd5b506104a860048036038101906104a391906131b8565b6111da565b005b3480156104b657600080fd5b506104d160048036038101906104cc919061340c565b6111ec565b005b3480156104df57600080fd5b506104e861120e565b6040516104f591906130ac565b60405180910390f35b34801561050a57600080fd5b50610513611221565b6040516105209190613160565b60405180910390f35b34801561053557600080fd5b50610550600480360381019061054b9190613595565b6112af565b60405161055d9190613745565b60405180910390f35b34801561057257600080fd5b5061057b611372565b60405161058891906130ac565b60405180910390f35b34801561059d57600080fd5b506105a6611385565b6040516105b39190613160565b60405180910390f35b3480156105c857600080fd5b506105e360048036038101906105de91906131b8565b611413565b6040516105f09190613226565b60405180910390f35b34801561060557600080fd5b5061060e611425565b60405161061b91906130ac565b60405180910390f35b34801561063057600080fd5b5061064b60048036038101906106469190613767565b611438565b60405161065891906132bc565b60405180910390f35b34801561066d57600080fd5b506106766114f1565b005b34801561068457600080fd5b5061069f600480360381019061069a91906137c0565b611505565b005b3480156106ad57600080fd5b506106c860048036038101906106c3919061340c565b611517565b005b3480156106d657600080fd5b506106f160048036038101906106ec9190613767565b611539565b6040516106fe91906138ab565b60405180910390f35b34801561071357600080fd5b5061071c611683565b6040516107299190613226565b60405180910390f35b34801561073e57600080fd5b506107476116ad565b60405161075491906132bc565b60405180910390f35b34801561076957600080fd5b506107726116b3565b60405161077f9190613160565b60405180910390f35b34801561079457600080fd5b506107af60048036038101906107aa91906138cd565b611745565b6040516107bc91906138ab565b60405180910390f35b6107df60048036038101906107da91906131b8565b611959565b005b3480156107ed57600080fd5b5061080860048036038101906108039190613920565b611ab9565b005b34801561081657600080fd5b5061081f611c31565b60405161082c9190613160565b60405180910390f35b34801561084157600080fd5b5061085c600480360381019061085791906131b8565b611cbf565b005b34801561086a57600080fd5b5061088560048036038101906108809190613481565b611cd1565b005b34801561089357600080fd5b506108ae60048036038101906108a99190613a01565b611cf6565b005b3480156108bc57600080fd5b506108d760048036038101906108d291906131b8565b611d69565b6040516108e49190613ad9565b60405180910390f35b3480156108f957600080fd5b50610914600480360381019061090f91906131b8565b611dd3565b6040516109219190613160565b60405180910390f35b610944600480360381019061093f9190613b4a565b611f2c565b005b34801561095257600080fd5b5061095b6121f2565b60405161096891906132bc565b60405180910390f35b34801561097d57600080fd5b5061099860048036038101906109939190613767565b6121f8565b6040516109a591906130ac565b60405180910390f35b3480156109ba57600080fd5b506109d560048036038101906109d09190613481565b612218565b005b3480156109e357600080fd5b506109fe60048036038101906109f99190613baa565b61223d565b604051610a0b91906130ac565b60405180910390f35b348015610a2057600080fd5b50610a3b6004803603810190610a369190613bea565b6122d1565b005b348015610a4957600080fd5b50610a646004803603810190610a5f9190613767565b612391565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ac157506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610af15750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610b0790613c59565b80601f0160208091040260200160405190810160405280929190818152602001828054610b3390613c59565b8015610b805780601f10610b5557610100808354040283529160200191610b80565b820191906000526020600020905b815481529060010190602001808311610b6357829003601f168201915b5050505050905090565b6000610b9582612415565b610bcb576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c1482611413565b90508073ffffffffffffffffffffffffffffffffffffffff16610c35612474565b73ffffffffffffffffffffffffffffffffffffffff1614610c9857610c6181610c5c612474565b61223d565b610c97576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600f5481565b610d5b61247c565b80600d9080519060200190610d71929190612f06565b5050565b610d7d61247c565b80601260006101000a81548160ff02191690831515021790555050565b6000610da46124fa565b6001546000540303905090565b6000610dbc82612503565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e23576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610e2f846125d1565b91509150610e458187610e40612474565b6125f8565b610e9157610e5a86610e55612474565b61223d565b610e90576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610ef8576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f05868686600161263c565b8015610f1057600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610fde85610fba888887612642565b7c02000000000000000000000000000000000000000000000000000000001761266a565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415611066576000600185019050600060046000838152602001908152602001600020541415611064576000548114611063578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46110ce8686866001612695565b505050505050565b600a5481565b6110e461247c565b6002600954141561112a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112190613cd7565b60405180910390fd5b6002600981905550600061113c611683565b73ffffffffffffffffffffffffffffffffffffffff164760405161115f90613d28565b60006040518083038185875af1925050503d806000811461119c576040519150601f19603f3d011682016040523d82523d6000602084013e6111a1565b606091505b50509050806111af57600080fd5b506001600981905550565b6111d583838360405180602001604052806000815250611cf6565b505050565b6111e261247c565b80600f8190555050565b6111f461247c565b80600e908051906020019061120a929190612f06565b5050565b601260029054906101000a900460ff1681565b600d805461122e90613c59565b80601f016020809104026020016040519081016040528092919081815260200182805461125a90613c59565b80156112a75780601f1061127c576101008083540402835291602001916112a7565b820191906000526020600020905b81548152906001019060200180831161128a57829003601f168201915b505050505081565b6060600083839050905060008167ffffffffffffffff8111156112d5576112d46132e1565b5b60405190808252806020026020018201604052801561130e57816020015b6112fb612f8c565b8152602001906001900390816112f35790505b50905060005b8281146113665761133d86868381811061133157611330613d3d565b5b90506020020135611d69565b8282815181106113505761134f613d3d565b5b6020026020010181905250806001019050611314565b50809250505092915050565b601260009054906101000a900460ff1681565b600c805461139290613c59565b80601f01602080910402602001604051908101604052809291908181526020018280546113be90613c59565b801561140b5780601f106113e05761010080835404028352916020019161140b565b820191906000526020600020905b8154815290600101906020018083116113ee57829003601f168201915b505050505081565b600061141e82612503565b9050919050565b601260019054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114a0576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6114f961247c565b611503600061269b565b565b61150d61247c565b80600a8190555050565b61151f61247c565b80600c9080519060200190611535929190612f06565b5050565b6060600080600061154985611438565b905060008167ffffffffffffffff811115611567576115666132e1565b5b6040519080825280602002602001820160405280156115955781602001602082028036833780820191505090505b5090506115a0612f8c565b60006115aa6124fa565b90505b838614611675576115bd81612761565b91508160400151156115ce5761166a565b600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461160e57816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611669578083878060010198508151811061165c5761165b613d3d565b5b6020026020010181815250505b5b8060010190506115ad565b508195505050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60115481565b6060600380546116c290613c59565b80601f01602080910402602001604051908101604052809291908181526020018280546116ee90613c59565b801561173b5780601f106117105761010080835404028352916020019161173b565b820191906000526020600020905b81548152906001019060200180831161171e57829003601f168201915b5050505050905090565b6060818310611780576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061178b61278c565b90506117956124fa565b8510156117a7576117a46124fa565b94505b808411156117b3578093505b60006117be87611438565b9050848610156117e15760008686039050818110156117db578091505b506117e6565b600090505b60008167ffffffffffffffff811115611802576118016132e1565b5b6040519080825280602002602001820160405280156118305781602001602082028036833780820191505090505b50905060008214156118485780945050505050611952565b600061185388611d69565b90506000816040015161186857816000015190505b60008990505b88811415801561187e5750848714155b156119445761188c81612761565b925082604001511561189d57611939565b600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff16146118dd57826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611938578084888060010199508151811061192b5761192a613d3d565b5b6020026020010181815250505b5b80600101905061186e565b508583528296505050505050505b9392505050565b8060008111801561196c57506011548111155b6119ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a290613db8565b60405180910390fd5b601054816119b7610d9a565b6119c19190613e07565b1115611a02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f990613ea9565b60405180910390fd5b8180600f54611a119190613ec9565b341015611a53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4a90613f6f565b60405180910390fd5b601260009054906101000a900460ff1615611aa3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9a90613fdb565b60405180910390fd5b611ab4611aae612795565b8461279d565b505050565b611ac1612474565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b26576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611b33612474565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611be0612474565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c2591906130ac565b60405180910390a35050565b600e8054611c3e90613c59565b80601f0160208091040260200160405190810160405280929190818152602001828054611c6a90613c59565b8015611cb75780601f10611c8c57610100808354040283529160200191611cb7565b820191906000526020600020905b815481529060010190602001808311611c9a57829003601f168201915b505050505081565b611cc761247c565b8060118190555050565b611cd961247c565b80601260016101000a81548160ff02191690831515021790555050565b611d01848484610db1565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611d6357611d2c848484846127bb565b611d62576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611d71612f8c565b611d79612f8c565b611d816124fa565b831080611d955750611d9161278c565b8310155b15611da35780915050611dce565b611dac83612761565b9050806040015115611dc15780915050611dce565b611dca8361291b565b9150505b919050565b6060611dde82612415565b611e1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e149061406d565b60405180910390fd5b60001515601260029054906101000a900460ff1615151415611ecb57600e8054611e4690613c59565b80601f0160208091040260200160405190810160405280929190818152602001828054611e7290613c59565b8015611ebf5780601f10611e9457610100808354040283529160200191611ebf565b820191906000526020600020905b815481529060010190602001808311611ea257829003601f168201915b50505050509050611f27565b6000611ed561293b565b90506000815111611ef55760405180602001604052806000815250611f23565b80611eff846129cd565b600d604051602001611f139392919061415d565b6040516020818303038152906040525b9150505b919050565b82600081118015611f3f57506011548111155b611f7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7590613db8565b60405180910390fd5b60105481611f8a610d9a565b611f949190613e07565b1115611fd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fcc90613ea9565b60405180910390fd5b601260019054906101000a900460ff16612024576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201b90614200565b60405180910390fd5b600b6000612030612795565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156120b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120af9061426c565b60405180910390fd5b60006120c2612795565b6040516020016120d291906142d4565b604051602081830303815290604052805190602001209050612138848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600a5483612b2e565b612177576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216e9061433b565b60405180910390fd5b600194506001600b6000612189612795565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506121eb6121e5612795565b8661279d565b5050505050565b60105481565b600b6020528060005260406000206000915054906101000a900460ff1681565b61222061247c565b80601260026101000a81548160ff02191690831515021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b816000811180156122e457506011548111155b612323576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231a90613db8565b60405180910390fd5b6010548161232f610d9a565b6123399190613e07565b111561237a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237190613ea9565b60405180910390fd5b61238261247c565b61238c828461279d565b505050565b61239961247c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612409576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612400906143cd565b60405180910390fd5b6124128161269b565b50565b6000816124206124fa565b1115801561242f575060005482105b801561246d575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b612484612795565b73ffffffffffffffffffffffffffffffffffffffff166124a2611683565b73ffffffffffffffffffffffffffffffffffffffff16146124f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ef90614439565b60405180910390fd5b565b60006001905090565b600080829050806125126124fa565b1161259a576000548110156125995760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415612597575b600081141561258d576004600083600190039350838152602001908152602001600020549050612562565b80925050506125cc565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8612659868684612b45565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612769612f8c565b6127856004600084815260200190815260200160002054612b4e565b9050919050565b60008054905090565b600033905090565b6127b7828260405180602001604052806000815250612c04565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026127e1612474565b8786866040518563ffffffff1660e01b815260040161280394939291906144ae565b602060405180830381600087803b15801561281d57600080fd5b505af192505050801561284e57506040513d601f19601f8201168201806040525081019061284b919061450f565b60015b6128c8573d806000811461287e576040519150601f19603f3d011682016040523d82523d6000602084013e612883565b606091505b506000815114156128c0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b612923612f8c565b61293461292f83612503565b612b4e565b9050919050565b6060600c805461294a90613c59565b80601f016020809104026020016040519081016040528092919081815260200182805461297690613c59565b80156129c35780601f10612998576101008083540402835291602001916129c3565b820191906000526020600020905b8154815290600101906020018083116129a657829003601f168201915b5050505050905090565b60606000821415612a15576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612b29565b600082905060005b60008214612a47578080612a309061453c565b915050600a82612a4091906145b4565b9150612a1d565b60008167ffffffffffffffff811115612a6357612a626132e1565b5b6040519080825280601f01601f191660200182016040528015612a955781602001600182028036833780820191505090505b5090505b60008514612b2257600182612aae91906145e5565b9150600a85612abd9190614619565b6030612ac99190613e07565b60f81b818381518110612adf57612ade613d3d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612b1b91906145b4565b9450612a99565b8093505050505b919050565b600082612b3b8584612ca1565b1490509392505050565b60009392505050565b612b56612f8c565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b612c0e8383612cf7565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612c9c57600080549050600083820390505b612c4e60008683806001019450866127bb565b612c84576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612c3b578160005414612c9957600080fd5b50505b505050565b60008082905060005b8451811015612cec57612cd782868381518110612cca57612cc9613d3d565b5b6020026020010151612eb4565b91508080612ce49061453c565b915050612caa565b508091505092915050565b6000805490506000821415612d38576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612d45600084838561263c565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612dbc83612dad6000866000612642565b612db685612edf565b1761266a565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114612e5d57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612e22565b506000821415612e99576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050612eaf6000848385612695565b505050565b6000818310612ecc57612ec78284612eef565b612ed7565b612ed68383612eef565b5b905092915050565b60006001821460e11b9050919050565b600082600052816020526040600020905092915050565b828054612f1290613c59565b90600052602060002090601f016020900481019282612f345760008555612f7b565b82601f10612f4d57805160ff1916838001178555612f7b565b82800160010185558215612f7b579182015b82811115612f7a578251825591602001919060010190612f5f565b5b509050612f889190612fdb565b5090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b5b80821115612ff4576000816000905550600101612fdc565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6130418161300c565b811461304c57600080fd5b50565b60008135905061305e81613038565b92915050565b60006020828403121561307a57613079613002565b5b60006130888482850161304f565b91505092915050565b60008115159050919050565b6130a681613091565b82525050565b60006020820190506130c1600083018461309d565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156131015780820151818401526020810190506130e6565b83811115613110576000848401525b50505050565b6000601f19601f8301169050919050565b6000613132826130c7565b61313c81856130d2565b935061314c8185602086016130e3565b61315581613116565b840191505092915050565b6000602082019050818103600083015261317a8184613127565b905092915050565b6000819050919050565b61319581613182565b81146131a057600080fd5b50565b6000813590506131b28161318c565b92915050565b6000602082840312156131ce576131cd613002565b5b60006131dc848285016131a3565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613210826131e5565b9050919050565b61322081613205565b82525050565b600060208201905061323b6000830184613217565b92915050565b61324a81613205565b811461325557600080fd5b50565b60008135905061326781613241565b92915050565b6000806040838503121561328457613283613002565b5b600061329285828601613258565b92505060206132a3858286016131a3565b9150509250929050565b6132b681613182565b82525050565b60006020820190506132d160008301846132ad565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61331982613116565b810181811067ffffffffffffffff82111715613338576133376132e1565b5b80604052505050565b600061334b612ff8565b90506133578282613310565b919050565b600067ffffffffffffffff821115613377576133766132e1565b5b61338082613116565b9050602081019050919050565b82818337600083830152505050565b60006133af6133aa8461335c565b613341565b9050828152602081018484840111156133cb576133ca6132dc565b5b6133d684828561338d565b509392505050565b600082601f8301126133f3576133f26132d7565b5b813561340384826020860161339c565b91505092915050565b60006020828403121561342257613421613002565b5b600082013567ffffffffffffffff8111156134405761343f613007565b5b61344c848285016133de565b91505092915050565b61345e81613091565b811461346957600080fd5b50565b60008135905061347b81613455565b92915050565b60006020828403121561349757613496613002565b5b60006134a58482850161346c565b91505092915050565b6000806000606084860312156134c7576134c6613002565b5b60006134d586828701613258565b93505060206134e686828701613258565b92505060406134f7868287016131a3565b9150509250925092565b6000819050919050565b61351481613501565b82525050565b600060208201905061352f600083018461350b565b92915050565b600080fd5b600080fd5b60008083601f840112613555576135546132d7565b5b8235905067ffffffffffffffff81111561357257613571613535565b5b60208301915083602082028301111561358e5761358d61353a565b5b9250929050565b600080602083850312156135ac576135ab613002565b5b600083013567ffffffffffffffff8111156135ca576135c9613007565b5b6135d68582860161353f565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61361781613205565b82525050565b600067ffffffffffffffff82169050919050565b61363a8161361d565b82525050565b61364981613091565b82525050565b600062ffffff82169050919050565b6136678161364f565b82525050565b608082016000820151613683600085018261360e565b5060208201516136966020850182613631565b5060408201516136a96040850182613640565b5060608201516136bc606085018261365e565b50505050565b60006136ce838361366d565b60808301905092915050565b6000602082019050919050565b60006136f2826135e2565b6136fc81856135ed565b9350613707836135fe565b8060005b8381101561373857815161371f88826136c2565b975061372a836136da565b92505060018101905061370b565b5085935050505092915050565b6000602082019050818103600083015261375f81846136e7565b905092915050565b60006020828403121561377d5761377c613002565b5b600061378b84828501613258565b91505092915050565b61379d81613501565b81146137a857600080fd5b50565b6000813590506137ba81613794565b92915050565b6000602082840312156137d6576137d5613002565b5b60006137e4848285016137ab565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61382281613182565b82525050565b60006138348383613819565b60208301905092915050565b6000602082019050919050565b6000613858826137ed565b61386281856137f8565b935061386d83613809565b8060005b8381101561389e5781516138858882613828565b975061389083613840565b925050600181019050613871565b5085935050505092915050565b600060208201905081810360008301526138c5818461384d565b905092915050565b6000806000606084860312156138e6576138e5613002565b5b60006138f486828701613258565b9350506020613905868287016131a3565b9250506040613916868287016131a3565b9150509250925092565b6000806040838503121561393757613936613002565b5b600061394585828601613258565b92505060206139568582860161346c565b9150509250929050565b600067ffffffffffffffff82111561397b5761397a6132e1565b5b61398482613116565b9050602081019050919050565b60006139a461399f84613960565b613341565b9050828152602081018484840111156139c0576139bf6132dc565b5b6139cb84828561338d565b509392505050565b600082601f8301126139e8576139e76132d7565b5b81356139f8848260208601613991565b91505092915050565b60008060008060808587031215613a1b57613a1a613002565b5b6000613a2987828801613258565b9450506020613a3a87828801613258565b9350506040613a4b878288016131a3565b925050606085013567ffffffffffffffff811115613a6c57613a6b613007565b5b613a78878288016139d3565b91505092959194509250565b608082016000820151613a9a600085018261360e565b506020820151613aad6020850182613631565b506040820151613ac06040850182613640565b506060820151613ad3606085018261365e565b50505050565b6000608082019050613aee6000830184613a84565b92915050565b60008083601f840112613b0a57613b096132d7565b5b8235905067ffffffffffffffff811115613b2757613b26613535565b5b602083019150836020820283011115613b4357613b4261353a565b5b9250929050565b600080600060408486031215613b6357613b62613002565b5b6000613b71868287016131a3565b935050602084013567ffffffffffffffff811115613b9257613b91613007565b5b613b9e86828701613af4565b92509250509250925092565b60008060408385031215613bc157613bc0613002565b5b6000613bcf85828601613258565b9250506020613be085828601613258565b9150509250929050565b60008060408385031215613c0157613c00613002565b5b6000613c0f858286016131a3565b9250506020613c2085828601613258565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613c7157607f821691505b60208210811415613c8557613c84613c2a565b5b50919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613cc1601f836130d2565b9150613ccc82613c8b565b602082019050919050565b60006020820190508181036000830152613cf081613cb4565b9050919050565b600081905092915050565b50565b6000613d12600083613cf7565b9150613d1d82613d02565b600082019050919050565b6000613d3382613d05565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b6000613da26014836130d2565b9150613dad82613d6c565b602082019050919050565b60006020820190508181036000830152613dd181613d95565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613e1282613182565b9150613e1d83613182565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613e5257613e51613dd8565b5b828201905092915050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b6000613e936014836130d2565b9150613e9e82613e5d565b602082019050919050565b60006020820190508181036000830152613ec281613e86565b9050919050565b6000613ed482613182565b9150613edf83613182565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613f1857613f17613dd8565b5b828202905092915050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b6000613f596013836130d2565b9150613f6482613f23565b602082019050919050565b60006020820190508181036000830152613f8881613f4c565b9050919050565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b6000613fc56017836130d2565b9150613fd082613f8f565b602082019050919050565b60006020820190508181036000830152613ff481613fb8565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614057602f836130d2565b915061406282613ffb565b604082019050919050565b600060208201905081810360008301526140868161404a565b9050919050565b600081905092915050565b60006140a3826130c7565b6140ad818561408d565b93506140bd8185602086016130e3565b80840191505092915050565b60008190508160005260206000209050919050565b600081546140eb81613c59565b6140f5818661408d565b94506001821660008114614110576001811461412157614154565b60ff19831686528186019350614154565b61412a856140c9565b60005b8381101561414c5781548189015260018201915060208101905061412d565b838801955050505b50505092915050565b60006141698286614098565b91506141758285614098565b915061418182846140de565b9150819050949350505050565b7f5468652077686974656c6973742073616c65206973206e6f7420656e61626c6560008201527f6421000000000000000000000000000000000000000000000000000000000000602082015250565b60006141ea6022836130d2565b91506141f58261418e565b604082019050919050565b60006020820190508181036000830152614219816141dd565b9050919050565b7f4164647265737320616c726561647920636c61696d6564210000000000000000600082015250565b60006142566018836130d2565b915061426182614220565b602082019050919050565b6000602082019050818103600083015261428581614249565b9050919050565b60008160601b9050919050565b60006142a48261428c565b9050919050565b60006142b682614299565b9050919050565b6142ce6142c982613205565b6142ab565b82525050565b60006142e082846142bd565b60148201915081905092915050565b7f496e76616c69642070726f6f6621000000000000000000000000000000000000600082015250565b6000614325600e836130d2565b9150614330826142ef565b602082019050919050565b6000602082019050818103600083015261435481614318565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006143b76026836130d2565b91506143c28261435b565b604082019050919050565b600060208201905081810360008301526143e6816143aa565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006144236020836130d2565b915061442e826143ed565b602082019050919050565b6000602082019050818103600083015261445281614416565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061448082614459565b61448a8185614464565b935061449a8185602086016130e3565b6144a381613116565b840191505092915050565b60006080820190506144c36000830187613217565b6144d06020830186613217565b6144dd60408301856132ad565b81810360608301526144ef8184614475565b905095945050505050565b60008151905061450981613038565b92915050565b60006020828403121561452557614524613002565b5b6000614533848285016144fa565b91505092915050565b600061454782613182565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561457a57614579613dd8565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006145bf82613182565b91506145ca83613182565b9250826145da576145d9614585565b5b828204905092915050565b60006145f082613182565b91506145fb83613182565b92508282101561460e5761460d613dd8565b5b828203905092915050565b600061462482613182565b915061462f83613182565b92508261463f5761463e614585565b5b82820690509291505056fea264697066735822122024f8c6893973087595622563fb7ec6ec2fbfd89e88f8c5d1b3b65b9b95fc72af64736f6c6343000809003300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000aa87bee53800000000000000000000000000000000000000000000000000000000000000001bc0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000084236313243617473000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000842363132436174730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d56727563635577427458374c333250673734735a57746d734c5038776943664d696d585756463278345a35752f00000000000000000000
Deployed Bytecode
0x6080604052600436106102725760003560e01c8063715018a61161014f578063b071401b116100c1578063d5abeb011161007a578063d5abeb0114610946578063db4bec4414610971578063e0a80853146109ae578063e985e9c5146109d7578063efbd73f414610a14578063f2fde38b14610a3d57610272565b8063b071401b14610835578063b767a0981461085e578063b88d4fde14610887578063c23dc68f146108b0578063c87b56dd146108ed578063d2cab0561461092a57610272565b806394354fd01161011357806394354fd01461073257806395d89b411461075d57806399a2557a14610788578063a0712d68146107c5578063a22cb465146107e1578063a45ba8e71461080a57610272565b8063715018a6146106615780637cb64759146106785780637ec4a659146106a15780638462151c146106ca5780638da5cb5b1461070757610272565b806342842e0e116101e85780635bbb2177116101ac5780635bbb2177146105295780635c975abb1461056657806362b99ad4146105915780636352211e146105bc5780636caede3d146105f957806370a082311461062457610272565b806342842e0e1461045857806344a0d68a146104815780634fdd43cb146104aa57806351830227146104d35780635503a0e8146104fe57610272565b806316ba10e01161023a57806316ba10e01461037057806316c38b3c1461039957806318160ddd146103c257806323b872dd146103ed5780632eb4a7ab146104165780633ccfd60b1461044157610272565b806301ffc9a71461027757806306fdde03146102b4578063081812fc146102df578063095ea7b31461031c57806313faede614610345575b600080fd5b34801561028357600080fd5b5061029e60048036038101906102999190613064565b610a66565b6040516102ab91906130ac565b60405180910390f35b3480156102c057600080fd5b506102c9610af8565b6040516102d69190613160565b60405180910390f35b3480156102eb57600080fd5b50610306600480360381019061030191906131b8565b610b8a565b6040516103139190613226565b60405180910390f35b34801561032857600080fd5b50610343600480360381019061033e919061326d565b610c09565b005b34801561035157600080fd5b5061035a610d4d565b60405161036791906132bc565b60405180910390f35b34801561037c57600080fd5b506103976004803603810190610392919061340c565b610d53565b005b3480156103a557600080fd5b506103c060048036038101906103bb9190613481565b610d75565b005b3480156103ce57600080fd5b506103d7610d9a565b6040516103e491906132bc565b60405180910390f35b3480156103f957600080fd5b50610414600480360381019061040f91906134ae565b610db1565b005b34801561042257600080fd5b5061042b6110d6565b604051610438919061351a565b60405180910390f35b34801561044d57600080fd5b506104566110dc565b005b34801561046457600080fd5b5061047f600480360381019061047a91906134ae565b6111ba565b005b34801561048d57600080fd5b506104a860048036038101906104a391906131b8565b6111da565b005b3480156104b657600080fd5b506104d160048036038101906104cc919061340c565b6111ec565b005b3480156104df57600080fd5b506104e861120e565b6040516104f591906130ac565b60405180910390f35b34801561050a57600080fd5b50610513611221565b6040516105209190613160565b60405180910390f35b34801561053557600080fd5b50610550600480360381019061054b9190613595565b6112af565b60405161055d9190613745565b60405180910390f35b34801561057257600080fd5b5061057b611372565b60405161058891906130ac565b60405180910390f35b34801561059d57600080fd5b506105a6611385565b6040516105b39190613160565b60405180910390f35b3480156105c857600080fd5b506105e360048036038101906105de91906131b8565b611413565b6040516105f09190613226565b60405180910390f35b34801561060557600080fd5b5061060e611425565b60405161061b91906130ac565b60405180910390f35b34801561063057600080fd5b5061064b60048036038101906106469190613767565b611438565b60405161065891906132bc565b60405180910390f35b34801561066d57600080fd5b506106766114f1565b005b34801561068457600080fd5b5061069f600480360381019061069a91906137c0565b611505565b005b3480156106ad57600080fd5b506106c860048036038101906106c3919061340c565b611517565b005b3480156106d657600080fd5b506106f160048036038101906106ec9190613767565b611539565b6040516106fe91906138ab565b60405180910390f35b34801561071357600080fd5b5061071c611683565b6040516107299190613226565b60405180910390f35b34801561073e57600080fd5b506107476116ad565b60405161075491906132bc565b60405180910390f35b34801561076957600080fd5b506107726116b3565b60405161077f9190613160565b60405180910390f35b34801561079457600080fd5b506107af60048036038101906107aa91906138cd565b611745565b6040516107bc91906138ab565b60405180910390f35b6107df60048036038101906107da91906131b8565b611959565b005b3480156107ed57600080fd5b5061080860048036038101906108039190613920565b611ab9565b005b34801561081657600080fd5b5061081f611c31565b60405161082c9190613160565b60405180910390f35b34801561084157600080fd5b5061085c600480360381019061085791906131b8565b611cbf565b005b34801561086a57600080fd5b5061088560048036038101906108809190613481565b611cd1565b005b34801561089357600080fd5b506108ae60048036038101906108a99190613a01565b611cf6565b005b3480156108bc57600080fd5b506108d760048036038101906108d291906131b8565b611d69565b6040516108e49190613ad9565b60405180910390f35b3480156108f957600080fd5b50610914600480360381019061090f91906131b8565b611dd3565b6040516109219190613160565b60405180910390f35b610944600480360381019061093f9190613b4a565b611f2c565b005b34801561095257600080fd5b5061095b6121f2565b60405161096891906132bc565b60405180910390f35b34801561097d57600080fd5b5061099860048036038101906109939190613767565b6121f8565b6040516109a591906130ac565b60405180910390f35b3480156109ba57600080fd5b506109d560048036038101906109d09190613481565b612218565b005b3480156109e357600080fd5b506109fe60048036038101906109f99190613baa565b61223d565b604051610a0b91906130ac565b60405180910390f35b348015610a2057600080fd5b50610a3b6004803603810190610a369190613bea565b6122d1565b005b348015610a4957600080fd5b50610a646004803603810190610a5f9190613767565b612391565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ac157506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610af15750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610b0790613c59565b80601f0160208091040260200160405190810160405280929190818152602001828054610b3390613c59565b8015610b805780601f10610b5557610100808354040283529160200191610b80565b820191906000526020600020905b815481529060010190602001808311610b6357829003601f168201915b5050505050905090565b6000610b9582612415565b610bcb576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c1482611413565b90508073ffffffffffffffffffffffffffffffffffffffff16610c35612474565b73ffffffffffffffffffffffffffffffffffffffff1614610c9857610c6181610c5c612474565b61223d565b610c97576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600f5481565b610d5b61247c565b80600d9080519060200190610d71929190612f06565b5050565b610d7d61247c565b80601260006101000a81548160ff02191690831515021790555050565b6000610da46124fa565b6001546000540303905090565b6000610dbc82612503565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e23576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610e2f846125d1565b91509150610e458187610e40612474565b6125f8565b610e9157610e5a86610e55612474565b61223d565b610e90576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610ef8576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f05868686600161263c565b8015610f1057600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610fde85610fba888887612642565b7c02000000000000000000000000000000000000000000000000000000001761266a565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415611066576000600185019050600060046000838152602001908152602001600020541415611064576000548114611063578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46110ce8686866001612695565b505050505050565b600a5481565b6110e461247c565b6002600954141561112a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112190613cd7565b60405180910390fd5b6002600981905550600061113c611683565b73ffffffffffffffffffffffffffffffffffffffff164760405161115f90613d28565b60006040518083038185875af1925050503d806000811461119c576040519150601f19603f3d011682016040523d82523d6000602084013e6111a1565b606091505b50509050806111af57600080fd5b506001600981905550565b6111d583838360405180602001604052806000815250611cf6565b505050565b6111e261247c565b80600f8190555050565b6111f461247c565b80600e908051906020019061120a929190612f06565b5050565b601260029054906101000a900460ff1681565b600d805461122e90613c59565b80601f016020809104026020016040519081016040528092919081815260200182805461125a90613c59565b80156112a75780601f1061127c576101008083540402835291602001916112a7565b820191906000526020600020905b81548152906001019060200180831161128a57829003601f168201915b505050505081565b6060600083839050905060008167ffffffffffffffff8111156112d5576112d46132e1565b5b60405190808252806020026020018201604052801561130e57816020015b6112fb612f8c565b8152602001906001900390816112f35790505b50905060005b8281146113665761133d86868381811061133157611330613d3d565b5b90506020020135611d69565b8282815181106113505761134f613d3d565b5b6020026020010181905250806001019050611314565b50809250505092915050565b601260009054906101000a900460ff1681565b600c805461139290613c59565b80601f01602080910402602001604051908101604052809291908181526020018280546113be90613c59565b801561140b5780601f106113e05761010080835404028352916020019161140b565b820191906000526020600020905b8154815290600101906020018083116113ee57829003601f168201915b505050505081565b600061141e82612503565b9050919050565b601260019054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114a0576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6114f961247c565b611503600061269b565b565b61150d61247c565b80600a8190555050565b61151f61247c565b80600c9080519060200190611535929190612f06565b5050565b6060600080600061154985611438565b905060008167ffffffffffffffff811115611567576115666132e1565b5b6040519080825280602002602001820160405280156115955781602001602082028036833780820191505090505b5090506115a0612f8c565b60006115aa6124fa565b90505b838614611675576115bd81612761565b91508160400151156115ce5761166a565b600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461160e57816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611669578083878060010198508151811061165c5761165b613d3d565b5b6020026020010181815250505b5b8060010190506115ad565b508195505050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60115481565b6060600380546116c290613c59565b80601f01602080910402602001604051908101604052809291908181526020018280546116ee90613c59565b801561173b5780601f106117105761010080835404028352916020019161173b565b820191906000526020600020905b81548152906001019060200180831161171e57829003601f168201915b5050505050905090565b6060818310611780576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061178b61278c565b90506117956124fa565b8510156117a7576117a46124fa565b94505b808411156117b3578093505b60006117be87611438565b9050848610156117e15760008686039050818110156117db578091505b506117e6565b600090505b60008167ffffffffffffffff811115611802576118016132e1565b5b6040519080825280602002602001820160405280156118305781602001602082028036833780820191505090505b50905060008214156118485780945050505050611952565b600061185388611d69565b90506000816040015161186857816000015190505b60008990505b88811415801561187e5750848714155b156119445761188c81612761565b925082604001511561189d57611939565b600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff16146118dd57826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611938578084888060010199508151811061192b5761192a613d3d565b5b6020026020010181815250505b5b80600101905061186e565b508583528296505050505050505b9392505050565b8060008111801561196c57506011548111155b6119ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a290613db8565b60405180910390fd5b601054816119b7610d9a565b6119c19190613e07565b1115611a02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f990613ea9565b60405180910390fd5b8180600f54611a119190613ec9565b341015611a53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4a90613f6f565b60405180910390fd5b601260009054906101000a900460ff1615611aa3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9a90613fdb565b60405180910390fd5b611ab4611aae612795565b8461279d565b505050565b611ac1612474565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b26576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611b33612474565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611be0612474565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c2591906130ac565b60405180910390a35050565b600e8054611c3e90613c59565b80601f0160208091040260200160405190810160405280929190818152602001828054611c6a90613c59565b8015611cb75780601f10611c8c57610100808354040283529160200191611cb7565b820191906000526020600020905b815481529060010190602001808311611c9a57829003601f168201915b505050505081565b611cc761247c565b8060118190555050565b611cd961247c565b80601260016101000a81548160ff02191690831515021790555050565b611d01848484610db1565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611d6357611d2c848484846127bb565b611d62576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611d71612f8c565b611d79612f8c565b611d816124fa565b831080611d955750611d9161278c565b8310155b15611da35780915050611dce565b611dac83612761565b9050806040015115611dc15780915050611dce565b611dca8361291b565b9150505b919050565b6060611dde82612415565b611e1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e149061406d565b60405180910390fd5b60001515601260029054906101000a900460ff1615151415611ecb57600e8054611e4690613c59565b80601f0160208091040260200160405190810160405280929190818152602001828054611e7290613c59565b8015611ebf5780601f10611e9457610100808354040283529160200191611ebf565b820191906000526020600020905b815481529060010190602001808311611ea257829003601f168201915b50505050509050611f27565b6000611ed561293b565b90506000815111611ef55760405180602001604052806000815250611f23565b80611eff846129cd565b600d604051602001611f139392919061415d565b6040516020818303038152906040525b9150505b919050565b82600081118015611f3f57506011548111155b611f7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7590613db8565b60405180910390fd5b60105481611f8a610d9a565b611f949190613e07565b1115611fd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fcc90613ea9565b60405180910390fd5b601260019054906101000a900460ff16612024576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201b90614200565b60405180910390fd5b600b6000612030612795565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156120b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120af9061426c565b60405180910390fd5b60006120c2612795565b6040516020016120d291906142d4565b604051602081830303815290604052805190602001209050612138848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600a5483612b2e565b612177576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216e9061433b565b60405180910390fd5b600194506001600b6000612189612795565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506121eb6121e5612795565b8661279d565b5050505050565b60105481565b600b6020528060005260406000206000915054906101000a900460ff1681565b61222061247c565b80601260026101000a81548160ff02191690831515021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b816000811180156122e457506011548111155b612323576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231a90613db8565b60405180910390fd5b6010548161232f610d9a565b6123399190613e07565b111561237a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237190613ea9565b60405180910390fd5b61238261247c565b61238c828461279d565b505050565b61239961247c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612409576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612400906143cd565b60405180910390fd5b6124128161269b565b50565b6000816124206124fa565b1115801561242f575060005482105b801561246d575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b612484612795565b73ffffffffffffffffffffffffffffffffffffffff166124a2611683565b73ffffffffffffffffffffffffffffffffffffffff16146124f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ef90614439565b60405180910390fd5b565b60006001905090565b600080829050806125126124fa565b1161259a576000548110156125995760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415612597575b600081141561258d576004600083600190039350838152602001908152602001600020549050612562565b80925050506125cc565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8612659868684612b45565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612769612f8c565b6127856004600084815260200190815260200160002054612b4e565b9050919050565b60008054905090565b600033905090565b6127b7828260405180602001604052806000815250612c04565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026127e1612474565b8786866040518563ffffffff1660e01b815260040161280394939291906144ae565b602060405180830381600087803b15801561281d57600080fd5b505af192505050801561284e57506040513d601f19601f8201168201806040525081019061284b919061450f565b60015b6128c8573d806000811461287e576040519150601f19603f3d011682016040523d82523d6000602084013e612883565b606091505b506000815114156128c0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b612923612f8c565b61293461292f83612503565b612b4e565b9050919050565b6060600c805461294a90613c59565b80601f016020809104026020016040519081016040528092919081815260200182805461297690613c59565b80156129c35780601f10612998576101008083540402835291602001916129c3565b820191906000526020600020905b8154815290600101906020018083116129a657829003601f168201915b5050505050905090565b60606000821415612a15576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612b29565b600082905060005b60008214612a47578080612a309061453c565b915050600a82612a4091906145b4565b9150612a1d565b60008167ffffffffffffffff811115612a6357612a626132e1565b5b6040519080825280601f01601f191660200182016040528015612a955781602001600182028036833780820191505090505b5090505b60008514612b2257600182612aae91906145e5565b9150600a85612abd9190614619565b6030612ac99190613e07565b60f81b818381518110612adf57612ade613d3d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612b1b91906145b4565b9450612a99565b8093505050505b919050565b600082612b3b8584612ca1565b1490509392505050565b60009392505050565b612b56612f8c565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b612c0e8383612cf7565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612c9c57600080549050600083820390505b612c4e60008683806001019450866127bb565b612c84576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612c3b578160005414612c9957600080fd5b50505b505050565b60008082905060005b8451811015612cec57612cd782868381518110612cca57612cc9613d3d565b5b6020026020010151612eb4565b91508080612ce49061453c565b915050612caa565b508091505092915050565b6000805490506000821415612d38576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612d45600084838561263c565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612dbc83612dad6000866000612642565b612db685612edf565b1761266a565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114612e5d57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612e22565b506000821415612e99576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050612eaf6000848385612695565b505050565b6000818310612ecc57612ec78284612eef565b612ed7565b612ed68383612eef565b5b905092915050565b60006001821460e11b9050919050565b600082600052816020526040600020905092915050565b828054612f1290613c59565b90600052602060002090601f016020900481019282612f345760008555612f7b565b82601f10612f4d57805160ff1916838001178555612f7b565b82800160010185558215612f7b579182015b82811115612f7a578251825591602001919060010190612f5f565b5b509050612f889190612fdb565b5090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b5b80821115612ff4576000816000905550600101612fdc565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6130418161300c565b811461304c57600080fd5b50565b60008135905061305e81613038565b92915050565b60006020828403121561307a57613079613002565b5b60006130888482850161304f565b91505092915050565b60008115159050919050565b6130a681613091565b82525050565b60006020820190506130c1600083018461309d565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156131015780820151818401526020810190506130e6565b83811115613110576000848401525b50505050565b6000601f19601f8301169050919050565b6000613132826130c7565b61313c81856130d2565b935061314c8185602086016130e3565b61315581613116565b840191505092915050565b6000602082019050818103600083015261317a8184613127565b905092915050565b6000819050919050565b61319581613182565b81146131a057600080fd5b50565b6000813590506131b28161318c565b92915050565b6000602082840312156131ce576131cd613002565b5b60006131dc848285016131a3565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613210826131e5565b9050919050565b61322081613205565b82525050565b600060208201905061323b6000830184613217565b92915050565b61324a81613205565b811461325557600080fd5b50565b60008135905061326781613241565b92915050565b6000806040838503121561328457613283613002565b5b600061329285828601613258565b92505060206132a3858286016131a3565b9150509250929050565b6132b681613182565b82525050565b60006020820190506132d160008301846132ad565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61331982613116565b810181811067ffffffffffffffff82111715613338576133376132e1565b5b80604052505050565b600061334b612ff8565b90506133578282613310565b919050565b600067ffffffffffffffff821115613377576133766132e1565b5b61338082613116565b9050602081019050919050565b82818337600083830152505050565b60006133af6133aa8461335c565b613341565b9050828152602081018484840111156133cb576133ca6132dc565b5b6133d684828561338d565b509392505050565b600082601f8301126133f3576133f26132d7565b5b813561340384826020860161339c565b91505092915050565b60006020828403121561342257613421613002565b5b600082013567ffffffffffffffff8111156134405761343f613007565b5b61344c848285016133de565b91505092915050565b61345e81613091565b811461346957600080fd5b50565b60008135905061347b81613455565b92915050565b60006020828403121561349757613496613002565b5b60006134a58482850161346c565b91505092915050565b6000806000606084860312156134c7576134c6613002565b5b60006134d586828701613258565b93505060206134e686828701613258565b92505060406134f7868287016131a3565b9150509250925092565b6000819050919050565b61351481613501565b82525050565b600060208201905061352f600083018461350b565b92915050565b600080fd5b600080fd5b60008083601f840112613555576135546132d7565b5b8235905067ffffffffffffffff81111561357257613571613535565b5b60208301915083602082028301111561358e5761358d61353a565b5b9250929050565b600080602083850312156135ac576135ab613002565b5b600083013567ffffffffffffffff8111156135ca576135c9613007565b5b6135d68582860161353f565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61361781613205565b82525050565b600067ffffffffffffffff82169050919050565b61363a8161361d565b82525050565b61364981613091565b82525050565b600062ffffff82169050919050565b6136678161364f565b82525050565b608082016000820151613683600085018261360e565b5060208201516136966020850182613631565b5060408201516136a96040850182613640565b5060608201516136bc606085018261365e565b50505050565b60006136ce838361366d565b60808301905092915050565b6000602082019050919050565b60006136f2826135e2565b6136fc81856135ed565b9350613707836135fe565b8060005b8381101561373857815161371f88826136c2565b975061372a836136da565b92505060018101905061370b565b5085935050505092915050565b6000602082019050818103600083015261375f81846136e7565b905092915050565b60006020828403121561377d5761377c613002565b5b600061378b84828501613258565b91505092915050565b61379d81613501565b81146137a857600080fd5b50565b6000813590506137ba81613794565b92915050565b6000602082840312156137d6576137d5613002565b5b60006137e4848285016137ab565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61382281613182565b82525050565b60006138348383613819565b60208301905092915050565b6000602082019050919050565b6000613858826137ed565b61386281856137f8565b935061386d83613809565b8060005b8381101561389e5781516138858882613828565b975061389083613840565b925050600181019050613871565b5085935050505092915050565b600060208201905081810360008301526138c5818461384d565b905092915050565b6000806000606084860312156138e6576138e5613002565b5b60006138f486828701613258565b9350506020613905868287016131a3565b9250506040613916868287016131a3565b9150509250925092565b6000806040838503121561393757613936613002565b5b600061394585828601613258565b92505060206139568582860161346c565b9150509250929050565b600067ffffffffffffffff82111561397b5761397a6132e1565b5b61398482613116565b9050602081019050919050565b60006139a461399f84613960565b613341565b9050828152602081018484840111156139c0576139bf6132dc565b5b6139cb84828561338d565b509392505050565b600082601f8301126139e8576139e76132d7565b5b81356139f8848260208601613991565b91505092915050565b60008060008060808587031215613a1b57613a1a613002565b5b6000613a2987828801613258565b9450506020613a3a87828801613258565b9350506040613a4b878288016131a3565b925050606085013567ffffffffffffffff811115613a6c57613a6b613007565b5b613a78878288016139d3565b91505092959194509250565b608082016000820151613a9a600085018261360e565b506020820151613aad6020850182613631565b506040820151613ac06040850182613640565b506060820151613ad3606085018261365e565b50505050565b6000608082019050613aee6000830184613a84565b92915050565b60008083601f840112613b0a57613b096132d7565b5b8235905067ffffffffffffffff811115613b2757613b26613535565b5b602083019150836020820283011115613b4357613b4261353a565b5b9250929050565b600080600060408486031215613b6357613b62613002565b5b6000613b71868287016131a3565b935050602084013567ffffffffffffffff811115613b9257613b91613007565b5b613b9e86828701613af4565b92509250509250925092565b60008060408385031215613bc157613bc0613002565b5b6000613bcf85828601613258565b9250506020613be085828601613258565b9150509250929050565b60008060408385031215613c0157613c00613002565b5b6000613c0f858286016131a3565b9250506020613c2085828601613258565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613c7157607f821691505b60208210811415613c8557613c84613c2a565b5b50919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613cc1601f836130d2565b9150613ccc82613c8b565b602082019050919050565b60006020820190508181036000830152613cf081613cb4565b9050919050565b600081905092915050565b50565b6000613d12600083613cf7565b9150613d1d82613d02565b600082019050919050565b6000613d3382613d05565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b6000613da26014836130d2565b9150613dad82613d6c565b602082019050919050565b60006020820190508181036000830152613dd181613d95565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613e1282613182565b9150613e1d83613182565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613e5257613e51613dd8565b5b828201905092915050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b6000613e936014836130d2565b9150613e9e82613e5d565b602082019050919050565b60006020820190508181036000830152613ec281613e86565b9050919050565b6000613ed482613182565b9150613edf83613182565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613f1857613f17613dd8565b5b828202905092915050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b6000613f596013836130d2565b9150613f6482613f23565b602082019050919050565b60006020820190508181036000830152613f8881613f4c565b9050919050565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b6000613fc56017836130d2565b9150613fd082613f8f565b602082019050919050565b60006020820190508181036000830152613ff481613fb8565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614057602f836130d2565b915061406282613ffb565b604082019050919050565b600060208201905081810360008301526140868161404a565b9050919050565b600081905092915050565b60006140a3826130c7565b6140ad818561408d565b93506140bd8185602086016130e3565b80840191505092915050565b60008190508160005260206000209050919050565b600081546140eb81613c59565b6140f5818661408d565b94506001821660008114614110576001811461412157614154565b60ff19831686528186019350614154565b61412a856140c9565b60005b8381101561414c5781548189015260018201915060208101905061412d565b838801955050505b50505092915050565b60006141698286614098565b91506141758285614098565b915061418182846140de565b9150819050949350505050565b7f5468652077686974656c6973742073616c65206973206e6f7420656e61626c6560008201527f6421000000000000000000000000000000000000000000000000000000000000602082015250565b60006141ea6022836130d2565b91506141f58261418e565b604082019050919050565b60006020820190508181036000830152614219816141dd565b9050919050565b7f4164647265737320616c726561647920636c61696d6564210000000000000000600082015250565b60006142566018836130d2565b915061426182614220565b602082019050919050565b6000602082019050818103600083015261428581614249565b9050919050565b60008160601b9050919050565b60006142a48261428c565b9050919050565b60006142b682614299565b9050919050565b6142ce6142c982613205565b6142ab565b82525050565b60006142e082846142bd565b60148201915081905092915050565b7f496e76616c69642070726f6f6621000000000000000000000000000000000000600082015250565b6000614325600e836130d2565b9150614330826142ef565b602082019050919050565b6000602082019050818103600083015261435481614318565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006143b76026836130d2565b91506143c28261435b565b604082019050919050565b600060208201905081810360008301526143e6816143aa565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006144236020836130d2565b915061442e826143ed565b602082019050919050565b6000602082019050818103600083015261445281614416565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061448082614459565b61448a8185614464565b935061449a8185602086016130e3565b6144a381613116565b840191505092915050565b60006080820190506144c36000830187613217565b6144d06020830186613217565b6144dd60408301856132ad565b81810360608301526144ef8184614475565b905095945050505050565b60008151905061450981613038565b92915050565b60006020828403121561452557614524613002565b5b6000614533848285016144fa565b91505092915050565b600061454782613182565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561457a57614579613dd8565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006145bf82613182565b91506145ca83613182565b9250826145da576145d9614585565b5b828204905092915050565b60006145f082613182565b91506145fb83613182565b92508282101561460e5761460d613dd8565b5b828203905092915050565b600061462482613182565b915061462f83613182565b92508261463f5761463e614585565b5b82820690509291505056fea264697066735822122024f8c6893973087595622563fb7ec6ec2fbfd89e88f8c5d1b3b65b9b95fc72af64736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000aa87bee53800000000000000000000000000000000000000000000000000000000000000001bc0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000084236313243617473000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000842363132436174730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d56727563635577427458374c333250673734735a57746d734c5038776943664d696d585756463278345a35752f00000000000000000000
-----Decoded View---------------
Arg [0] : _tokenName (string): B612Cats
Arg [1] : _tokenSymbol (string): B612Cats
Arg [2] : _cost (uint256): 3000000000000000
Arg [3] : _maxSupply (uint256): 444
Arg [4] : _maxMintAmountPerTx (uint256): 2
Arg [5] : _hiddenMetadataUri (string): ipfs://QmVruccUwBtX7L32Pg74sZWtmsLP8wiCfMimXWVF2x4Z5u/
-----Encoded View---------------
13 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [2] : 000000000000000000000000000000000000000000000000000aa87bee538000
Arg [3] : 00000000000000000000000000000000000000000000000000000000000001bc
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [7] : 4236313243617473000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [9] : 4236313243617473000000000000000000000000000000000000000000000000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [11] : 697066733a2f2f516d56727563635577427458374c333250673734735a57746d
Arg [12] : 734c5038776943664d696d585756463278345a35752f00000000000000000000
Deployed Bytecode Sourcemap
77472:4099:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36009:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36911:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43394:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42835:400;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77771:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80904:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;81010:77;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32662:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47101:2817;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77575:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81308:150;;;;;;;;;;;;;:::i;:::-;;50014:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80444:74;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80660:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77964:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77693:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72592:528;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77888:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77660:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38304:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77919:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33846:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16757:103;;;;;;;;;;;;;:::i;:::-;;81093:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80798:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76468:900;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16109:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77844:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37087:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73508:2513;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79422:212;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43952:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77731:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80524:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;81197:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50797:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72005:428;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79904:445;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78843:573;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77809:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77605:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80355:81;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44417:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79642:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17015:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36009:639;36094:4;36433:10;36418:25;;:11;:25;;;;:102;;;;36510:10;36495:25;;:11;:25;;;;36418:102;:179;;;;36587:10;36572:25;;:11;:25;;;;36418:179;36398:199;;36009:639;;;:::o;36911:100::-;36965:13;36998:5;36991:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36911:100;:::o;43394:218::-;43470:7;43495:16;43503:7;43495;:16::i;:::-;43490:64;;43520:34;;;;;;;;;;;;;;43490:64;43574:15;:24;43590:7;43574:24;;;;;;;;;;;:30;;;;;;;;;;;;43567:37;;43394:218;;;:::o;42835:400::-;42916:13;42932:16;42940:7;42932;:16::i;:::-;42916:32;;42988:5;42965:28;;:19;:17;:19::i;:::-;:28;;;42961:175;;43013:44;43030:5;43037:19;:17;:19::i;:::-;43013:16;:44::i;:::-;43008:128;;43085:35;;;;;;;;;;;;;;43008:128;42961:175;43181:2;43148:15;:24;43164:7;43148:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;43219:7;43215:2;43199:28;;43208:5;43199:28;;;;;;;;;;;;42905:330;42835:400;;:::o;77771:33::-;;;;:::o;80904:100::-;15995:13;:11;:13::i;:::-;80988:10:::1;80976:9;:22;;;;;;;;;;;;:::i;:::-;;80904:100:::0;:::o;81010:77::-;15995:13;:11;:13::i;:::-;81075:6:::1;81066;;:15;;;;;;;;;;;;;;;;;;81010:77:::0;:::o;32662:323::-;32723:7;32951:15;:13;:15::i;:::-;32936:12;;32920:13;;:28;:46;32913:53;;32662:323;:::o;47101:2817::-;47235:27;47265;47284:7;47265:18;:27::i;:::-;47235:57;;47350:4;47309:45;;47325:19;47309:45;;;47305:86;;47363:28;;;;;;;;;;;;;;47305:86;47405:27;47434:23;47461:35;47488:7;47461:26;:35::i;:::-;47404:92;;;;47596:68;47621:15;47638:4;47644:19;:17;:19::i;:::-;47596:24;:68::i;:::-;47591:180;;47684:43;47701:4;47707:19;:17;:19::i;:::-;47684:16;:43::i;:::-;47679:92;;47736:35;;;;;;;;;;;;;;47679:92;47591:180;47802:1;47788:16;;:2;:16;;;47784:52;;;47813:23;;;;;;;;;;;;;;47784:52;47849:43;47871:4;47877:2;47881:7;47890:1;47849:21;:43::i;:::-;47985:15;47982:160;;;48125:1;48104:19;48097:30;47982:160;48522:18;:24;48541:4;48522:24;;;;;;;;;;;;;;;;48520:26;;;;;;;;;;;;48591:18;:22;48610:2;48591:22;;;;;;;;;;;;;;;;48589:24;;;;;;;;;;;48913:146;48950:2;48999:45;49014:4;49020:2;49024:19;48999:14;:45::i;:::-;29061:8;48971:73;48913:18;:146::i;:::-;48884:17;:26;48902:7;48884:26;;;;;;;;;;;:175;;;;49230:1;29061:8;49179:19;:47;:52;49175:627;;;49252:19;49284:1;49274:7;:11;49252:33;;49441:1;49407:17;:30;49425:11;49407:30;;;;;;;;;;;;:35;49403:384;;;49545:13;;49530:11;:28;49526:242;;49725:19;49692:17;:30;49710:11;49692:30;;;;;;;;;;;:52;;;;49526:242;49403:384;49233:569;49175:627;49849:7;49845:2;49830:27;;49839:4;49830:27;;;;;;;;;;;;49868:42;49889:4;49895:2;49899:7;49908:1;49868:20;:42::i;:::-;47224:2694;;;47101:2817;;;:::o;77575:25::-;;;;:::o;81308:150::-;15995:13;:11;:13::i;:::-;4309:1:::1;4907:7;;:19;;4899:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;4309:1;5040:7;:18;;;;81366:7:::2;81387;:5;:7::i;:::-;81379:21;;81408;81379:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81365:69;;;81449:2;81441:11;;;::::0;::::2;;81358:100;4265:1:::1;5219:7;:22;;;;81308:150::o:0;50014:185::-;50152:39;50169:4;50175:2;50179:7;50152:39;;;;;;;;;;;;:16;:39::i;:::-;50014:185;;;:::o;80444:74::-;15995:13;:11;:13::i;:::-;80507:5:::1;80500:4;:12;;;;80444:74:::0;:::o;80660:132::-;15995:13;:11;:13::i;:::-;80768:18:::1;80748:17;:38;;;;;;;;;;;;:::i;:::-;;80660:132:::0;:::o;77964:27::-;;;;;;;;;;;;;:::o;77693:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;72592:528::-;72736:23;72802:22;72827:8;;:15;;72802:40;;72857:34;72915:14;72894:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;72857:73;;72950:9;72945:125;72966:14;72961:1;:19;72945:125;;73022:32;73042:8;;73051:1;73042:11;;;;;;;:::i;:::-;;;;;;;;73022:19;:32::i;:::-;73006:10;73017:1;73006:13;;;;;;;;:::i;:::-;;;;;;;:48;;;;72982:3;;;;;72945:125;;;;73091:10;73084:17;;;;72592:528;;;;:::o;77888:26::-;;;;;;;;;;;;;:::o;77660:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;38304:152::-;38376:7;38419:27;38438:7;38419:18;:27::i;:::-;38396:52;;38304:152;;;:::o;77919:40::-;;;;;;;;;;;;;:::o;33846:233::-;33918:7;33959:1;33942:19;;:5;:19;;;33938:60;;;33970:28;;;;;;;;;;;;;;33938:60;28005:13;34016:18;:25;34035:5;34016:25;;;;;;;;;;;;;;;;:55;34009:62;;33846:233;;;:::o;16757:103::-;15995:13;:11;:13::i;:::-;16822:30:::1;16849:1;16822:18;:30::i;:::-;16757:103::o:0;81093:98::-;15995:13;:11;:13::i;:::-;81174:11:::1;81161:10;:24;;;;81093:98:::0;:::o;80798:100::-;15995:13;:11;:13::i;:::-;80882:10:::1;80870:9;:22;;;;;;;;;;;;:::i;:::-;;80798:100:::0;:::o;76468:900::-;76546:16;76600:19;76634:25;76674:22;76699:16;76709:5;76699:9;:16::i;:::-;76674:41;;76730:25;76772:14;76758:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76730:57;;76802:31;;:::i;:::-;76853:9;76865:15;:13;:15::i;:::-;76853:27;;76848:472;76897:14;76882:11;:29;76848:472;;76949:15;76962:1;76949:12;:15::i;:::-;76937:27;;76987:9;:16;;;76983:73;;;77028:8;;76983:73;77104:1;77078:28;;:9;:14;;;:28;;;77074:111;;77151:9;:14;;;77131:34;;77074:111;77228:5;77207:26;;:17;:26;;;77203:102;;;77284:1;77258:8;77267:13;;;;;;77258:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;77203:102;76848:472;76913:3;;;;;76848:472;;;;77341:8;77334:15;;;;;;;76468:900;;;:::o;16109:87::-;16155:7;16182:6;;;;;;;;;;;16175:13;;16109:87;:::o;77844:37::-;;;;:::o;37087:104::-;37143:13;37176:7;37169:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37087:104;:::o;73508:2513::-;73651:16;73718:4;73709:5;:13;73705:45;;73731:19;;;;;;;;;;;;;;73705:45;73765:19;73799:17;73819:14;:12;:14::i;:::-;73799:34;;73919:15;:13;:15::i;:::-;73911:5;:23;73907:87;;;73963:15;:13;:15::i;:::-;73955:23;;73907:87;74070:9;74063:4;:16;74059:73;;;74107:9;74100:16;;74059:73;74146:25;74174:16;74184:5;74174:9;:16::i;:::-;74146:44;;74368:4;74360:5;:12;74356:278;;;74393:19;74422:5;74415:4;:12;74393:34;;74464:17;74450:11;:31;74446:111;;;74526:11;74506:31;;74446:111;74374:198;74356:278;;;74617:1;74597:21;;74356:278;74648:25;74690:17;74676:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74648:60;;74748:1;74727:17;:22;74723:78;;;74777:8;74770:15;;;;;;;;74723:78;74945:31;74979:26;74999:5;74979:19;:26::i;:::-;74945:60;;75020:25;75265:9;:16;;;75260:92;;75322:9;:14;;;75302:34;;75260:92;75371:9;75383:5;75371:17;;75366:478;75395:4;75390:1;:9;;:45;;;;;75418:17;75403:11;:32;;75390:45;75366:478;;;75473:15;75486:1;75473:12;:15::i;:::-;75461:27;;75511:9;:16;;;75507:73;;;75552:8;;75507:73;75628:1;75602:28;;:9;:14;;;:28;;;75598:111;;75675:9;:14;;;75655:34;;75598:111;75752:5;75731:26;;:17;:26;;;75727:102;;;75808:1;75782:8;75791:13;;;;;;75782:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;75727:102;75366:478;75437:3;;;;;75366:478;;;;75946:11;75936:8;75929:29;75994:8;75987:15;;;;;;;;73508:2513;;;;;;:::o;79422:212::-;79487:11;78463:1;78449:11;:15;:52;;;;;78483:18;;78468:11;:33;;78449:52;78441:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;78572:9;;78557:11;78541:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;78533:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;79520:11:::1;78711;78704:4;;:18;;;;:::i;:::-;78691:9;:31;;78683:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;79549:6:::2;;;;;;;;;;;79548:7;79540:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;79592:36;79602:12;:10;:12::i;:::-;79616:11;79592:9;:36::i;:::-;78613:1:::1;79422:212:::0;;:::o;43952:308::-;44063:19;:17;:19::i;:::-;44051:31;;:8;:31;;;44047:61;;;44091:17;;;;;;;;;;;;;;44047:61;44173:8;44121:18;:39;44140:19;:17;:19::i;:::-;44121:39;;;;;;;;;;;;;;;:49;44161:8;44121:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;44233:8;44197:55;;44212:19;:17;:19::i;:::-;44197:55;;;44243:8;44197:55;;;;;;:::i;:::-;;;;;;;;43952:308;;:::o;77731:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;80524:130::-;15995:13;:11;:13::i;:::-;80629:19:::1;80608:18;:40;;;;80524:130:::0;:::o;81197:105::-;15995:13;:11;:13::i;:::-;81290:6:::1;81267:20;;:29;;;;;;;;;;;;;;;;;;81197:105:::0;:::o;50797:399::-;50964:31;50977:4;50983:2;50987:7;50964:12;:31::i;:::-;51028:1;51010:2;:14;;;:19;51006:183;;51049:56;51080:4;51086:2;51090:7;51099:5;51049:30;:56::i;:::-;51044:145;;51133:40;;;;;;;;;;;;;;51044:145;51006:183;50797:399;;;;:::o;72005:428::-;72089:21;;:::i;:::-;72123:31;;:::i;:::-;72179:15;:13;:15::i;:::-;72169:7;:25;:54;;;;72209:14;:12;:14::i;:::-;72198:7;:25;;72169:54;72165:103;;;72247:9;72240:16;;;;;72165:103;72290:21;72303:7;72290:12;:21::i;:::-;72278:33;;72326:9;:16;;;72322:65;;;72366:9;72359:16;;;;;72322:65;72404:21;72417:7;72404:12;:21::i;:::-;72397:28;;;72005:428;;;;:::o;79904:445::-;79978:13;80008:17;80016:8;80008:7;:17::i;:::-;80000:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;80102:5;80090:17;;:8;;;;;;;;;;;:17;;;80086:64;;;80125:17;80118:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80086:64;80158:28;80189:10;:8;:10::i;:::-;80158:41;;80244:1;80219:14;80213:28;:32;:130;;;;;;;;;;;;;;;;;80281:14;80297:19;:8;:17;:19::i;:::-;80318:9;80264:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;80213:130;80206:137;;;79904:445;;;;:::o;78843:573::-;78950:11;78463:1;78449:11;:15;:52;;;;;78483:18;;78468:11;:33;;78449:52;78441:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;78572:9;;78557:11;78541:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;78533:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;79016:20:::1;;;;;;;;;;;79008:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;79091:16;:30;79108:12;:10;:12::i;:::-;79091:30;;;;;;;;;;;;;;;;;;;;;;;;;79090:31;79082:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;79157:12;79199;:10;:12::i;:::-;79182:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;79172:41;;;;;;79157:56;;79228:50;79247:12;;79228:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79261:10;;79273:4;79228:18;:50::i;:::-;79220:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;79320:1;79306:15;;79363:4;79330:16;:30;79347:12;:10;:12::i;:::-;79330:30;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;79374:36;79384:12;:10;:12::i;:::-;79398:11;79374:9;:36::i;:::-;78963:453;78843:573:::0;;;;:::o;77809:30::-;;;;:::o;77605:48::-;;;;;;;;;;;;;;;;;;;;;;:::o;80355:81::-;15995:13;:11;:13::i;:::-;80424:6:::1;80413:8;;:17;;;;;;;;;;;;;;;;;;80355:81:::0;:::o;44417:164::-;44514:4;44538:18;:25;44557:5;44538:25;;;;;;;;;;;;;;;:35;44564:8;44538:35;;;;;;;;;;;;;;;;;;;;;;;;;44531:42;;44417:164;;;;:::o;79642:155::-;79728:11;78463:1;78449:11;:15;:52;;;;;78483:18;;78468:11;:33;;78449:52;78441:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;78572:9;;78557:11;78541:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;78533:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;15995:13:::1;:11;:13::i;:::-;79758:33:::2;79768:9;79779:11;79758:9;:33::i;:::-;79642:155:::0;;;:::o;17015:201::-;15995:13;:11;:13::i;:::-;17124:1:::1;17104:22;;:8;:22;;;;17096:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;17180:28;17199:8;17180:18;:28::i;:::-;17015:201:::0;:::o;44839:282::-;44904:4;44960:7;44941:15;:13;:15::i;:::-;:26;;:66;;;;;44994:13;;44984:7;:23;44941:66;:153;;;;;45093:1;28781:8;45045:17;:26;45063:7;45045:26;;;;;;;;;;;;:44;:49;44941:153;44921:173;;44839:282;;;:::o;66605:105::-;66665:7;66692:10;66685:17;;66605:105;:::o;16274:132::-;16349:12;:10;:12::i;:::-;16338:23;;:7;:5;:7::i;:::-;:23;;;16330:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;16274:132::o;79803:95::-;79868:7;79891:1;79884:8;;79803:95;:::o;39459:1275::-;39526:7;39546:12;39561:7;39546:22;;39629:4;39610:15;:13;:15::i;:::-;:23;39606:1061;;39663:13;;39656:4;:20;39652:1015;;;39701:14;39718:17;:23;39736:4;39718:23;;;;;;;;;;;;39701:40;;39835:1;28781:8;39807:6;:24;:29;39803:845;;;40472:113;40489:1;40479:6;:11;40472:113;;;40532:17;:25;40550:6;;;;;;;40532:25;;;;;;;;;;;;40523:34;;40472:113;;;40618:6;40611:13;;;;;;39803:845;39678:989;39652:1015;39606:1061;40695:31;;;;;;;;;;;;;;39459:1275;;;;:::o;46002:479::-;46104:27;46133:23;46174:38;46215:15;:24;46231:7;46215:24;;;;;;;;;;;46174:65;;46386:18;46363:41;;46443:19;46437:26;46418:45;;46348:126;46002:479;;;:::o;45230:659::-;45379:11;45544:16;45537:5;45533:28;45524:37;;45704:16;45693:9;45689:32;45676:45;;45854:15;45843:9;45840:30;45832:5;45821:9;45818:20;45815:56;45805:66;;45230:659;;;;;:::o;51858:159::-;;;;;:::o;65914:311::-;66049:7;66069:16;29185:3;66095:19;:41;;66069:68;;29185:3;66163:31;66174:4;66180:2;66184:9;66163:10;:31::i;:::-;66155:40;;:62;;66148:69;;;65914:311;;;;;:::o;41282:450::-;41362:14;41530:16;41523:5;41519:28;41510:37;;41707:5;41693:11;41668:23;41664:41;41661:52;41654:5;41651:63;41641:73;;41282:450;;;;:::o;52682:158::-;;;;;:::o;17376:191::-;17450:16;17469:6;;;;;;;;;;;17450:25;;17495:8;17486:6;;:17;;;;;;;;;;;;;;;;;;17550:8;17519:40;;17540:8;17519:40;;;;;;;;;;;;17439:128;17376:191;:::o;38907:161::-;38975:21;;:::i;:::-;39016:44;39035:17;:24;39053:5;39035:24;;;;;;;;;;;;39016:18;:44::i;:::-;39009:51;;38907:161;;;:::o;32349:103::-;32404:7;32431:13;;32424:20;;32349:103;:::o;14660:98::-;14713:7;14740:10;14733:17;;14660:98;:::o;60437:112::-;60514:27;60524:2;60528:8;60514:27;;;;;;;;;;;;:9;:27::i;:::-;60437:112;;:::o;53280:716::-;53443:4;53489:2;53464:45;;;53510:19;:17;:19::i;:::-;53531:4;53537:7;53546:5;53464:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;53460:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53764:1;53747:6;:13;:18;53743:235;;;53793:40;;;;;;;;;;;;;;53743:235;53936:6;53930:13;53921:6;53917:2;53913:15;53906:38;53460:529;53633:54;;;53623:64;;;:6;:64;;;;53616:71;;;53280:716;;;;;;:::o;38645:166::-;38715:21;;:::i;:::-;38756:47;38775:27;38794:7;38775:18;:27::i;:::-;38756:18;:47::i;:::-;38749:54;;38645:166;;;:::o;81464:104::-;81524:13;81553:9;81546:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81464:104;:::o;430:723::-;486:13;716:1;707:5;:10;703:53;;;734:10;;;;;;;;;;;;;;;;;;;;;703:53;766:12;781:5;766:20;;797:14;822:78;837:1;829:4;:9;822:78;;855:8;;;;;:::i;:::-;;;;886:2;878:10;;;;;:::i;:::-;;;822:78;;;910:19;942:6;932:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;910:39;;960:154;976:1;967:5;:10;960:154;;1004:1;994:11;;;;;:::i;:::-;;;1071:2;1063:5;:10;;;;:::i;:::-;1050:2;:24;;;;:::i;:::-;1037:39;;1020:6;1027;1020:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1100:2;1091:11;;;;;:::i;:::-;;;960:154;;;1138:6;1124:21;;;;;430:723;;;;:::o;6475:190::-;6600:4;6653;6624:25;6637:5;6644:4;6624:12;:25::i;:::-;:33;6617:40;;6475:190;;;;;:::o;65615:147::-;65752:6;65615:147;;;;;:::o;40833:366::-;40899:31;;:::i;:::-;40976:6;40943:9;:14;;:41;;;;;;;;;;;28664:3;41029:6;:33;;40995:9;:24;;:68;;;;;;;;;;;41121:1;28781:8;41093:6;:24;:29;;41074:9;:16;;:48;;;;;;;;;;;29185:3;41162:6;:28;;41133:9;:19;;:58;;;;;;;;;;;40833:366;;;:::o;59664:689::-;59795:19;59801:2;59805:8;59795:5;:19::i;:::-;59874:1;59856:2;:14;;;:19;59852:483;;59896:11;59910:13;;59896:27;;59942:13;59964:8;59958:3;:14;59942:30;;59991:233;60022:62;60061:1;60065:2;60069:7;;;;;;60078:5;60022:30;:62::i;:::-;60017:167;;60120:40;;;;;;;;;;;;;;60017:167;60219:3;60211:5;:11;59991:233;;60306:3;60289:13;;:20;60285:34;;60311:8;;;60285:34;59877:458;;59852:483;59664:689;;;:::o;7342:296::-;7425:7;7445:20;7468:4;7445:27;;7488:9;7483:118;7507:5;:12;7503:1;:16;7483:118;;;7556:33;7566:12;7580:5;7586:1;7580:8;;;;;;;;:::i;:::-;;;;;;;;7556:9;:33::i;:::-;7541:48;;7521:3;;;;;:::i;:::-;;;;7483:118;;;;7618:12;7611:19;;;7342:296;;;;:::o;54458:2454::-;54531:20;54554:13;;54531:36;;54594:1;54582:8;:13;54578:44;;;54604:18;;;;;;;;;;;;;;54578:44;54635:61;54665:1;54669:2;54673:12;54687:8;54635:21;:61::i;:::-;55179:1;28143:2;55149:1;:26;;55148:32;55136:8;:45;55110:18;:22;55129:2;55110:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;55458:139;55495:2;55549:33;55572:1;55576:2;55580:1;55549:14;:33::i;:::-;55516:30;55537:8;55516:20;:30::i;:::-;:66;55458:18;:139::i;:::-;55424:17;:31;55442:12;55424:31;;;;;;;;;;;:173;;;;55614:16;55645:11;55674:8;55659:12;:23;55645:37;;55929:16;55925:2;55921:25;55909:37;;56301:12;56261:8;56220:1;56158:25;56099:1;56038;56011:335;56426:1;56412:12;56408:20;56366:346;56467:3;56458:7;56455:16;56366:346;;56685:7;56675:8;56672:1;56645:25;56642:1;56639;56634:59;56520:1;56511:7;56507:15;56496:26;;56366:346;;;56370:77;56757:1;56745:8;:13;56741:45;;;56767:19;;;;;;;;;;;;;;56741:45;56819:3;56803:13;:19;;;;54884:1950;;56844:60;56873:1;56877:2;56881:12;56895:8;56844:20;:60::i;:::-;54520:2392;54458:2454;;:::o;13549:149::-;13612:7;13643:1;13639;:5;:51;;13670:20;13685:1;13688;13670:14;:20::i;:::-;13639:51;;;13647:20;13662:1;13665;13647:14;:20::i;:::-;13639:51;13632:58;;13549:149;;;;:::o;41834:324::-;41904:14;42137:1;42127:8;42124:15;42098:24;42094:46;42084:56;;41834:324;;;:::o;13706:268::-;13774:13;13881:1;13875:4;13868:15;13910:1;13904:4;13897:15;13951:4;13945;13935:21;13926:30;;13706:268;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:117::-;5399:1;5396;5389:12;5413:117;5522:1;5519;5512:12;5536:180;5584:77;5581:1;5574:88;5681:4;5678:1;5671:15;5705:4;5702:1;5695:15;5722:281;5805:27;5827:4;5805:27;:::i;:::-;5797:6;5793:40;5935:6;5923:10;5920:22;5899:18;5887:10;5884:34;5881:62;5878:88;;;5946:18;;:::i;:::-;5878:88;5986:10;5982:2;5975:22;5765:238;5722:281;;:::o;6009:129::-;6043:6;6070:20;;:::i;:::-;6060:30;;6099:33;6127:4;6119:6;6099:33;:::i;:::-;6009:129;;;:::o;6144:308::-;6206:4;6296:18;6288:6;6285:30;6282:56;;;6318:18;;:::i;:::-;6282:56;6356:29;6378:6;6356:29;:::i;:::-;6348:37;;6440:4;6434;6430:15;6422:23;;6144:308;;;:::o;6458:154::-;6542:6;6537:3;6532;6519:30;6604:1;6595:6;6590:3;6586:16;6579:27;6458:154;;;:::o;6618:412::-;6696:5;6721:66;6737:49;6779:6;6737:49;:::i;:::-;6721:66;:::i;:::-;6712:75;;6810:6;6803:5;6796:21;6848:4;6841:5;6837:16;6886:3;6877:6;6872:3;6868:16;6865:25;6862:112;;;6893:79;;:::i;:::-;6862:112;6983:41;7017:6;7012:3;7007;6983:41;:::i;:::-;6702:328;6618:412;;;;;:::o;7050:340::-;7106:5;7155:3;7148:4;7140:6;7136:17;7132:27;7122:122;;7163:79;;:::i;:::-;7122:122;7280:6;7267:20;7305:79;7380:3;7372:6;7365:4;7357:6;7353:17;7305:79;:::i;:::-;7296:88;;7112:278;7050:340;;;;:::o;7396:509::-;7465:6;7514:2;7502:9;7493:7;7489:23;7485:32;7482:119;;;7520:79;;:::i;:::-;7482:119;7668:1;7657:9;7653:17;7640:31;7698:18;7690:6;7687:30;7684:117;;;7720:79;;:::i;:::-;7684:117;7825:63;7880:7;7871:6;7860:9;7856:22;7825:63;:::i;:::-;7815:73;;7611:287;7396:509;;;;:::o;7911:116::-;7981:21;7996:5;7981:21;:::i;:::-;7974:5;7971:32;7961:60;;8017:1;8014;8007:12;7961:60;7911:116;:::o;8033:133::-;8076:5;8114:6;8101:20;8092:29;;8130:30;8154:5;8130:30;:::i;:::-;8033:133;;;;:::o;8172:323::-;8228:6;8277:2;8265:9;8256:7;8252:23;8248:32;8245:119;;;8283:79;;:::i;:::-;8245:119;8403:1;8428:50;8470:7;8461:6;8450:9;8446:22;8428:50;:::i;:::-;8418:60;;8374:114;8172:323;;;;:::o;8501:619::-;8578:6;8586;8594;8643:2;8631:9;8622:7;8618:23;8614:32;8611:119;;;8649:79;;:::i;:::-;8611:119;8769:1;8794:53;8839:7;8830:6;8819:9;8815:22;8794:53;:::i;:::-;8784:63;;8740:117;8896:2;8922:53;8967:7;8958:6;8947:9;8943:22;8922:53;:::i;:::-;8912:63;;8867:118;9024:2;9050:53;9095:7;9086:6;9075:9;9071:22;9050:53;:::i;:::-;9040:63;;8995:118;8501:619;;;;;:::o;9126:77::-;9163:7;9192:5;9181:16;;9126:77;;;:::o;9209:118::-;9296:24;9314:5;9296:24;:::i;:::-;9291:3;9284:37;9209:118;;:::o;9333:222::-;9426:4;9464:2;9453:9;9449:18;9441:26;;9477:71;9545:1;9534:9;9530:17;9521:6;9477:71;:::i;:::-;9333:222;;;;:::o;9561:117::-;9670:1;9667;9660:12;9684:117;9793:1;9790;9783:12;9824:568;9897:8;9907:6;9957:3;9950:4;9942:6;9938:17;9934:27;9924:122;;9965:79;;:::i;:::-;9924:122;10078:6;10065:20;10055:30;;10108:18;10100:6;10097:30;10094:117;;;10130:79;;:::i;:::-;10094:117;10244:4;10236:6;10232:17;10220:29;;10298:3;10290:4;10282:6;10278:17;10268:8;10264:32;10261:41;10258:128;;;10305:79;;:::i;:::-;10258:128;9824:568;;;;;:::o;10398:559::-;10484:6;10492;10541:2;10529:9;10520:7;10516:23;10512:32;10509:119;;;10547:79;;:::i;:::-;10509:119;10695:1;10684:9;10680:17;10667:31;10725:18;10717:6;10714:30;10711:117;;;10747:79;;:::i;:::-;10711:117;10860:80;10932:7;10923:6;10912:9;10908:22;10860:80;:::i;:::-;10842:98;;;;10638:312;10398:559;;;;;:::o;10963:145::-;11061:6;11095:5;11089:12;11079:22;;10963:145;;;:::o;11114:215::-;11244:11;11278:6;11273:3;11266:19;11318:4;11313:3;11309:14;11294:29;;11114:215;;;;:::o;11335:163::-;11433:4;11456:3;11448:11;;11486:4;11481:3;11477:14;11469:22;;11335:163;;;:::o;11504:108::-;11581:24;11599:5;11581:24;:::i;:::-;11576:3;11569:37;11504:108;;:::o;11618:101::-;11654:7;11694:18;11687:5;11683:30;11672:41;;11618:101;;;:::o;11725:105::-;11800:23;11817:5;11800:23;:::i;:::-;11795:3;11788:36;11725:105;;:::o;11836:99::-;11907:21;11922:5;11907:21;:::i;:::-;11902:3;11895:34;11836:99;;:::o;11941:91::-;11977:7;12017:8;12010:5;12006:20;11995:31;;11941:91;;;:::o;12038:105::-;12113:23;12130:5;12113:23;:::i;:::-;12108:3;12101:36;12038:105;;:::o;12221:864::-;12370:4;12365:3;12361:14;12457:4;12450:5;12446:16;12440:23;12476:63;12533:4;12528:3;12524:14;12510:12;12476:63;:::i;:::-;12385:164;12641:4;12634:5;12630:16;12624:23;12660:61;12715:4;12710:3;12706:14;12692:12;12660:61;:::i;:::-;12559:172;12815:4;12808:5;12804:16;12798:23;12834:57;12885:4;12880:3;12876:14;12862:12;12834:57;:::i;:::-;12741:160;12988:4;12981:5;12977:16;12971:23;13007:61;13062:4;13057:3;13053:14;13039:12;13007:61;:::i;:::-;12911:167;12339:746;12221:864;;:::o;13091:303::-;13222:10;13243:108;13347:3;13339:6;13243:108;:::i;:::-;13383:4;13378:3;13374:14;13360:28;;13091:303;;;;:::o;13400:144::-;13501:4;13533;13528:3;13524:14;13516:22;;13400:144;;;:::o;13626:980::-;13807:3;13836:85;13915:5;13836:85;:::i;:::-;13937:117;14047:6;14042:3;13937:117;:::i;:::-;13930:124;;14078:87;14159:5;14078:87;:::i;:::-;14188:7;14219:1;14204:377;14229:6;14226:1;14223:13;14204:377;;;14305:6;14299:13;14332:125;14453:3;14438:13;14332:125;:::i;:::-;14325:132;;14480:91;14564:6;14480:91;:::i;:::-;14470:101;;14264:317;14251:1;14248;14244:9;14239:14;;14204:377;;;14208:14;14597:3;14590:10;;13812:794;;;13626:980;;;;:::o;14612:497::-;14817:4;14855:2;14844:9;14840:18;14832:26;;14904:9;14898:4;14894:20;14890:1;14879:9;14875:17;14868:47;14932:170;15097:4;15088:6;14932:170;:::i;:::-;14924:178;;14612:497;;;;:::o;15115:329::-;15174:6;15223:2;15211:9;15202:7;15198:23;15194:32;15191:119;;;15229:79;;:::i;:::-;15191:119;15349:1;15374:53;15419:7;15410:6;15399:9;15395:22;15374:53;:::i;:::-;15364:63;;15320:117;15115:329;;;;:::o;15450:122::-;15523:24;15541:5;15523:24;:::i;:::-;15516:5;15513:35;15503:63;;15562:1;15559;15552:12;15503:63;15450:122;:::o;15578:139::-;15624:5;15662:6;15649:20;15640:29;;15678:33;15705:5;15678:33;:::i;:::-;15578:139;;;;:::o;15723:329::-;15782:6;15831:2;15819:9;15810:7;15806:23;15802:32;15799:119;;;15837:79;;:::i;:::-;15799:119;15957:1;15982:53;16027:7;16018:6;16007:9;16003:22;15982:53;:::i;:::-;15972:63;;15928:117;15723:329;;;;:::o;16058:114::-;16125:6;16159:5;16153:12;16143:22;;16058:114;;;:::o;16178:184::-;16277:11;16311:6;16306:3;16299:19;16351:4;16346:3;16342:14;16327:29;;16178:184;;;;:::o;16368:132::-;16435:4;16458:3;16450:11;;16488:4;16483:3;16479:14;16471:22;;16368:132;;;:::o;16506:108::-;16583:24;16601:5;16583:24;:::i;:::-;16578:3;16571:37;16506:108;;:::o;16620:179::-;16689:10;16710:46;16752:3;16744:6;16710:46;:::i;:::-;16788:4;16783:3;16779:14;16765:28;;16620:179;;;;:::o;16805:113::-;16875:4;16907;16902:3;16898:14;16890:22;;16805:113;;;:::o;16954:732::-;17073:3;17102:54;17150:5;17102:54;:::i;:::-;17172:86;17251:6;17246:3;17172:86;:::i;:::-;17165:93;;17282:56;17332:5;17282:56;:::i;:::-;17361:7;17392:1;17377:284;17402:6;17399:1;17396:13;17377:284;;;17478:6;17472:13;17505:63;17564:3;17549:13;17505:63;:::i;:::-;17498:70;;17591:60;17644:6;17591:60;:::i;:::-;17581:70;;17437:224;17424:1;17421;17417:9;17412:14;;17377:284;;;17381:14;17677:3;17670:10;;17078:608;;;16954:732;;;;:::o;17692:373::-;17835:4;17873:2;17862:9;17858:18;17850:26;;17922:9;17916:4;17912:20;17908:1;17897:9;17893:17;17886:47;17950:108;18053:4;18044:6;17950:108;:::i;:::-;17942:116;;17692:373;;;;:::o;18071:619::-;18148:6;18156;18164;18213:2;18201:9;18192:7;18188:23;18184:32;18181:119;;;18219:79;;:::i;:::-;18181:119;18339:1;18364:53;18409:7;18400:6;18389:9;18385:22;18364:53;:::i;:::-;18354:63;;18310:117;18466:2;18492:53;18537:7;18528:6;18517:9;18513:22;18492:53;:::i;:::-;18482:63;;18437:118;18594:2;18620:53;18665:7;18656:6;18645:9;18641:22;18620:53;:::i;:::-;18610:63;;18565:118;18071:619;;;;;:::o;18696:468::-;18761:6;18769;18818:2;18806:9;18797:7;18793:23;18789:32;18786:119;;;18824:79;;:::i;:::-;18786:119;18944:1;18969:53;19014:7;19005:6;18994:9;18990:22;18969:53;:::i;:::-;18959:63;;18915:117;19071:2;19097:50;19139:7;19130:6;19119:9;19115:22;19097:50;:::i;:::-;19087:60;;19042:115;18696:468;;;;;:::o;19170:307::-;19231:4;19321:18;19313:6;19310:30;19307:56;;;19343:18;;:::i;:::-;19307:56;19381:29;19403:6;19381:29;:::i;:::-;19373:37;;19465:4;19459;19455:15;19447:23;;19170:307;;;:::o;19483:410::-;19560:5;19585:65;19601:48;19642:6;19601:48;:::i;:::-;19585:65;:::i;:::-;19576:74;;19673:6;19666:5;19659:21;19711:4;19704:5;19700:16;19749:3;19740:6;19735:3;19731:16;19728:25;19725:112;;;19756:79;;:::i;:::-;19725:112;19846:41;19880:6;19875:3;19870;19846:41;:::i;:::-;19566:327;19483:410;;;;;:::o;19912:338::-;19967:5;20016:3;20009:4;20001:6;19997:17;19993:27;19983:122;;20024:79;;:::i;:::-;19983:122;20141:6;20128:20;20166:78;20240:3;20232:6;20225:4;20217:6;20213:17;20166:78;:::i;:::-;20157:87;;19973:277;19912:338;;;;:::o;20256:943::-;20351:6;20359;20367;20375;20424:3;20412:9;20403:7;20399:23;20395:33;20392:120;;;20431:79;;:::i;:::-;20392:120;20551:1;20576:53;20621:7;20612:6;20601:9;20597:22;20576:53;:::i;:::-;20566:63;;20522:117;20678:2;20704:53;20749:7;20740:6;20729:9;20725:22;20704:53;:::i;:::-;20694:63;;20649:118;20806:2;20832:53;20877:7;20868:6;20857:9;20853:22;20832:53;:::i;:::-;20822:63;;20777:118;20962:2;20951:9;20947:18;20934:32;20993:18;20985:6;20982:30;20979:117;;;21015:79;;:::i;:::-;20979:117;21120:62;21174:7;21165:6;21154:9;21150:22;21120:62;:::i;:::-;21110:72;;20905:287;20256:943;;;;;;;:::o;21277:874::-;21436:4;21431:3;21427:14;21523:4;21516:5;21512:16;21506:23;21542:63;21599:4;21594:3;21590:14;21576:12;21542:63;:::i;:::-;21451:164;21707:4;21700:5;21696:16;21690:23;21726:61;21781:4;21776:3;21772:14;21758:12;21726:61;:::i;:::-;21625:172;21881:4;21874:5;21870:16;21864:23;21900:57;21951:4;21946:3;21942:14;21928:12;21900:57;:::i;:::-;21807:160;22054:4;22047:5;22043:16;22037:23;22073:61;22128:4;22123:3;22119:14;22105:12;22073:61;:::i;:::-;21977:167;21405:746;21277:874;;:::o;22157:347::-;22312:4;22350:3;22339:9;22335:19;22327:27;;22364:133;22494:1;22483:9;22479:17;22470:6;22364:133;:::i;:::-;22157:347;;;;:::o;22527:568::-;22600:8;22610:6;22660:3;22653:4;22645:6;22641:17;22637:27;22627:122;;22668:79;;:::i;:::-;22627:122;22781:6;22768:20;22758:30;;22811:18;22803:6;22800:30;22797:117;;;22833:79;;:::i;:::-;22797:117;22947:4;22939:6;22935:17;22923:29;;23001:3;22993:4;22985:6;22981:17;22971:8;22967:32;22964:41;22961:128;;;23008:79;;:::i;:::-;22961:128;22527:568;;;;;:::o;23101:704::-;23196:6;23204;23212;23261:2;23249:9;23240:7;23236:23;23232:32;23229:119;;;23267:79;;:::i;:::-;23229:119;23387:1;23412:53;23457:7;23448:6;23437:9;23433:22;23412:53;:::i;:::-;23402:63;;23358:117;23542:2;23531:9;23527:18;23514:32;23573:18;23565:6;23562:30;23559:117;;;23595:79;;:::i;:::-;23559:117;23708:80;23780:7;23771:6;23760:9;23756:22;23708:80;:::i;:::-;23690:98;;;;23485:313;23101:704;;;;;:::o;23811:474::-;23879:6;23887;23936:2;23924:9;23915:7;23911:23;23907:32;23904:119;;;23942:79;;:::i;:::-;23904:119;24062:1;24087:53;24132:7;24123:6;24112:9;24108:22;24087:53;:::i;:::-;24077:63;;24033:117;24189:2;24215:53;24260:7;24251:6;24240:9;24236:22;24215:53;:::i;:::-;24205:63;;24160:118;23811:474;;;;;:::o;24291:::-;24359:6;24367;24416:2;24404:9;24395:7;24391:23;24387:32;24384:119;;;24422:79;;:::i;:::-;24384:119;24542:1;24567:53;24612:7;24603:6;24592:9;24588:22;24567:53;:::i;:::-;24557:63;;24513:117;24669:2;24695:53;24740:7;24731:6;24720:9;24716:22;24695:53;:::i;:::-;24685:63;;24640:118;24291:474;;;;;:::o;24771:180::-;24819:77;24816:1;24809:88;24916:4;24913:1;24906:15;24940:4;24937:1;24930:15;24957:320;25001:6;25038:1;25032:4;25028:12;25018:22;;25085:1;25079:4;25075:12;25106:18;25096:81;;25162:4;25154:6;25150:17;25140:27;;25096:81;25224:2;25216:6;25213:14;25193:18;25190:38;25187:84;;;25243:18;;:::i;:::-;25187:84;25008:269;24957:320;;;:::o;25283:181::-;25423:33;25419:1;25411:6;25407:14;25400:57;25283:181;:::o;25470:366::-;25612:3;25633:67;25697:2;25692:3;25633:67;:::i;:::-;25626:74;;25709:93;25798:3;25709:93;:::i;:::-;25827:2;25822:3;25818:12;25811:19;;25470:366;;;:::o;25842:419::-;26008:4;26046:2;26035:9;26031:18;26023:26;;26095:9;26089:4;26085:20;26081:1;26070:9;26066:17;26059:47;26123:131;26249:4;26123:131;:::i;:::-;26115:139;;25842:419;;;:::o;26267:147::-;26368:11;26405:3;26390:18;;26267:147;;;;:::o;26420:114::-;;:::o;26540:398::-;26699:3;26720:83;26801:1;26796:3;26720:83;:::i;:::-;26713:90;;26812:93;26901:3;26812:93;:::i;:::-;26930:1;26925:3;26921:11;26914:18;;26540:398;;;:::o;26944:379::-;27128:3;27150:147;27293:3;27150:147;:::i;:::-;27143:154;;27314:3;27307:10;;26944:379;;;:::o;27329:180::-;27377:77;27374:1;27367:88;27474:4;27471:1;27464:15;27498:4;27495:1;27488:15;27515:170;27655:22;27651:1;27643:6;27639:14;27632:46;27515:170;:::o;27691:366::-;27833:3;27854:67;27918:2;27913:3;27854:67;:::i;:::-;27847:74;;27930:93;28019:3;27930:93;:::i;:::-;28048:2;28043:3;28039:12;28032:19;;27691:366;;;:::o;28063:419::-;28229:4;28267:2;28256:9;28252:18;28244:26;;28316:9;28310:4;28306:20;28302:1;28291:9;28287:17;28280:47;28344:131;28470:4;28344:131;:::i;:::-;28336:139;;28063:419;;;:::o;28488:180::-;28536:77;28533:1;28526:88;28633:4;28630:1;28623:15;28657:4;28654:1;28647:15;28674:305;28714:3;28733:20;28751:1;28733:20;:::i;:::-;28728:25;;28767:20;28785:1;28767:20;:::i;:::-;28762:25;;28921:1;28853:66;28849:74;28846:1;28843:81;28840:107;;;28927:18;;:::i;:::-;28840:107;28971:1;28968;28964:9;28957:16;;28674:305;;;;:::o;28985:170::-;29125:22;29121:1;29113:6;29109:14;29102:46;28985:170;:::o;29161:366::-;29303:3;29324:67;29388:2;29383:3;29324:67;:::i;:::-;29317:74;;29400:93;29489:3;29400:93;:::i;:::-;29518:2;29513:3;29509:12;29502:19;;29161:366;;;:::o;29533:419::-;29699:4;29737:2;29726:9;29722:18;29714:26;;29786:9;29780:4;29776:20;29772:1;29761:9;29757:17;29750:47;29814:131;29940:4;29814:131;:::i;:::-;29806:139;;29533:419;;;:::o;29958:348::-;29998:7;30021:20;30039:1;30021:20;:::i;:::-;30016:25;;30055:20;30073:1;30055:20;:::i;:::-;30050:25;;30243:1;30175:66;30171:74;30168:1;30165:81;30160:1;30153:9;30146:17;30142:105;30139:131;;;30250:18;;:::i;:::-;30139:131;30298:1;30295;30291:9;30280:20;;29958:348;;;;:::o;30312:169::-;30452:21;30448:1;30440:6;30436:14;30429:45;30312:169;:::o;30487:366::-;30629:3;30650:67;30714:2;30709:3;30650:67;:::i;:::-;30643:74;;30726:93;30815:3;30726:93;:::i;:::-;30844:2;30839:3;30835:12;30828:19;;30487:366;;;:::o;30859:419::-;31025:4;31063:2;31052:9;31048:18;31040:26;;31112:9;31106:4;31102:20;31098:1;31087:9;31083:17;31076:47;31140:131;31266:4;31140:131;:::i;:::-;31132:139;;30859:419;;;:::o;31284:173::-;31424:25;31420:1;31412:6;31408:14;31401:49;31284:173;:::o;31463:366::-;31605:3;31626:67;31690:2;31685:3;31626:67;:::i;:::-;31619:74;;31702:93;31791:3;31702:93;:::i;:::-;31820:2;31815:3;31811:12;31804:19;;31463:366;;;:::o;31835:419::-;32001:4;32039:2;32028:9;32024:18;32016:26;;32088:9;32082:4;32078:20;32074:1;32063:9;32059:17;32052:47;32116:131;32242:4;32116:131;:::i;:::-;32108:139;;31835:419;;;:::o;32260:234::-;32400:34;32396:1;32388:6;32384:14;32377:58;32469:17;32464:2;32456:6;32452:15;32445:42;32260:234;:::o;32500:366::-;32642:3;32663:67;32727:2;32722:3;32663:67;:::i;:::-;32656:74;;32739:93;32828:3;32739:93;:::i;:::-;32857:2;32852:3;32848:12;32841:19;;32500:366;;;:::o;32872:419::-;33038:4;33076:2;33065:9;33061:18;33053:26;;33125:9;33119:4;33115:20;33111:1;33100:9;33096:17;33089:47;33153:131;33279:4;33153:131;:::i;:::-;33145:139;;32872:419;;;:::o;33297:148::-;33399:11;33436:3;33421:18;;33297:148;;;;:::o;33451:377::-;33557:3;33585:39;33618:5;33585:39;:::i;:::-;33640:89;33722:6;33717:3;33640:89;:::i;:::-;33633:96;;33738:52;33783:6;33778:3;33771:4;33764:5;33760:16;33738:52;:::i;:::-;33815:6;33810:3;33806:16;33799:23;;33561:267;33451:377;;;;:::o;33834:141::-;33883:4;33906:3;33898:11;;33929:3;33926:1;33919:14;33963:4;33960:1;33950:18;33942:26;;33834:141;;;:::o;34005:845::-;34108:3;34145:5;34139:12;34174:36;34200:9;34174:36;:::i;:::-;34226:89;34308:6;34303:3;34226:89;:::i;:::-;34219:96;;34346:1;34335:9;34331:17;34362:1;34357:137;;;;34508:1;34503:341;;;;34324:520;;34357:137;34441:4;34437:9;34426;34422:25;34417:3;34410:38;34477:6;34472:3;34468:16;34461:23;;34357:137;;34503:341;34570:38;34602:5;34570:38;:::i;:::-;34630:1;34644:154;34658:6;34655:1;34652:13;34644:154;;;34732:7;34726:14;34722:1;34717:3;34713:11;34706:35;34782:1;34773:7;34769:15;34758:26;;34680:4;34677:1;34673:12;34668:17;;34644:154;;;34827:6;34822:3;34818:16;34811:23;;34510:334;;34324:520;;34112:738;;34005:845;;;;:::o;34856:589::-;35081:3;35103:95;35194:3;35185:6;35103:95;:::i;:::-;35096:102;;35215:95;35306:3;35297:6;35215:95;:::i;:::-;35208:102;;35327:92;35415:3;35406:6;35327:92;:::i;:::-;35320:99;;35436:3;35429:10;;34856:589;;;;;;:::o;35451:221::-;35591:34;35587:1;35579:6;35575:14;35568:58;35660:4;35655:2;35647:6;35643:15;35636:29;35451:221;:::o;35678:366::-;35820:3;35841:67;35905:2;35900:3;35841:67;:::i;:::-;35834:74;;35917:93;36006:3;35917:93;:::i;:::-;36035:2;36030:3;36026:12;36019:19;;35678:366;;;:::o;36050:419::-;36216:4;36254:2;36243:9;36239:18;36231:26;;36303:9;36297:4;36293:20;36289:1;36278:9;36274:17;36267:47;36331:131;36457:4;36331:131;:::i;:::-;36323:139;;36050:419;;;:::o;36475:174::-;36615:26;36611:1;36603:6;36599:14;36592:50;36475:174;:::o;36655:366::-;36797:3;36818:67;36882:2;36877:3;36818:67;:::i;:::-;36811:74;;36894:93;36983:3;36894:93;:::i;:::-;37012:2;37007:3;37003:12;36996:19;;36655:366;;;:::o;37027:419::-;37193:4;37231:2;37220:9;37216:18;37208:26;;37280:9;37274:4;37270:20;37266:1;37255:9;37251:17;37244:47;37308:131;37434:4;37308:131;:::i;:::-;37300:139;;37027:419;;;:::o;37452:94::-;37485:8;37533:5;37529:2;37525:14;37504:35;;37452:94;;;:::o;37552:::-;37591:7;37620:20;37634:5;37620:20;:::i;:::-;37609:31;;37552:94;;;:::o;37652:100::-;37691:7;37720:26;37740:5;37720:26;:::i;:::-;37709:37;;37652:100;;;:::o;37758:157::-;37863:45;37883:24;37901:5;37883:24;:::i;:::-;37863:45;:::i;:::-;37858:3;37851:58;37758:157;;:::o;37921:256::-;38033:3;38048:75;38119:3;38110:6;38048:75;:::i;:::-;38148:2;38143:3;38139:12;38132:19;;38168:3;38161:10;;37921:256;;;;:::o;38183:164::-;38323:16;38319:1;38311:6;38307:14;38300:40;38183:164;:::o;38353:366::-;38495:3;38516:67;38580:2;38575:3;38516:67;:::i;:::-;38509:74;;38592:93;38681:3;38592:93;:::i;:::-;38710:2;38705:3;38701:12;38694:19;;38353:366;;;:::o;38725:419::-;38891:4;38929:2;38918:9;38914:18;38906:26;;38978:9;38972:4;38968:20;38964:1;38953:9;38949:17;38942:47;39006:131;39132:4;39006:131;:::i;:::-;38998:139;;38725:419;;;:::o;39150:225::-;39290:34;39286:1;39278:6;39274:14;39267:58;39359:8;39354:2;39346:6;39342:15;39335:33;39150:225;:::o;39381:366::-;39523:3;39544:67;39608:2;39603:3;39544:67;:::i;:::-;39537:74;;39620:93;39709:3;39620:93;:::i;:::-;39738:2;39733:3;39729:12;39722:19;;39381:366;;;:::o;39753:419::-;39919:4;39957:2;39946:9;39942:18;39934:26;;40006:9;40000:4;39996:20;39992:1;39981:9;39977:17;39970:47;40034:131;40160:4;40034:131;:::i;:::-;40026:139;;39753:419;;;:::o;40178:182::-;40318:34;40314:1;40306:6;40302:14;40295:58;40178:182;:::o;40366:366::-;40508:3;40529:67;40593:2;40588:3;40529:67;:::i;:::-;40522:74;;40605:93;40694:3;40605:93;:::i;:::-;40723:2;40718:3;40714:12;40707:19;;40366:366;;;:::o;40738:419::-;40904:4;40942:2;40931:9;40927:18;40919:26;;40991:9;40985:4;40981:20;40977:1;40966:9;40962:17;40955:47;41019:131;41145:4;41019:131;:::i;:::-;41011:139;;40738:419;;;:::o;41163:98::-;41214:6;41248:5;41242:12;41232:22;;41163:98;;;:::o;41267:168::-;41350:11;41384:6;41379:3;41372:19;41424:4;41419:3;41415:14;41400:29;;41267:168;;;;:::o;41441:360::-;41527:3;41555:38;41587:5;41555:38;:::i;:::-;41609:70;41672:6;41667:3;41609:70;:::i;:::-;41602:77;;41688:52;41733:6;41728:3;41721:4;41714:5;41710:16;41688:52;:::i;:::-;41765:29;41787:6;41765:29;:::i;:::-;41760:3;41756:39;41749:46;;41531:270;41441:360;;;;:::o;41807:640::-;42002:4;42040:3;42029:9;42025:19;42017:27;;42054:71;42122:1;42111:9;42107:17;42098:6;42054:71;:::i;:::-;42135:72;42203:2;42192:9;42188:18;42179:6;42135:72;:::i;:::-;42217;42285:2;42274:9;42270:18;42261:6;42217:72;:::i;:::-;42336:9;42330:4;42326:20;42321:2;42310:9;42306:18;42299:48;42364:76;42435:4;42426:6;42364:76;:::i;:::-;42356:84;;41807:640;;;;;;;:::o;42453:141::-;42509:5;42540:6;42534:13;42525:22;;42556:32;42582:5;42556:32;:::i;:::-;42453:141;;;;:::o;42600:349::-;42669:6;42718:2;42706:9;42697:7;42693:23;42689:32;42686:119;;;42724:79;;:::i;:::-;42686:119;42844:1;42869:63;42924:7;42915:6;42904:9;42900:22;42869:63;:::i;:::-;42859:73;;42815:127;42600:349;;;;:::o;42955:233::-;42994:3;43017:24;43035:5;43017:24;:::i;:::-;43008:33;;43063:66;43056:5;43053:77;43050:103;;;43133:18;;:::i;:::-;43050:103;43180:1;43173:5;43169:13;43162:20;;42955:233;;;:::o;43194:180::-;43242:77;43239:1;43232:88;43339:4;43336:1;43329:15;43363:4;43360:1;43353:15;43380:185;43420:1;43437:20;43455:1;43437:20;:::i;:::-;43432:25;;43471:20;43489:1;43471:20;:::i;:::-;43466:25;;43510:1;43500:35;;43515:18;;:::i;:::-;43500:35;43557:1;43554;43550:9;43545:14;;43380:185;;;;:::o;43571:191::-;43611:4;43631:20;43649:1;43631:20;:::i;:::-;43626:25;;43665:20;43683:1;43665:20;:::i;:::-;43660:25;;43704:1;43701;43698:8;43695:34;;;43709:18;;:::i;:::-;43695:34;43754:1;43751;43747:9;43739:17;;43571:191;;;;:::o;43768:176::-;43800:1;43817:20;43835:1;43817:20;:::i;:::-;43812:25;;43851:20;43869:1;43851:20;:::i;:::-;43846:25;;43890:1;43880:35;;43895:18;;:::i;:::-;43880:35;43936:1;43933;43929:9;43924:14;;43768:176;;;;:::o
Swarm Source
ipfs://24f8c6893973087595622563fb7ec6ec2fbfd89e88f8c5d1b3b65b9b95fc72af
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ 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.