Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
6,666 TDD
Holders
2,069
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 TDDLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
The_Devious_Dead_NFT
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-07-29 */ // File: The Devious Dead NFT.sol // Developer - TTibbs // SPDX-License-Identifier: GPL-3.0 // 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: @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: erc721a/contracts/IERC721A.sol // ERC721A Contracts v4.2.0 // 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.0 // 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 ptr) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 128 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: 32 + 3 * 32 = 128. ptr := add(mload(0x40), 128) // Update the free memory pointer to allocate. mstore(0x40, ptr) // Cache the end of the memory to calculate the length later. let end := ptr // We write the string from the rightmost digit to the leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // Costs a bit more than early returning for the zero case, // but cheaper in terms of deployment and overall runtime costs. for { // Initialize and perform the first pass without check. let temp := value // Move the pointer 1 byte leftwards to point to an empty character slot. ptr := sub(ptr, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(ptr, add(48, mod(temp, 10))) temp := div(temp, 10) } temp { // Keep dividing `temp` until zero. temp := div(temp, 10) } { // Body of the for loop. ptr := sub(ptr, 1) mstore8(ptr, add(48, mod(temp, 10))) } let length := sub(end, ptr) // Move the pointer 32 bytes leftwards to make room for the length. ptr := sub(ptr, 32) // Store the length. mstore(ptr, length) } } } // File: contracts/dead.sol // File: The Devious Dead NFT.sol // Developer - TTibbs pragma solidity ^0.8.0; contract The_Devious_Dead_NFT is ERC721A, Ownable, ReentrancyGuard { using Strings for uint256; // Merkletree root hash (create merkleroot.js and add roothash from it) bytes32 public merkleRoot; bytes32 public ogmerkleRoot; // Reveal URI (set to blank if you want it sniper proof and update before minting) string public uri; string public uriSuffix = ".json"; // Hidden URI (add your hidden metadata CID here) string public hiddenMetadataUri = "ipfs://QmWwPjoWzh8oGjzKkevkS4b9GrFbpRhKmq12vXzbqsc6QM/hidden.json"; // Set the prices for each phase of minting uint256 public price = 0.065 ether; uint256 public wlprice = 0.04 ether; uint256 public ogprice = 0 ether; // Replace with your total supply here uint256 public supplyLimit = 3333; // Set the max per transaction for each phase of minting uint256 public maxMintAmountPerTx = 10; uint256 public wlmaxMintAmountPerTx = 4; uint256 public ogmaxMintAmountPerTx = 2; // Set the max per wallet for each phase of minting uint256 public maxLimitPerWallet = 20; uint256 public wlmaxLimitPerWallet = 8; uint256 public ogmaxLimitPerWallet = 2; // enable/disable minting phases bool public whitelistSale = false; bool public publicSale = false; bool public ogSale = false; // Reveal NFTs (set to false if you have want hidden metadata then change to true to reveal) bool public revealed = false; // Collection name and symbol, don't forget to change this constructor() ERC721A("The Devious Dead Official", "TDD") {} // Minting functions function OgMint(uint256 _mintAmount, bytes32[] calldata _merkleProof) public payable { // Verify og requirements require(ogSale, 'The OgSale is paused!'); bytes32 leaf = keccak256(abi.encodePacked(_msgSender())); require(MerkleProof.verify(_merkleProof, ogmerkleRoot, leaf), 'Invalid proof!'); // Normal requirements require(_mintAmount > 0 && _mintAmount <= ogmaxMintAmountPerTx, 'Invalid mint amount!'); require(totalSupply() + _mintAmount <= supplyLimit, 'Max supply exceeded!'); require(balanceOf(msg.sender) + _mintAmount <= ogmaxLimitPerWallet, 'Max mint per wallet exceeded!'); require(msg.value >= ogprice * _mintAmount, 'Insufficient funds!'); // Mint _safeMint(_msgSender(), _mintAmount); } function WlMint(uint256 _mintAmount, bytes32[] calldata _merkleProof) public payable { // Verify wl requirements require(whitelistSale, 'The WlSale is paused!'); bytes32 leaf = keccak256(abi.encodePacked(_msgSender())); require(MerkleProof.verify(_merkleProof, merkleRoot, leaf), 'Invalid proof!'); // Normal requirements require(_mintAmount > 0 && _mintAmount <= wlmaxMintAmountPerTx, 'Invalid mint amount!'); require(totalSupply() + _mintAmount <= supplyLimit, 'Max supply exceeded!'); require(balanceOf(msg.sender) + _mintAmount <= wlmaxLimitPerWallet, 'Max mint per wallet exceeded!'); require(msg.value >= wlprice * _mintAmount, 'Insufficient funds!'); // Mint _safeMint(_msgSender(), _mintAmount); } function PublicMint(uint256 _mintAmount) public payable { // Normal requirements require(publicSale, 'The PublicSale is paused!'); require(_mintAmount > 0 && _mintAmount <= maxMintAmountPerTx, 'Invalid mint amount!'); require(totalSupply() + _mintAmount <= supplyLimit, 'Max supply exceeded!'); require(balanceOf(msg.sender) + _mintAmount <= maxLimitPerWallet, 'Max mint per wallet exceeded!'); require(msg.value >= price * _mintAmount, 'Insufficient funds!'); // Mint _safeMint(_msgSender(), _mintAmount); } // Airdrops to given addresses function Airdrop(uint256 _mintAmount, address _receiver) public onlyOwner { require(totalSupply() + _mintAmount <= supplyLimit, 'Max supply exceeded!'); _safeMint(_receiver, _mintAmount); } // Changes the revealed state of your contract function setRevealed(bool _state) public onlyOwner { revealed = _state; } // Changes the URI you have set for the metadata function seturi(string memory _uri) public onlyOwner { uri = _uri; } // Changes the URI suffix for the metadata (Most will be .json) function setUriSuffix(string memory _uriSuffix) public onlyOwner { uriSuffix = _uriSuffix; } // Changes the hidden metadata CID function setHiddenMetadataUri(string memory _hiddenMetadataUri) public onlyOwner { hiddenMetadataUri = _hiddenMetadataUri; } // Toggles the sale settings for each phase of minting function setpublicSale(bool _publicSale) public onlyOwner { publicSale = _publicSale; } function setwlSale(bool _whitelistSale) public onlyOwner { whitelistSale = _whitelistSale; } function setogSale(bool _ogSale) public onlyOwner { ogSale = _ogSale; } // Sets the root hash from merkletree.js for each WL phase function setwlMerkleRootHash(bytes32 _merkleRoot) public onlyOwner { merkleRoot = _merkleRoot; } function setogMerkleRootHash(bytes32 _ogmerkleRoot) public onlyOwner { ogmerkleRoot = _ogmerkleRoot; } // Sets the max mint amount for each phase of minting function setMaxMintAmountPerTx(uint256 _maxMintAmountPerTx) public onlyOwner { maxMintAmountPerTx = _maxMintAmountPerTx; } function setwlmaxMintAmountPerTx(uint256 _wlmaxMintAmountPerTx) public onlyOwner { wlmaxMintAmountPerTx = _wlmaxMintAmountPerTx; } function setogmaxMintAmountPerTx(uint256 _ogmaxMintAmountPerTx) public onlyOwner { ogmaxMintAmountPerTx = _ogmaxMintAmountPerTx; } // Sets the max amount per wallet for each phase of minting function setmaxLimitPerWallet(uint256 _maxLimitPerWallet) public onlyOwner { maxLimitPerWallet = _maxLimitPerWallet; } function setwlmaxLimitPerWallet(uint256 _wlmaxLimitPerWallet) public onlyOwner { wlmaxLimitPerWallet = _wlmaxLimitPerWallet; } function setogmaxLimitPerWallet(uint256 _ogmaxLimitPerWallet) public onlyOwner { ogmaxLimitPerWallet = _ogmaxLimitPerWallet; } // Sets the price per NFT for each phase of minting function setPrice(uint256 _price) public onlyOwner { price = _price; } function setwlprice(uint256 _wlprice) public onlyOwner { wlprice = _wlprice; } function setogprice(uint256 _ogprice) public onlyOwner { ogprice = _ogprice; } // Changes the supply limit, use this when you want to mint for each phase and update as you go along function setsupplyLimit(uint256 _supplyLimit) public onlyOwner { supplyLimit = _supplyLimit; } // Do not remove this function or you will not be able to withdraw funds being held on the contract function withdraw() public onlyOwner nonReentrant { (bool os, ) = payable(owner()).call{value: address(this).balance}(''); require(os); } // Reads and returns the token IDs owned by a wallet function walletOfOwner(address _owner) public view returns (uint256[] memory) { uint256 ownerTokenCount = balanceOf(_owner); uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount); uint256 currentTokenId = 1; uint256 ownedTokenIndex = 0; while (ownedTokenIndex < ownerTokenCount && currentTokenId <= supplyLimit) { address currentTokenOwner = ownerOf(currentTokenId); if (currentTokenOwner == _owner) { ownedTokenIds[ownedTokenIndex] = currentTokenId; ownedTokenIndex++; } currentTokenId++; } return ownedTokenIds; } // Sets the first minted NFT to #1 instead of #0 function _startTokenId() internal view virtual override returns (uint256) { return 1; } // Returns the URI for the metadata of given token IDs 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)) : ''; } // Returns the metadata baseURI for the collection itself function _baseURI() internal view virtual override returns (string memory) { return uri; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"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":"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":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"Airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"OgMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"PublicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"WlMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"maxLimitPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ogSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ogmaxLimitPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ogmaxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ogmerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ogprice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSale","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":"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":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxLimitPerWallet","type":"uint256"}],"name":"setmaxLimitPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_ogmerkleRoot","type":"bytes32"}],"name":"setogMerkleRootHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_ogSale","type":"bool"}],"name":"setogSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_ogmaxLimitPerWallet","type":"uint256"}],"name":"setogmaxLimitPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_ogmaxMintAmountPerTx","type":"uint256"}],"name":"setogmaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_ogprice","type":"uint256"}],"name":"setogprice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_publicSale","type":"bool"}],"name":"setpublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supplyLimit","type":"uint256"}],"name":"setsupplyLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"seturi","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setwlMerkleRootHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_whitelistSale","type":"bool"}],"name":"setwlSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_wlmaxLimitPerWallet","type":"uint256"}],"name":"setwlmaxLimitPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_wlmaxMintAmountPerTx","type":"uint256"}],"name":"setwlmaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_wlprice","type":"uint256"}],"name":"setwlprice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"supplyLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uri","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":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wlmaxLimitPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wlmaxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wlprice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600d908051906020019062000051929190620002f8565b50604051806080016040528060418152602001620049b260419139600e908051906020019062000083929190620002f8565b5066e6ed27d6668000600f55668e1bc9bf0400006010556000601155610d05601255600a601355600460145560026015556014601655600860175560026018556000601960006101000a81548160ff0219169083151502179055506000601960016101000a81548160ff0219169083151502179055506000601960026101000a81548160ff0219169083151502179055506000601960036101000a81548160ff0219169083151502179055503480156200013c57600080fd5b506040518060400160405280601981526020017f54686520446576696f75732044656164204f6666696369616c000000000000008152506040518060400160405280600381526020017f54444400000000000000000000000000000000000000000000000000000000008152508160029080519060200190620001c1929190620002f8565b508060039080519060200190620001da929190620002f8565b50620001eb6200022160201b60201c565b600081905550505062000213620002076200022a60201b60201c565b6200023260201b60201c565b60016009819055506200040d565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200030690620003a8565b90600052602060002090601f0160209004810192826200032a576000855562000376565b82601f106200034557805160ff191683800117855562000376565b8280016001018555821562000376579182015b828111156200037557825182559160200191906001019062000358565b5b50905062000385919062000389565b5090565b5b80821115620003a45760008160009055506001016200038a565b5090565b60006002820490506001821680620003c157607f821691505b60208210811415620003d857620003d7620003de565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b614595806200041d6000396000f3fe6080604052600436106103a15760003560e01c8063865aaff9116101e7578063b88d4fde1161010d578063dc544ca7116100a0578063ecd993081161006f578063ecd9930814610d32578063f2cd579614610d5d578063f2fde38b14610d88578063f648498014610db1576103a1565b8063dc544ca714610c76578063e0a8085314610ca1578063e985e9c514610cca578063eac989f814610d07576103a1565b8063d19fdec4116100dc578063d19fdec414610bd0578063d39c785014610bfb578063d610da9814610c24578063d9f0a67114610c4d576103a1565b8063b88d4fde14610b18578063c7173fb014610b41578063c87b56dd14610b6a578063ce9ce09d14610ba7576103a1565b80639cb257d011610185578063a28b56f211610154578063a28b56f214610a72578063a45ba8e714610a9b578063abe37a9414610ac6578063b071401b14610aef576103a1565b80639cb257d0146109d95780639fb17e3414610a02578063a035b1fe14610a1e578063a22cb46514610a49576103a1565b80638da5cb5b116101c15780638da5cb5b1461092f57806391b7f5ed1461095a57806394354fd01461098357806395d89b41146109ae576103a1565b8063865aaff9146108b0578063869194ac146108d957806388b71fc014610904576103a1565b80633f527490116102cc5780635a0b8b231161026a5780636352211e116102395780636352211e146107f657806370a0823114610833578063715018a6146108705780637871e15414610887576103a1565b80635a0b8b231461076a5780635b06f47f146107955780635c22abd2146107b157806361efde22146107da576103a1565b8063454bb2a8116102a6578063454bb2a8146106c25780634fdd43cb146106eb57806351830227146107145780635503a0e81461073f576103a1565b80633f5274901461063157806342842e0e1461065c578063438b630014610685576103a1565b806318160ddd116103445780632eb4a7ab116103135780632eb4a7ab1461059957806331ffd6f1146105c457806333bc1c5c146105ef5780633ccfd60b1461061a576103a1565b806318160ddd146104ef57806319d1997a1461051a5780631b4fa8b71461054557806323b872dd14610570576103a1565b8063081812fc11610380578063081812fc14610437578063095ea7b3146104745780630f0a56a91461049d57806316ba10e0146104c6576103a1565b806275770a146103a657806301ffc9a7146103cf57806306fdde031461040c575b600080fd5b3480156103b257600080fd5b506103cd60048036038101906103c89190613683565b610dda565b005b3480156103db57600080fd5b506103f660048036038101906103f191906135f0565b610dec565b6040516104039190613beb565b60405180910390f35b34801561041857600080fd5b50610421610e7e565b60405161042e9190613c21565b60405180910390f35b34801561044357600080fd5b5061045e60048036038101906104599190613683565b610f10565b60405161046b9190613b62565b60405180910390f35b34801561048057600080fd5b5061049b60048036038101906104969190613562565b610f8f565b005b3480156104a957600080fd5b506104c460048036038101906104bf9190613683565b6110d3565b005b3480156104d257600080fd5b506104ed60048036038101906104e89190613642565b6110e5565b005b3480156104fb57600080fd5b50610504611107565b6040516105119190613dc3565b60405180910390f35b34801561052657600080fd5b5061052f61111e565b60405161053c9190613dc3565b60405180910390f35b34801561055157600080fd5b5061055a611124565b6040516105679190613c06565b60405180910390f35b34801561057c57600080fd5b506105976004803603810190610592919061345c565b61112a565b005b3480156105a557600080fd5b506105ae61144f565b6040516105bb9190613c06565b60405180910390f35b3480156105d057600080fd5b506105d9611455565b6040516105e69190613beb565b60405180910390f35b3480156105fb57600080fd5b50610604611468565b6040516106119190613beb565b60405180910390f35b34801561062657600080fd5b5061062f61147b565b005b34801561063d57600080fd5b50610646611559565b6040516106539190613dc3565b60405180910390f35b34801561066857600080fd5b50610683600480360381019061067e919061345c565b61155f565b005b34801561069157600080fd5b506106ac60048036038101906106a791906133f7565b61157f565b6040516106b99190613bc9565b60405180910390f35b3480156106ce57600080fd5b506106e960048036038101906106e49190613683565b6116d6565b005b3480156106f757600080fd5b50610712600480360381019061070d9190613642565b6116e8565b005b34801561072057600080fd5b5061072961170a565b6040516107369190613beb565b60405180910390f35b34801561074b57600080fd5b5061075461171d565b6040516107619190613c21565b60405180910390f35b34801561077657600080fd5b5061077f6117ab565b60405161078c9190613dc3565b60405180910390f35b6107af60048036038101906107aa91906136e8565b6117b1565b005b3480156107bd57600080fd5b506107d860048036038101906107d3919061359e565b611a26565b005b6107f460048036038101906107ef91906136e8565b611a4b565b005b34801561080257600080fd5b5061081d60048036038101906108189190613683565b611cc0565b60405161082a9190613b62565b60405180910390f35b34801561083f57600080fd5b5061085a600480360381019061085591906133f7565b611cd2565b6040516108679190613dc3565b60405180910390f35b34801561087c57600080fd5b50610885611d8b565b005b34801561089357600080fd5b506108ae60048036038101906108a991906136ac565b611d9f565b005b3480156108bc57600080fd5b506108d760048036038101906108d2919061359e565b611e0c565b005b3480156108e557600080fd5b506108ee611e31565b6040516108fb9190613dc3565b60405180910390f35b34801561091057600080fd5b50610919611e37565b6040516109269190613beb565b60405180910390f35b34801561093b57600080fd5b50610944611e4a565b6040516109519190613b62565b60405180910390f35b34801561096657600080fd5b50610981600480360381019061097c9190613683565b611e74565b005b34801561098f57600080fd5b50610998611e86565b6040516109a59190613dc3565b60405180910390f35b3480156109ba57600080fd5b506109c3611e8c565b6040516109d09190613c21565b60405180910390f35b3480156109e557600080fd5b50610a0060048036038101906109fb919061359e565b611f1e565b005b610a1c6004803603810190610a179190613683565b611f43565b005b348015610a2a57600080fd5b50610a336120f6565b604051610a409190613dc3565b60405180910390f35b348015610a5557600080fd5b50610a706004803603810190610a6b9190613526565b6120fc565b005b348015610a7e57600080fd5b50610a996004803603810190610a9491906135c7565b612274565b005b348015610aa757600080fd5b50610ab0612286565b604051610abd9190613c21565b60405180910390f35b348015610ad257600080fd5b50610aed6004803603810190610ae89190613683565b612314565b005b348015610afb57600080fd5b50610b166004803603810190610b119190613683565b612326565b005b348015610b2457600080fd5b50610b3f6004803603810190610b3a91906134ab565b612338565b005b348015610b4d57600080fd5b50610b686004803603810190610b6391906135c7565b6123ab565b005b348015610b7657600080fd5b50610b916004803603810190610b8c9190613683565b6123bd565b604051610b9e9190613c21565b60405180910390f35b348015610bb357600080fd5b50610bce6004803603810190610bc99190613683565b612516565b005b348015610bdc57600080fd5b50610be5612528565b604051610bf29190613dc3565b60405180910390f35b348015610c0757600080fd5b50610c226004803603810190610c1d9190613683565b61252e565b005b348015610c3057600080fd5b50610c4b6004803603810190610c469190613683565b612540565b005b348015610c5957600080fd5b50610c746004803603810190610c6f9190613683565b612552565b005b348015610c8257600080fd5b50610c8b612564565b604051610c989190613dc3565b60405180910390f35b348015610cad57600080fd5b50610cc86004803603810190610cc3919061359e565b61256a565b005b348015610cd657600080fd5b50610cf16004803603810190610cec9190613420565b61258f565b604051610cfe9190613beb565b60405180910390f35b348015610d1357600080fd5b50610d1c612623565b604051610d299190613c21565b60405180910390f35b348015610d3e57600080fd5b50610d476126b1565b604051610d549190613dc3565b60405180910390f35b348015610d6957600080fd5b50610d726126b7565b604051610d7f9190613dc3565b60405180910390f35b348015610d9457600080fd5b50610daf6004803603810190610daa91906133f7565b6126bd565b005b348015610dbd57600080fd5b50610dd86004803603810190610dd39190613642565b612741565b005b610de2612763565b8060128190555050565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610e4757506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610e775750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610e8d906140d6565b80601f0160208091040260200160405190810160405280929190818152602001828054610eb9906140d6565b8015610f065780601f10610edb57610100808354040283529160200191610f06565b820191906000526020600020905b815481529060010190602001808311610ee957829003601f168201915b5050505050905090565b6000610f1b826127e1565b610f51576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610f9a82611cc0565b90508073ffffffffffffffffffffffffffffffffffffffff16610fbb612840565b73ffffffffffffffffffffffffffffffffffffffff161461101e57610fe781610fe2612840565b61258f565b61101d576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6110db612763565b8060118190555050565b6110ed612763565b80600d90805190602001906111039291906131bc565b5050565b6000611111612848565b6001546000540303905090565b60125481565b600b5481565b600061113582612851565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461119c576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806111a88461291f565b915091506111be81876111b9612840565b612946565b61120a576111d3866111ce612840565b61258f565b611209576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611271576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61127e868686600161298a565b801561128957600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061135785611333888887612990565b7c0200000000000000000000000000000000000000000000000000000000176129b8565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841614156113df5760006001850190506000600460008381526020019081526020016000205414156113dd5760005481146113dc578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461144786868660016129e3565b505050505050565b600a5481565b601960009054906101000a900460ff1681565b601960019054906101000a900460ff1681565b611483612763565b600260095414156114c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c090613d83565b60405180910390fd5b600260098190555060006114db611e4a565b73ffffffffffffffffffffffffffffffffffffffff16476040516114fe90613b4d565b60006040518083038185875af1925050503d806000811461153b576040519150601f19603f3d011682016040523d82523d6000602084013e611540565b606091505b505090508061154e57600080fd5b506001600981905550565b60185481565b61157a83838360405180602001604052806000815250612338565b505050565b6060600061158c83611cd2565b905060008167ffffffffffffffff8111156115d0577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156115fe5781602001602082028036833780820191505090505b50905060006001905060005b838110801561161b57506012548211155b156116ca57600061162b83611cc0565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156116b6578284838151811061169b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505081806116b290614139565b9250505b82806116c190614139565b9350505061160a565b82945050505050919050565b6116de612763565b8060178190555050565b6116f0612763565b80600e90805190602001906117069291906131bc565b5050565b601960039054906101000a900460ff1681565b600d805461172a906140d6565b80601f0160208091040260200160405190810160405280929190818152602001828054611756906140d6565b80156117a35780601f10611778576101008083540402835291602001916117a3565b820191906000526020600020905b81548152906001019060200180831161178657829003601f168201915b505050505081565b60165481565b601960029054906101000a900460ff16611800576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f790613d03565b60405180910390fd5b600061180a6129e9565b60405160200161181a9190613b01565b604051602081830303815290604052805190602001209050611880838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600b54836129f1565b6118bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b690613c43565b60405180910390fd5b6000841180156118d157506015548411155b611910576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190790613c83565b60405180910390fd5b6012548461191c611107565b6119269190613f01565b1115611967576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195e90613d23565b60405180910390fd5b6018548461197433611cd2565b61197e9190613f01565b11156119bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b690613ca3565b60405180910390fd5b836011546119cd9190613f88565b341015611a0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0690613da3565b60405180910390fd5b611a20611a1a6129e9565b85612a08565b50505050565b611a2e612763565b80601960016101000a81548160ff02191690831515021790555050565b601960009054906101000a900460ff16611a9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9190613d63565b60405180910390fd5b6000611aa46129e9565b604051602001611ab49190613b01565b604051602081830303815290604052805190602001209050611b1a838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600a54836129f1565b611b59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5090613c43565b60405180910390fd5b600084118015611b6b57506014548411155b611baa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba190613c83565b60405180910390fd5b60125484611bb6611107565b611bc09190613f01565b1115611c01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf890613d23565b60405180910390fd5b60175484611c0e33611cd2565b611c189190613f01565b1115611c59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5090613ca3565b60405180910390fd5b83601054611c679190613f88565b341015611ca9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca090613da3565b60405180910390fd5b611cba611cb46129e9565b85612a08565b50505050565b6000611ccb82612851565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d3a576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611d93612763565b611d9d6000612a26565b565b611da7612763565b60125482611db3611107565b611dbd9190613f01565b1115611dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df590613d23565b60405180910390fd5b611e088183612a08565b5050565b611e14612763565b80601960026101000a81548160ff02191690831515021790555050565b60175481565b601960029054906101000a900460ff1681565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611e7c612763565b80600f8190555050565b60135481565b606060038054611e9b906140d6565b80601f0160208091040260200160405190810160405280929190818152602001828054611ec7906140d6565b8015611f145780601f10611ee957610100808354040283529160200191611f14565b820191906000526020600020905b815481529060010190602001808311611ef757829003601f168201915b5050505050905090565b611f26612763565b80601960006101000a81548160ff02191690831515021790555050565b601960019054906101000a900460ff16611f92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8990613d43565b60405180910390fd5b600081118015611fa457506013548111155b611fe3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fda90613c83565b60405180910390fd5b60125481611fef611107565b611ff99190613f01565b111561203a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203190613d23565b60405180910390fd5b6016548161204733611cd2565b6120519190613f01565b1115612092576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208990613ca3565b60405180910390fd5b80600f546120a09190613f88565b3410156120e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d990613da3565b60405180910390fd5b6120f36120ed6129e9565b82612a08565b50565b600f5481565b612104612840565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612169576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000612176612840565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612223612840565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516122689190613beb565b60405180910390a35050565b61227c612763565b80600a8190555050565b600e8054612293906140d6565b80601f01602080910402602001604051908101604052809291908181526020018280546122bf906140d6565b801561230c5780601f106122e15761010080835404028352916020019161230c565b820191906000526020600020905b8154815290600101906020018083116122ef57829003601f168201915b505050505081565b61231c612763565b8060148190555050565b61232e612763565b8060138190555050565b61234384848461112a565b60008373ffffffffffffffffffffffffffffffffffffffff163b146123a55761236e84848484612aec565b6123a4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6123b3612763565b80600b8190555050565b60606123c8826127e1565b612407576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123fe90613ce3565b60405180910390fd5b60001515601960039054906101000a900460ff16151514156124b557600e8054612430906140d6565b80601f016020809104026020016040519081016040528092919081815260200182805461245c906140d6565b80156124a95780601f1061247e576101008083540402835291602001916124a9565b820191906000526020600020905b81548152906001019060200180831161248c57829003601f168201915b50505050509050612511565b60006124bf612c4c565b905060008151116124df576040518060200160405280600081525061250d565b806124e984612cde565b600d6040516020016124fd93929190613b1c565b6040516020818303038152906040525b9150505b919050565b61251e612763565b8060188190555050565b60155481565b612536612763565b8060108190555050565b612548612763565b8060158190555050565b61255a612763565b8060168190555050565b60105481565b612572612763565b80601960036101000a81548160ff02191690831515021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c8054612630906140d6565b80601f016020809104026020016040519081016040528092919081815260200182805461265c906140d6565b80156126a95780601f1061267e576101008083540402835291602001916126a9565b820191906000526020600020905b81548152906001019060200180831161268c57829003601f168201915b505050505081565b60115481565b60145481565b6126c5612763565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612735576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272c90613c63565b60405180910390fd5b61273e81612a26565b50565b612749612763565b80600c908051906020019061275f9291906131bc565b5050565b61276b6129e9565b73ffffffffffffffffffffffffffffffffffffffff16612789611e4a565b73ffffffffffffffffffffffffffffffffffffffff16146127df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127d690613cc3565b60405180910390fd5b565b6000816127ec612848565b111580156127fb575060005482105b8015612839575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b60008082905080612860612848565b116128e8576000548110156128e75760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821614156128e5575b60008114156128db5760046000836001900393508381526020019081526020016000205490506128b0565b809250505061291a565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86129a7868684612e8b565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b6000826129fe8584612e94565b1490509392505050565b612a22828260405180602001604052806000815250612f10565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b12612840565b8786866040518563ffffffff1660e01b8152600401612b349493929190613b7d565b602060405180830381600087803b158015612b4e57600080fd5b505af1925050508015612b7f57506040513d601f19601f82011682018060405250810190612b7c9190613619565b60015b612bf9573d8060008114612baf576040519150601f19603f3d011682016040523d82523d6000602084013e612bb4565b606091505b50600081511415612bf1576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600c8054612c5b906140d6565b80601f0160208091040260200160405190810160405280929190818152602001828054612c87906140d6565b8015612cd45780601f10612ca957610100808354040283529160200191612cd4565b820191906000526020600020905b815481529060010190602001808311612cb757829003601f168201915b5050505050905090565b60606000821415612d26576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612e86565b600082905060005b60008214612d58578080612d4190614139565b915050600a82612d519190613f57565b9150612d2e565b60008167ffffffffffffffff811115612d9a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612dcc5781602001600182028036833780820191505090505b5090505b60008514612e7f57600182612de59190613fe2565b9150600a85612df491906141a6565b6030612e009190613f01565b60f81b818381518110612e3c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612e789190613f57565b9450612dd0565b8093505050505b919050565b60009392505050565b60008082905060005b8451811015612f0557612ef082868381518110612ee3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151612fad565b91508080612efd90614139565b915050612e9d565b508091505092915050565b612f1a8383612fd8565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612fa857600080549050600083820390505b612f5a6000868380600101945086612aec565b612f90576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612f47578160005414612fa557600080fd5b50505b505050565b6000818310612fc557612fc08284613195565b612fd0565b612fcf8383613195565b5b905092915050565b6000805490506000821415613019576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613026600084838561298a565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061309d8361308e6000866000612990565b613097856131ac565b176129b8565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461313e57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050613103565b50600082141561317a576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081905550505061319060008483856129e3565b505050565b600082600052816020526040600020905092915050565b60006001821460e11b9050919050565b8280546131c8906140d6565b90600052602060002090601f0160209004810192826131ea5760008555613231565b82601f1061320357805160ff1916838001178555613231565b82800160010185558215613231579182015b82811115613230578251825591602001919060010190613215565b5b50905061323e9190613242565b5090565b5b8082111561325b576000816000905550600101613243565b5090565b600061327261326d84613e03565b613dde565b90508281526020810184848401111561328a57600080fd5b613295848285614094565b509392505050565b60006132b06132ab84613e34565b613dde565b9050828152602081018484840111156132c857600080fd5b6132d3848285614094565b509392505050565b6000813590506132ea816144ec565b92915050565b60008083601f84011261330257600080fd5b8235905067ffffffffffffffff81111561331b57600080fd5b60208301915083602082028301111561333357600080fd5b9250929050565b60008135905061334981614503565b92915050565b60008135905061335e8161451a565b92915050565b60008135905061337381614531565b92915050565b60008151905061338881614531565b92915050565b600082601f83011261339f57600080fd5b81356133af84826020860161325f565b91505092915050565b600082601f8301126133c957600080fd5b81356133d984826020860161329d565b91505092915050565b6000813590506133f181614548565b92915050565b60006020828403121561340957600080fd5b6000613417848285016132db565b91505092915050565b6000806040838503121561343357600080fd5b6000613441858286016132db565b9250506020613452858286016132db565b9150509250929050565b60008060006060848603121561347157600080fd5b600061347f868287016132db565b9350506020613490868287016132db565b92505060406134a1868287016133e2565b9150509250925092565b600080600080608085870312156134c157600080fd5b60006134cf878288016132db565b94505060206134e0878288016132db565b93505060406134f1878288016133e2565b925050606085013567ffffffffffffffff81111561350e57600080fd5b61351a8782880161338e565b91505092959194509250565b6000806040838503121561353957600080fd5b6000613547858286016132db565b92505060206135588582860161333a565b9150509250929050565b6000806040838503121561357557600080fd5b6000613583858286016132db565b9250506020613594858286016133e2565b9150509250929050565b6000602082840312156135b057600080fd5b60006135be8482850161333a565b91505092915050565b6000602082840312156135d957600080fd5b60006135e78482850161334f565b91505092915050565b60006020828403121561360257600080fd5b600061361084828501613364565b91505092915050565b60006020828403121561362b57600080fd5b600061363984828501613379565b91505092915050565b60006020828403121561365457600080fd5b600082013567ffffffffffffffff81111561366e57600080fd5b61367a848285016133b8565b91505092915050565b60006020828403121561369557600080fd5b60006136a3848285016133e2565b91505092915050565b600080604083850312156136bf57600080fd5b60006136cd858286016133e2565b92505060206136de858286016132db565b9150509250929050565b6000806000604084860312156136fd57600080fd5b600061370b868287016133e2565b935050602084013567ffffffffffffffff81111561372857600080fd5b613734868287016132f0565b92509250509250925092565b600061374c8383613ae3565b60208301905092915050565b61376181614016565b82525050565b61377861377382614016565b614182565b82525050565b600061378982613e8a565b6137938185613eb8565b935061379e83613e65565b8060005b838110156137cf5781516137b68882613740565b97506137c183613eab565b9250506001810190506137a2565b5085935050505092915050565b6137e581614028565b82525050565b6137f481614034565b82525050565b600061380582613e95565b61380f8185613ec9565b935061381f8185602086016140a3565b61382881614293565b840191505092915050565b600061383e82613ea0565b6138488185613ee5565b93506138588185602086016140a3565b61386181614293565b840191505092915050565b600061387782613ea0565b6138818185613ef6565b93506138918185602086016140a3565b80840191505092915050565b600081546138aa816140d6565b6138b48186613ef6565b945060018216600081146138cf57600181146138e057613913565b60ff19831686528186019350613913565b6138e985613e75565b60005b8381101561390b578154818901526001820191506020810190506138ec565b838801955050505b50505092915050565b6000613929600e83613ee5565b9150613934826142b1565b602082019050919050565b600061394c602683613ee5565b9150613957826142da565b604082019050919050565b600061396f601483613ee5565b915061397a82614329565b602082019050919050565b6000613992601d83613ee5565b915061399d82614352565b602082019050919050565b60006139b5602083613ee5565b91506139c08261437b565b602082019050919050565b60006139d8602f83613ee5565b91506139e3826143a4565b604082019050919050565b60006139fb601583613ee5565b9150613a06826143f3565b602082019050919050565b6000613a1e600083613eda565b9150613a298261441c565b600082019050919050565b6000613a41601483613ee5565b9150613a4c8261441f565b602082019050919050565b6000613a64601983613ee5565b9150613a6f82614448565b602082019050919050565b6000613a87601583613ee5565b9150613a9282614471565b602082019050919050565b6000613aaa601f83613ee5565b9150613ab58261449a565b602082019050919050565b6000613acd601383613ee5565b9150613ad8826144c3565b602082019050919050565b613aec8161408a565b82525050565b613afb8161408a565b82525050565b6000613b0d8284613767565b60148201915081905092915050565b6000613b28828661386c565b9150613b34828561386c565b9150613b40828461389d565b9150819050949350505050565b6000613b5882613a11565b9150819050919050565b6000602082019050613b776000830184613758565b92915050565b6000608082019050613b926000830187613758565b613b9f6020830186613758565b613bac6040830185613af2565b8181036060830152613bbe81846137fa565b905095945050505050565b60006020820190508181036000830152613be3818461377e565b905092915050565b6000602082019050613c0060008301846137dc565b92915050565b6000602082019050613c1b60008301846137eb565b92915050565b60006020820190508181036000830152613c3b8184613833565b905092915050565b60006020820190508181036000830152613c5c8161391c565b9050919050565b60006020820190508181036000830152613c7c8161393f565b9050919050565b60006020820190508181036000830152613c9c81613962565b9050919050565b60006020820190508181036000830152613cbc81613985565b9050919050565b60006020820190508181036000830152613cdc816139a8565b9050919050565b60006020820190508181036000830152613cfc816139cb565b9050919050565b60006020820190508181036000830152613d1c816139ee565b9050919050565b60006020820190508181036000830152613d3c81613a34565b9050919050565b60006020820190508181036000830152613d5c81613a57565b9050919050565b60006020820190508181036000830152613d7c81613a7a565b9050919050565b60006020820190508181036000830152613d9c81613a9d565b9050919050565b60006020820190508181036000830152613dbc81613ac0565b9050919050565b6000602082019050613dd86000830184613af2565b92915050565b6000613de8613df9565b9050613df48282614108565b919050565b6000604051905090565b600067ffffffffffffffff821115613e1e57613e1d614264565b5b613e2782614293565b9050602081019050919050565b600067ffffffffffffffff821115613e4f57613e4e614264565b5b613e5882614293565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613f0c8261408a565b9150613f178361408a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613f4c57613f4b6141d7565b5b828201905092915050565b6000613f628261408a565b9150613f6d8361408a565b925082613f7d57613f7c614206565b5b828204905092915050565b6000613f938261408a565b9150613f9e8361408a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613fd757613fd66141d7565b5b828202905092915050565b6000613fed8261408a565b9150613ff88361408a565b92508282101561400b5761400a6141d7565b5b828203905092915050565b60006140218261406a565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156140c15780820151818401526020810190506140a6565b838111156140d0576000848401525b50505050565b600060028204905060018216806140ee57607f821691505b6020821081141561410257614101614235565b5b50919050565b61411182614293565b810181811067ffffffffffffffff821117156141305761412f614264565b5b80604052505050565b60006141448261408a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614177576141766141d7565b5b600182019050919050565b600061418d82614194565b9050919050565b600061419f826142a4565b9050919050565b60006141b18261408a565b91506141bc8361408a565b9250826141cc576141cb614206565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f496e76616c69642070726f6f6621000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b7f4d6178206d696e74207065722077616c6c657420657863656564656421000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f546865204f6753616c6520697320706175736564210000000000000000000000600082015250565b50565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b7f546865205075626c696353616c65206973207061757365642100000000000000600082015250565b7f54686520576c53616c6520697320706175736564210000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b6144f581614016565b811461450057600080fd5b50565b61450c81614028565b811461451757600080fd5b50565b61452381614034565b811461452e57600080fd5b50565b61453a8161403e565b811461454557600080fd5b50565b6145518161408a565b811461455c57600080fd5b5056fea26469706673582212200cb1cc2f0ad17f0c3b1b2e2c4cd4ffeb77f94c31d3bc65edc3dec43ad008a18464736f6c63430008040033697066733a2f2f516d5777506a6f577a68386f476a7a4b6b65766b53346239477246627052684b6d71313276587a6271736336514d2f68696464656e2e6a736f6e
Deployed Bytecode
0x6080604052600436106103a15760003560e01c8063865aaff9116101e7578063b88d4fde1161010d578063dc544ca7116100a0578063ecd993081161006f578063ecd9930814610d32578063f2cd579614610d5d578063f2fde38b14610d88578063f648498014610db1576103a1565b8063dc544ca714610c76578063e0a8085314610ca1578063e985e9c514610cca578063eac989f814610d07576103a1565b8063d19fdec4116100dc578063d19fdec414610bd0578063d39c785014610bfb578063d610da9814610c24578063d9f0a67114610c4d576103a1565b8063b88d4fde14610b18578063c7173fb014610b41578063c87b56dd14610b6a578063ce9ce09d14610ba7576103a1565b80639cb257d011610185578063a28b56f211610154578063a28b56f214610a72578063a45ba8e714610a9b578063abe37a9414610ac6578063b071401b14610aef576103a1565b80639cb257d0146109d95780639fb17e3414610a02578063a035b1fe14610a1e578063a22cb46514610a49576103a1565b80638da5cb5b116101c15780638da5cb5b1461092f57806391b7f5ed1461095a57806394354fd01461098357806395d89b41146109ae576103a1565b8063865aaff9146108b0578063869194ac146108d957806388b71fc014610904576103a1565b80633f527490116102cc5780635a0b8b231161026a5780636352211e116102395780636352211e146107f657806370a0823114610833578063715018a6146108705780637871e15414610887576103a1565b80635a0b8b231461076a5780635b06f47f146107955780635c22abd2146107b157806361efde22146107da576103a1565b8063454bb2a8116102a6578063454bb2a8146106c25780634fdd43cb146106eb57806351830227146107145780635503a0e81461073f576103a1565b80633f5274901461063157806342842e0e1461065c578063438b630014610685576103a1565b806318160ddd116103445780632eb4a7ab116103135780632eb4a7ab1461059957806331ffd6f1146105c457806333bc1c5c146105ef5780633ccfd60b1461061a576103a1565b806318160ddd146104ef57806319d1997a1461051a5780631b4fa8b71461054557806323b872dd14610570576103a1565b8063081812fc11610380578063081812fc14610437578063095ea7b3146104745780630f0a56a91461049d57806316ba10e0146104c6576103a1565b806275770a146103a657806301ffc9a7146103cf57806306fdde031461040c575b600080fd5b3480156103b257600080fd5b506103cd60048036038101906103c89190613683565b610dda565b005b3480156103db57600080fd5b506103f660048036038101906103f191906135f0565b610dec565b6040516104039190613beb565b60405180910390f35b34801561041857600080fd5b50610421610e7e565b60405161042e9190613c21565b60405180910390f35b34801561044357600080fd5b5061045e60048036038101906104599190613683565b610f10565b60405161046b9190613b62565b60405180910390f35b34801561048057600080fd5b5061049b60048036038101906104969190613562565b610f8f565b005b3480156104a957600080fd5b506104c460048036038101906104bf9190613683565b6110d3565b005b3480156104d257600080fd5b506104ed60048036038101906104e89190613642565b6110e5565b005b3480156104fb57600080fd5b50610504611107565b6040516105119190613dc3565b60405180910390f35b34801561052657600080fd5b5061052f61111e565b60405161053c9190613dc3565b60405180910390f35b34801561055157600080fd5b5061055a611124565b6040516105679190613c06565b60405180910390f35b34801561057c57600080fd5b506105976004803603810190610592919061345c565b61112a565b005b3480156105a557600080fd5b506105ae61144f565b6040516105bb9190613c06565b60405180910390f35b3480156105d057600080fd5b506105d9611455565b6040516105e69190613beb565b60405180910390f35b3480156105fb57600080fd5b50610604611468565b6040516106119190613beb565b60405180910390f35b34801561062657600080fd5b5061062f61147b565b005b34801561063d57600080fd5b50610646611559565b6040516106539190613dc3565b60405180910390f35b34801561066857600080fd5b50610683600480360381019061067e919061345c565b61155f565b005b34801561069157600080fd5b506106ac60048036038101906106a791906133f7565b61157f565b6040516106b99190613bc9565b60405180910390f35b3480156106ce57600080fd5b506106e960048036038101906106e49190613683565b6116d6565b005b3480156106f757600080fd5b50610712600480360381019061070d9190613642565b6116e8565b005b34801561072057600080fd5b5061072961170a565b6040516107369190613beb565b60405180910390f35b34801561074b57600080fd5b5061075461171d565b6040516107619190613c21565b60405180910390f35b34801561077657600080fd5b5061077f6117ab565b60405161078c9190613dc3565b60405180910390f35b6107af60048036038101906107aa91906136e8565b6117b1565b005b3480156107bd57600080fd5b506107d860048036038101906107d3919061359e565b611a26565b005b6107f460048036038101906107ef91906136e8565b611a4b565b005b34801561080257600080fd5b5061081d60048036038101906108189190613683565b611cc0565b60405161082a9190613b62565b60405180910390f35b34801561083f57600080fd5b5061085a600480360381019061085591906133f7565b611cd2565b6040516108679190613dc3565b60405180910390f35b34801561087c57600080fd5b50610885611d8b565b005b34801561089357600080fd5b506108ae60048036038101906108a991906136ac565b611d9f565b005b3480156108bc57600080fd5b506108d760048036038101906108d2919061359e565b611e0c565b005b3480156108e557600080fd5b506108ee611e31565b6040516108fb9190613dc3565b60405180910390f35b34801561091057600080fd5b50610919611e37565b6040516109269190613beb565b60405180910390f35b34801561093b57600080fd5b50610944611e4a565b6040516109519190613b62565b60405180910390f35b34801561096657600080fd5b50610981600480360381019061097c9190613683565b611e74565b005b34801561098f57600080fd5b50610998611e86565b6040516109a59190613dc3565b60405180910390f35b3480156109ba57600080fd5b506109c3611e8c565b6040516109d09190613c21565b60405180910390f35b3480156109e557600080fd5b50610a0060048036038101906109fb919061359e565b611f1e565b005b610a1c6004803603810190610a179190613683565b611f43565b005b348015610a2a57600080fd5b50610a336120f6565b604051610a409190613dc3565b60405180910390f35b348015610a5557600080fd5b50610a706004803603810190610a6b9190613526565b6120fc565b005b348015610a7e57600080fd5b50610a996004803603810190610a9491906135c7565b612274565b005b348015610aa757600080fd5b50610ab0612286565b604051610abd9190613c21565b60405180910390f35b348015610ad257600080fd5b50610aed6004803603810190610ae89190613683565b612314565b005b348015610afb57600080fd5b50610b166004803603810190610b119190613683565b612326565b005b348015610b2457600080fd5b50610b3f6004803603810190610b3a91906134ab565b612338565b005b348015610b4d57600080fd5b50610b686004803603810190610b6391906135c7565b6123ab565b005b348015610b7657600080fd5b50610b916004803603810190610b8c9190613683565b6123bd565b604051610b9e9190613c21565b60405180910390f35b348015610bb357600080fd5b50610bce6004803603810190610bc99190613683565b612516565b005b348015610bdc57600080fd5b50610be5612528565b604051610bf29190613dc3565b60405180910390f35b348015610c0757600080fd5b50610c226004803603810190610c1d9190613683565b61252e565b005b348015610c3057600080fd5b50610c4b6004803603810190610c469190613683565b612540565b005b348015610c5957600080fd5b50610c746004803603810190610c6f9190613683565b612552565b005b348015610c8257600080fd5b50610c8b612564565b604051610c989190613dc3565b60405180910390f35b348015610cad57600080fd5b50610cc86004803603810190610cc3919061359e565b61256a565b005b348015610cd657600080fd5b50610cf16004803603810190610cec9190613420565b61258f565b604051610cfe9190613beb565b60405180910390f35b348015610d1357600080fd5b50610d1c612623565b604051610d299190613c21565b60405180910390f35b348015610d3e57600080fd5b50610d476126b1565b604051610d549190613dc3565b60405180910390f35b348015610d6957600080fd5b50610d726126b7565b604051610d7f9190613dc3565b60405180910390f35b348015610d9457600080fd5b50610daf6004803603810190610daa91906133f7565b6126bd565b005b348015610dbd57600080fd5b50610dd86004803603810190610dd39190613642565b612741565b005b610de2612763565b8060128190555050565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610e4757506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610e775750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610e8d906140d6565b80601f0160208091040260200160405190810160405280929190818152602001828054610eb9906140d6565b8015610f065780601f10610edb57610100808354040283529160200191610f06565b820191906000526020600020905b815481529060010190602001808311610ee957829003601f168201915b5050505050905090565b6000610f1b826127e1565b610f51576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610f9a82611cc0565b90508073ffffffffffffffffffffffffffffffffffffffff16610fbb612840565b73ffffffffffffffffffffffffffffffffffffffff161461101e57610fe781610fe2612840565b61258f565b61101d576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6110db612763565b8060118190555050565b6110ed612763565b80600d90805190602001906111039291906131bc565b5050565b6000611111612848565b6001546000540303905090565b60125481565b600b5481565b600061113582612851565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461119c576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806111a88461291f565b915091506111be81876111b9612840565b612946565b61120a576111d3866111ce612840565b61258f565b611209576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611271576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61127e868686600161298a565b801561128957600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061135785611333888887612990565b7c0200000000000000000000000000000000000000000000000000000000176129b8565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841614156113df5760006001850190506000600460008381526020019081526020016000205414156113dd5760005481146113dc578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461144786868660016129e3565b505050505050565b600a5481565b601960009054906101000a900460ff1681565b601960019054906101000a900460ff1681565b611483612763565b600260095414156114c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c090613d83565b60405180910390fd5b600260098190555060006114db611e4a565b73ffffffffffffffffffffffffffffffffffffffff16476040516114fe90613b4d565b60006040518083038185875af1925050503d806000811461153b576040519150601f19603f3d011682016040523d82523d6000602084013e611540565b606091505b505090508061154e57600080fd5b506001600981905550565b60185481565b61157a83838360405180602001604052806000815250612338565b505050565b6060600061158c83611cd2565b905060008167ffffffffffffffff8111156115d0577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156115fe5781602001602082028036833780820191505090505b50905060006001905060005b838110801561161b57506012548211155b156116ca57600061162b83611cc0565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156116b6578284838151811061169b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505081806116b290614139565b9250505b82806116c190614139565b9350505061160a565b82945050505050919050565b6116de612763565b8060178190555050565b6116f0612763565b80600e90805190602001906117069291906131bc565b5050565b601960039054906101000a900460ff1681565b600d805461172a906140d6565b80601f0160208091040260200160405190810160405280929190818152602001828054611756906140d6565b80156117a35780601f10611778576101008083540402835291602001916117a3565b820191906000526020600020905b81548152906001019060200180831161178657829003601f168201915b505050505081565b60165481565b601960029054906101000a900460ff16611800576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f790613d03565b60405180910390fd5b600061180a6129e9565b60405160200161181a9190613b01565b604051602081830303815290604052805190602001209050611880838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600b54836129f1565b6118bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b690613c43565b60405180910390fd5b6000841180156118d157506015548411155b611910576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190790613c83565b60405180910390fd5b6012548461191c611107565b6119269190613f01565b1115611967576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195e90613d23565b60405180910390fd5b6018548461197433611cd2565b61197e9190613f01565b11156119bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b690613ca3565b60405180910390fd5b836011546119cd9190613f88565b341015611a0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0690613da3565b60405180910390fd5b611a20611a1a6129e9565b85612a08565b50505050565b611a2e612763565b80601960016101000a81548160ff02191690831515021790555050565b601960009054906101000a900460ff16611a9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9190613d63565b60405180910390fd5b6000611aa46129e9565b604051602001611ab49190613b01565b604051602081830303815290604052805190602001209050611b1a838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600a54836129f1565b611b59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5090613c43565b60405180910390fd5b600084118015611b6b57506014548411155b611baa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba190613c83565b60405180910390fd5b60125484611bb6611107565b611bc09190613f01565b1115611c01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf890613d23565b60405180910390fd5b60175484611c0e33611cd2565b611c189190613f01565b1115611c59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5090613ca3565b60405180910390fd5b83601054611c679190613f88565b341015611ca9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca090613da3565b60405180910390fd5b611cba611cb46129e9565b85612a08565b50505050565b6000611ccb82612851565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d3a576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611d93612763565b611d9d6000612a26565b565b611da7612763565b60125482611db3611107565b611dbd9190613f01565b1115611dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df590613d23565b60405180910390fd5b611e088183612a08565b5050565b611e14612763565b80601960026101000a81548160ff02191690831515021790555050565b60175481565b601960029054906101000a900460ff1681565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611e7c612763565b80600f8190555050565b60135481565b606060038054611e9b906140d6565b80601f0160208091040260200160405190810160405280929190818152602001828054611ec7906140d6565b8015611f145780601f10611ee957610100808354040283529160200191611f14565b820191906000526020600020905b815481529060010190602001808311611ef757829003601f168201915b5050505050905090565b611f26612763565b80601960006101000a81548160ff02191690831515021790555050565b601960019054906101000a900460ff16611f92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8990613d43565b60405180910390fd5b600081118015611fa457506013548111155b611fe3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fda90613c83565b60405180910390fd5b60125481611fef611107565b611ff99190613f01565b111561203a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203190613d23565b60405180910390fd5b6016548161204733611cd2565b6120519190613f01565b1115612092576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208990613ca3565b60405180910390fd5b80600f546120a09190613f88565b3410156120e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d990613da3565b60405180910390fd5b6120f36120ed6129e9565b82612a08565b50565b600f5481565b612104612840565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612169576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000612176612840565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612223612840565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516122689190613beb565b60405180910390a35050565b61227c612763565b80600a8190555050565b600e8054612293906140d6565b80601f01602080910402602001604051908101604052809291908181526020018280546122bf906140d6565b801561230c5780601f106122e15761010080835404028352916020019161230c565b820191906000526020600020905b8154815290600101906020018083116122ef57829003601f168201915b505050505081565b61231c612763565b8060148190555050565b61232e612763565b8060138190555050565b61234384848461112a565b60008373ffffffffffffffffffffffffffffffffffffffff163b146123a55761236e84848484612aec565b6123a4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6123b3612763565b80600b8190555050565b60606123c8826127e1565b612407576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123fe90613ce3565b60405180910390fd5b60001515601960039054906101000a900460ff16151514156124b557600e8054612430906140d6565b80601f016020809104026020016040519081016040528092919081815260200182805461245c906140d6565b80156124a95780601f1061247e576101008083540402835291602001916124a9565b820191906000526020600020905b81548152906001019060200180831161248c57829003601f168201915b50505050509050612511565b60006124bf612c4c565b905060008151116124df576040518060200160405280600081525061250d565b806124e984612cde565b600d6040516020016124fd93929190613b1c565b6040516020818303038152906040525b9150505b919050565b61251e612763565b8060188190555050565b60155481565b612536612763565b8060108190555050565b612548612763565b8060158190555050565b61255a612763565b8060168190555050565b60105481565b612572612763565b80601960036101000a81548160ff02191690831515021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c8054612630906140d6565b80601f016020809104026020016040519081016040528092919081815260200182805461265c906140d6565b80156126a95780601f1061267e576101008083540402835291602001916126a9565b820191906000526020600020905b81548152906001019060200180831161268c57829003601f168201915b505050505081565b60115481565b60145481565b6126c5612763565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612735576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272c90613c63565b60405180910390fd5b61273e81612a26565b50565b612749612763565b80600c908051906020019061275f9291906131bc565b5050565b61276b6129e9565b73ffffffffffffffffffffffffffffffffffffffff16612789611e4a565b73ffffffffffffffffffffffffffffffffffffffff16146127df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127d690613cc3565b60405180910390fd5b565b6000816127ec612848565b111580156127fb575060005482105b8015612839575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b60008082905080612860612848565b116128e8576000548110156128e75760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821614156128e5575b60008114156128db5760046000836001900393508381526020019081526020016000205490506128b0565b809250505061291a565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86129a7868684612e8b565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b6000826129fe8584612e94565b1490509392505050565b612a22828260405180602001604052806000815250612f10565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b12612840565b8786866040518563ffffffff1660e01b8152600401612b349493929190613b7d565b602060405180830381600087803b158015612b4e57600080fd5b505af1925050508015612b7f57506040513d601f19601f82011682018060405250810190612b7c9190613619565b60015b612bf9573d8060008114612baf576040519150601f19603f3d011682016040523d82523d6000602084013e612bb4565b606091505b50600081511415612bf1576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600c8054612c5b906140d6565b80601f0160208091040260200160405190810160405280929190818152602001828054612c87906140d6565b8015612cd45780601f10612ca957610100808354040283529160200191612cd4565b820191906000526020600020905b815481529060010190602001808311612cb757829003601f168201915b5050505050905090565b60606000821415612d26576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612e86565b600082905060005b60008214612d58578080612d4190614139565b915050600a82612d519190613f57565b9150612d2e565b60008167ffffffffffffffff811115612d9a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612dcc5781602001600182028036833780820191505090505b5090505b60008514612e7f57600182612de59190613fe2565b9150600a85612df491906141a6565b6030612e009190613f01565b60f81b818381518110612e3c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612e789190613f57565b9450612dd0565b8093505050505b919050565b60009392505050565b60008082905060005b8451811015612f0557612ef082868381518110612ee3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151612fad565b91508080612efd90614139565b915050612e9d565b508091505092915050565b612f1a8383612fd8565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612fa857600080549050600083820390505b612f5a6000868380600101945086612aec565b612f90576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612f47578160005414612fa557600080fd5b50505b505050565b6000818310612fc557612fc08284613195565b612fd0565b612fcf8383613195565b5b905092915050565b6000805490506000821415613019576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613026600084838561298a565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061309d8361308e6000866000612990565b613097856131ac565b176129b8565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461313e57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050613103565b50600082141561317a576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081905550505061319060008483856129e3565b505050565b600082600052816020526040600020905092915050565b60006001821460e11b9050919050565b8280546131c8906140d6565b90600052602060002090601f0160209004810192826131ea5760008555613231565b82601f1061320357805160ff1916838001178555613231565b82800160010185558215613231579182015b82811115613230578251825591602001919060010190613215565b5b50905061323e9190613242565b5090565b5b8082111561325b576000816000905550600101613243565b5090565b600061327261326d84613e03565b613dde565b90508281526020810184848401111561328a57600080fd5b613295848285614094565b509392505050565b60006132b06132ab84613e34565b613dde565b9050828152602081018484840111156132c857600080fd5b6132d3848285614094565b509392505050565b6000813590506132ea816144ec565b92915050565b60008083601f84011261330257600080fd5b8235905067ffffffffffffffff81111561331b57600080fd5b60208301915083602082028301111561333357600080fd5b9250929050565b60008135905061334981614503565b92915050565b60008135905061335e8161451a565b92915050565b60008135905061337381614531565b92915050565b60008151905061338881614531565b92915050565b600082601f83011261339f57600080fd5b81356133af84826020860161325f565b91505092915050565b600082601f8301126133c957600080fd5b81356133d984826020860161329d565b91505092915050565b6000813590506133f181614548565b92915050565b60006020828403121561340957600080fd5b6000613417848285016132db565b91505092915050565b6000806040838503121561343357600080fd5b6000613441858286016132db565b9250506020613452858286016132db565b9150509250929050565b60008060006060848603121561347157600080fd5b600061347f868287016132db565b9350506020613490868287016132db565b92505060406134a1868287016133e2565b9150509250925092565b600080600080608085870312156134c157600080fd5b60006134cf878288016132db565b94505060206134e0878288016132db565b93505060406134f1878288016133e2565b925050606085013567ffffffffffffffff81111561350e57600080fd5b61351a8782880161338e565b91505092959194509250565b6000806040838503121561353957600080fd5b6000613547858286016132db565b92505060206135588582860161333a565b9150509250929050565b6000806040838503121561357557600080fd5b6000613583858286016132db565b9250506020613594858286016133e2565b9150509250929050565b6000602082840312156135b057600080fd5b60006135be8482850161333a565b91505092915050565b6000602082840312156135d957600080fd5b60006135e78482850161334f565b91505092915050565b60006020828403121561360257600080fd5b600061361084828501613364565b91505092915050565b60006020828403121561362b57600080fd5b600061363984828501613379565b91505092915050565b60006020828403121561365457600080fd5b600082013567ffffffffffffffff81111561366e57600080fd5b61367a848285016133b8565b91505092915050565b60006020828403121561369557600080fd5b60006136a3848285016133e2565b91505092915050565b600080604083850312156136bf57600080fd5b60006136cd858286016133e2565b92505060206136de858286016132db565b9150509250929050565b6000806000604084860312156136fd57600080fd5b600061370b868287016133e2565b935050602084013567ffffffffffffffff81111561372857600080fd5b613734868287016132f0565b92509250509250925092565b600061374c8383613ae3565b60208301905092915050565b61376181614016565b82525050565b61377861377382614016565b614182565b82525050565b600061378982613e8a565b6137938185613eb8565b935061379e83613e65565b8060005b838110156137cf5781516137b68882613740565b97506137c183613eab565b9250506001810190506137a2565b5085935050505092915050565b6137e581614028565b82525050565b6137f481614034565b82525050565b600061380582613e95565b61380f8185613ec9565b935061381f8185602086016140a3565b61382881614293565b840191505092915050565b600061383e82613ea0565b6138488185613ee5565b93506138588185602086016140a3565b61386181614293565b840191505092915050565b600061387782613ea0565b6138818185613ef6565b93506138918185602086016140a3565b80840191505092915050565b600081546138aa816140d6565b6138b48186613ef6565b945060018216600081146138cf57600181146138e057613913565b60ff19831686528186019350613913565b6138e985613e75565b60005b8381101561390b578154818901526001820191506020810190506138ec565b838801955050505b50505092915050565b6000613929600e83613ee5565b9150613934826142b1565b602082019050919050565b600061394c602683613ee5565b9150613957826142da565b604082019050919050565b600061396f601483613ee5565b915061397a82614329565b602082019050919050565b6000613992601d83613ee5565b915061399d82614352565b602082019050919050565b60006139b5602083613ee5565b91506139c08261437b565b602082019050919050565b60006139d8602f83613ee5565b91506139e3826143a4565b604082019050919050565b60006139fb601583613ee5565b9150613a06826143f3565b602082019050919050565b6000613a1e600083613eda565b9150613a298261441c565b600082019050919050565b6000613a41601483613ee5565b9150613a4c8261441f565b602082019050919050565b6000613a64601983613ee5565b9150613a6f82614448565b602082019050919050565b6000613a87601583613ee5565b9150613a9282614471565b602082019050919050565b6000613aaa601f83613ee5565b9150613ab58261449a565b602082019050919050565b6000613acd601383613ee5565b9150613ad8826144c3565b602082019050919050565b613aec8161408a565b82525050565b613afb8161408a565b82525050565b6000613b0d8284613767565b60148201915081905092915050565b6000613b28828661386c565b9150613b34828561386c565b9150613b40828461389d565b9150819050949350505050565b6000613b5882613a11565b9150819050919050565b6000602082019050613b776000830184613758565b92915050565b6000608082019050613b926000830187613758565b613b9f6020830186613758565b613bac6040830185613af2565b8181036060830152613bbe81846137fa565b905095945050505050565b60006020820190508181036000830152613be3818461377e565b905092915050565b6000602082019050613c0060008301846137dc565b92915050565b6000602082019050613c1b60008301846137eb565b92915050565b60006020820190508181036000830152613c3b8184613833565b905092915050565b60006020820190508181036000830152613c5c8161391c565b9050919050565b60006020820190508181036000830152613c7c8161393f565b9050919050565b60006020820190508181036000830152613c9c81613962565b9050919050565b60006020820190508181036000830152613cbc81613985565b9050919050565b60006020820190508181036000830152613cdc816139a8565b9050919050565b60006020820190508181036000830152613cfc816139cb565b9050919050565b60006020820190508181036000830152613d1c816139ee565b9050919050565b60006020820190508181036000830152613d3c81613a34565b9050919050565b60006020820190508181036000830152613d5c81613a57565b9050919050565b60006020820190508181036000830152613d7c81613a7a565b9050919050565b60006020820190508181036000830152613d9c81613a9d565b9050919050565b60006020820190508181036000830152613dbc81613ac0565b9050919050565b6000602082019050613dd86000830184613af2565b92915050565b6000613de8613df9565b9050613df48282614108565b919050565b6000604051905090565b600067ffffffffffffffff821115613e1e57613e1d614264565b5b613e2782614293565b9050602081019050919050565b600067ffffffffffffffff821115613e4f57613e4e614264565b5b613e5882614293565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613f0c8261408a565b9150613f178361408a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613f4c57613f4b6141d7565b5b828201905092915050565b6000613f628261408a565b9150613f6d8361408a565b925082613f7d57613f7c614206565b5b828204905092915050565b6000613f938261408a565b9150613f9e8361408a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613fd757613fd66141d7565b5b828202905092915050565b6000613fed8261408a565b9150613ff88361408a565b92508282101561400b5761400a6141d7565b5b828203905092915050565b60006140218261406a565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156140c15780820151818401526020810190506140a6565b838111156140d0576000848401525b50505050565b600060028204905060018216806140ee57607f821691505b6020821081141561410257614101614235565b5b50919050565b61411182614293565b810181811067ffffffffffffffff821117156141305761412f614264565b5b80604052505050565b60006141448261408a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614177576141766141d7565b5b600182019050919050565b600061418d82614194565b9050919050565b600061419f826142a4565b9050919050565b60006141b18261408a565b91506141bc8361408a565b9250826141cc576141cb614206565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f496e76616c69642070726f6f6621000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b7f4d6178206d696e74207065722077616c6c657420657863656564656421000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f546865204f6753616c6520697320706175736564210000000000000000000000600082015250565b50565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b7f546865205075626c696353616c65206973207061757365642100000000000000600082015250565b7f54686520576c53616c6520697320706175736564210000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b6144f581614016565b811461450057600080fd5b50565b61450c81614028565b811461451757600080fd5b50565b61452381614034565b811461452e57600080fd5b50565b61453a8161403e565b811461454557600080fd5b50565b6145518161408a565b811461455c57600080fd5b5056fea26469706673582212200cb1cc2f0ad17f0c3b1b2e2c4cd4ffeb77f94c31d3bc65edc3dec43ad008a18464736f6c63430008040033
Deployed Bytecode Sourcemap
69044:8526:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75680:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36106:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37008:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43491:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42932:400;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75481:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73367:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32759:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69809:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69257:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47198:2817;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69227:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70263:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70301:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75889:150;;;;;;;;;;;;;:::i;:::-;;70182:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50111:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76099:647;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74964:134;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73509:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70465:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69401:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70097:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70654:773;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73705:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71433:778;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38401:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33943:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14357:103;;;;;;;;;;;;;:::i;:::-;;72823:202;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73912:79;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70139:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70336:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13709:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75303:78;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69909:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37184:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73806:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72217:566;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69649:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44049:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74059:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69494:101;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74480:138;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74344:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50894:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74169:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76959:445;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75106:134;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69996:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75387:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74624:138;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74832:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69688:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73081:81;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44514:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69379:17;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69728:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69952:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14615:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73220:76;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75680:102;13595:13;:11;:13::i;:::-;75764:12:::1;75750:11;:26;;;;75680:102:::0;:::o;36106:639::-;36191:4;36530:10;36515:25;;:11;:25;;;;:102;;;;36607:10;36592:25;;:11;:25;;;;36515:102;:179;;;;36684:10;36669:25;;:11;:25;;;;36515:179;36495:199;;36106:639;;;:::o;37008:100::-;37062:13;37095:5;37088:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37008:100;:::o;43491:218::-;43567:7;43592:16;43600:7;43592;:16::i;:::-;43587:64;;43617:34;;;;;;;;;;;;;;43587:64;43671:15;:24;43687:7;43671:24;;;;;;;;;;;:30;;;;;;;;;;;;43664:37;;43491:218;;;:::o;42932:400::-;43013:13;43029:16;43037:7;43029;:16::i;:::-;43013:32;;43085:5;43062:28;;:19;:17;:19::i;:::-;:28;;;43058:175;;43110:44;43127:5;43134:19;:17;:19::i;:::-;43110:16;:44::i;:::-;43105:128;;43182:35;;;;;;;;;;;;;;43105:128;43058:175;43278:2;43245:15;:24;43261:7;43245:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;43316:7;43312:2;43296:28;;43305:5;43296:28;;;;;;;;;;;;42932:400;;;:::o;75481:86::-;13595:13;:11;:13::i;:::-;75553:8:::1;75543:7;:18;;;;75481:86:::0;:::o;73367:100::-;13595:13;:11;:13::i;:::-;73451:10:::1;73439:9;:22;;;;;;;;;;;;:::i;:::-;;73367:100:::0;:::o;32759:323::-;32820:7;33048:15;:13;:15::i;:::-;33033:12;;33017:13;;:28;:46;33010:53;;32759:323;:::o;69809:33::-;;;;:::o;69257:27::-;;;;:::o;47198:2817::-;47332:27;47362;47381:7;47362:18;:27::i;:::-;47332:57;;47447:4;47406:45;;47422:19;47406:45;;;47402:86;;47460:28;;;;;;;;;;;;;;47402:86;47502:27;47531:23;47558:35;47585:7;47558:26;:35::i;:::-;47501:92;;;;47693:68;47718:15;47735:4;47741:19;:17;:19::i;:::-;47693:24;:68::i;:::-;47688:180;;47781:43;47798:4;47804:19;:17;:19::i;:::-;47781:16;:43::i;:::-;47776:92;;47833:35;;;;;;;;;;;;;;47776:92;47688:180;47899:1;47885:16;;:2;:16;;;47881:52;;;47910:23;;;;;;;;;;;;;;47881:52;47946:43;47968:4;47974:2;47978:7;47987:1;47946:21;:43::i;:::-;48082:15;48079:2;;;48222:1;48201:19;48194:30;48079:2;48619:18;:24;48638:4;48619:24;;;;;;;;;;;;;;;;48617:26;;;;;;;;;;;;48688:18;:22;48707:2;48688:22;;;;;;;;;;;;;;;;48686:24;;;;;;;;;;;49010:146;49047:2;49096:45;49111:4;49117:2;49121:19;49096:14;:45::i;:::-;29158:8;49068:73;49010:18;:146::i;:::-;48981:17;:26;48999:7;48981:26;;;;;;;;;;;:175;;;;49327:1;29158:8;49276:19;:47;:52;49272:627;;;49349:19;49381:1;49371:7;:11;49349:33;;49538:1;49504:17;:30;49522:11;49504:30;;;;;;;;;;;;:35;49500:384;;;49642:13;;49627:11;:28;49623:242;;49822:19;49789:17;:30;49807:11;49789:30;;;;;;;;;;;:52;;;;49623:242;49500:384;49272:627;;49946:7;49942:2;49927:27;;49936:4;49927:27;;;;;;;;;;;;49965:42;49986:4;49992:2;49996:7;50005:1;49965:20;:42::i;:::-;47198:2817;;;;;;:::o;69227:25::-;;;;:::o;70263:33::-;;;;;;;;;;;;;:::o;70301:30::-;;;;;;;;;;;;;:::o;75889:150::-;13595:13;:11;:13::i;:::-;1909:1:::1;2507:7;;:19;;2499:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1909:1;2640:7;:18;;;;75947:7:::2;75968;:5;:7::i;:::-;75960:21;;75989;75960:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75946:69;;;76030:2;76022:11;;;::::0;::::2;;2671:1;1865::::1;2819:7;:22;;;;75889:150::o:0;70182:38::-;;;;:::o;50111:185::-;50249:39;50266:4;50272:2;50276:7;50249:39;;;;;;;;;;;;:16;:39::i;:::-;50111:185;;;:::o;76099:647::-;76159:16;76186:23;76212:17;76222:6;76212:9;:17::i;:::-;76186:43;;76238:30;76285:15;76271:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76238:63;;76310:22;76335:1;76310:26;;76345:23;76383:327;76408:15;76390;:33;:66;;;;;76445:11;;76427:14;:29;;76390:66;76383:327;;;76469:25;76497:23;76505:14;76497:7;:23::i;:::-;76469:51;;76558:6;76537:27;;:17;:27;;;76533:141;;;76614:14;76581:13;76595:15;76581:30;;;;;;;;;;;;;;;;;;;;;:47;;;;;76645:17;;;;;:::i;:::-;;;;76533:141;76684:16;;;;;:::i;:::-;;;;76383:327;;;;76725:13;76718:20;;;;;;76099:647;;;:::o;74964:134::-;13595:13;:11;:13::i;:::-;75072:20:::1;75050:19;:42;;;;74964:134:::0;:::o;73509:132::-;13595:13;:11;:13::i;:::-;73617:18:::1;73597:17;:38;;;;;;;;;;;;:::i;:::-;;73509:132:::0;:::o;70465:28::-;;;;;;;;;;;;;:::o;69401:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;70097:37::-;;;;:::o;70654:773::-;70787:6;;;;;;;;;;;70779:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;70826:12;70868;:10;:12::i;:::-;70851:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;70841:41;;;;;;70826:56;;70897:52;70916:12;;70897:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70930:12;;70944:4;70897:18;:52::i;:::-;70889:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;71030:1;71016:11;:15;:54;;;;;71050:20;;71035:11;:35;;71016:54;71008:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;71141:11;;71126;71110:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:42;;71102:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;71231:19;;71216:11;71192:21;71202:10;71192:9;:21::i;:::-;:35;;;;:::i;:::-;:58;;71184:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;71322:11;71312:7;;:21;;;;:::i;:::-;71299:9;:34;;71291:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;71385:36;71395:12;:10;:12::i;:::-;71409:11;71385:9;:36::i;:::-;70654:773;;;;:::o;73705:95::-;13595:13;:11;:13::i;:::-;73783:11:::1;73770:10;;:24;;;;;;;;;;;;;;;;;;73705:95:::0;:::o;71433:778::-;71566:13;;;;;;;;;;;71558:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;71612:12;71654;:10;:12::i;:::-;71637:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;71627:41;;;;;;71612:56;;71683:50;71702:12;;71683:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71716:10;;71728:4;71683:18;:50::i;:::-;71675:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;71814:1;71800:11;:15;:54;;;;;71834:20;;71819:11;:35;;71800:54;71792:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;71925:11;;71910;71894:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:42;;71886:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;72015:19;;72000:11;71976:21;71986:10;71976:9;:21::i;:::-;:35;;;;:::i;:::-;:58;;71968:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;72106:11;72096:7;;:21;;;;:::i;:::-;72083:9;:34;;72075:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;72169:36;72179:12;:10;:12::i;:::-;72193:11;72169:9;:36::i;:::-;71433:778;;;;:::o;38401:152::-;38473:7;38516:27;38535:7;38516:18;:27::i;:::-;38493:52;;38401:152;;;:::o;33943:233::-;34015:7;34056:1;34039:19;;:5;:19;;;34035:60;;;34067:28;;;;;;;;;;;;;;34035:60;28102:13;34113:18;:25;34132:5;34113:25;;;;;;;;;;;;;;;;:55;34106:62;;33943:233;;;:::o;14357:103::-;13595:13;:11;:13::i;:::-;14422:30:::1;14449:1;14422:18;:30::i;:::-;14357:103::o:0;72823:202::-;13595:13;:11;:13::i;:::-;72943:11:::1;;72928;72912:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:42;;72904:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;72986:33;72996:9;73007:11;72986:9;:33::i;:::-;72823:202:::0;;:::o;73912:79::-;13595:13;:11;:13::i;:::-;73978:7:::1;73969:6;;:16;;;;;;;;;;;;;;;;;;73912:79:::0;:::o;70139:38::-;;;;:::o;70336:26::-;;;;;;;;;;;;;:::o;13709:87::-;13755:7;13782:6;;;;;;;;;;;13775:13;;13709:87;:::o;75303:78::-;13595:13;:11;:13::i;:::-;75369:6:::1;75361:5;:14;;;;75303:78:::0;:::o;69909:38::-;;;;:::o;37184:104::-;37240:13;37273:7;37266:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37184:104;:::o;73806:100::-;13595:13;:11;:13::i;:::-;73886:14:::1;73870:13;;:30;;;;;;;;;;;;;;;;;;73806:100:::0;:::o;72217:566::-;72323:10;;;;;;;;;;;72315:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;72392:1;72378:11;:15;:52;;;;;72412:18;;72397:11;:33;;72378:52;72370:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;72501:11;;72486;72470:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:42;;72462:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;72591:17;;72576:11;72552:21;72562:10;72552:9;:21::i;:::-;:35;;;;:::i;:::-;:56;;72544:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;72678:11;72670:5;;:19;;;;:::i;:::-;72657:9;:32;;72649:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;72741:36;72751:12;:10;:12::i;:::-;72765:11;72741:9;:36::i;:::-;72217:566;:::o;69649:34::-;;;;:::o;44049:308::-;44160:19;:17;:19::i;:::-;44148:31;;:8;:31;;;44144:61;;;44188:17;;;;;;;;;;;;;;44144:61;44270:8;44218:18;:39;44237:19;:17;:19::i;:::-;44218:39;;;;;;;;;;;;;;;:49;44258:8;44218:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;44330:8;44294:55;;44309:19;:17;:19::i;:::-;44294:55;;;44340:8;44294:55;;;;;;:::i;:::-;;;;;;;;44049:308;;:::o;74059:104::-;13595:13;:11;:13::i;:::-;74146:11:::1;74133:10;:24;;;;74059:104:::0;:::o;69494:101::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;74480:138::-;13595:13;:11;:13::i;:::-;74591:21:::1;74568:20;:44;;;;74480:138:::0;:::o;74344:130::-;13595:13;:11;:13::i;:::-;74449:19:::1;74428:18;:40;;;;74344:130:::0;:::o;50894:399::-;51061:31;51074:4;51080:2;51084:7;51061:12;:31::i;:::-;51125:1;51107:2;:14;;;:19;51103:183;;51146:56;51177:4;51183:2;51187:7;51196:5;51146:30;:56::i;:::-;51141:145;;51230:40;;;;;;;;;;;;;;51141:145;51103:183;50894:399;;;;:::o;74169:110::-;13595:13;:11;:13::i;:::-;74260::::1;74245:12;:28;;;;74169:110:::0;:::o;76959:445::-;77033:13;77063:17;77071:8;77063:7;:17::i;:::-;77055:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;77157:5;77145:17;;:8;;;;;;;;;;;:17;;;77141:64;;;77180:17;77173:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77141:64;77213:28;77244:10;:8;:10::i;:::-;77213:41;;77299:1;77274:14;77268:28;:32;:130;;;;;;;;;;;;;;;;;77336:14;77352:19;:8;:17;:19::i;:::-;77373:9;77319:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;77268:130;77261:137;;;76959:445;;;;:::o;75106:134::-;13595:13;:11;:13::i;:::-;75214:20:::1;75192:19;:42;;;;75106:134:::0;:::o;69996:39::-;;;;:::o;75387:86::-;13595:13;:11;:13::i;:::-;75459:8:::1;75449:7;:18;;;;75387:86:::0;:::o;74624:138::-;13595:13;:11;:13::i;:::-;74735:21:::1;74712:20;:44;;;;74624:138:::0;:::o;74832:126::-;13595:13;:11;:13::i;:::-;74934:18:::1;74914:17;:38;;;;74832:126:::0;:::o;69688:35::-;;;;:::o;73081:81::-;13595:13;:11;:13::i;:::-;73150:6:::1;73139:8;;:17;;;;;;;;;;;;;;;;;;73081:81:::0;:::o;44514:164::-;44611:4;44635:18;:25;44654:5;44635:25;;;;;;;;;;;;;;;:35;44661:8;44635:35;;;;;;;;;;;;;;;;;;;;;;;;;44628:42;;44514:164;;;;:::o;69379:17::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;69728:32::-;;;;:::o;69952:39::-;;;;:::o;14615:201::-;13595:13;:11;:13::i;:::-;14724:1:::1;14704:22;;:8;:22;;;;14696:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;14780:28;14799:8;14780:18;:28::i;:::-;14615:201:::0;:::o;73220:76::-;13595:13;:11;:13::i;:::-;73286:4:::1;73280:3;:10;;;;;;;;;;;;:::i;:::-;;73220:76:::0;:::o;13874:132::-;13949:12;:10;:12::i;:::-;13938:23;;:7;:5;:7::i;:::-;:23;;;13930:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13874:132::o;44936:282::-;45001:4;45057:7;45038:15;:13;:15::i;:::-;:26;;:66;;;;;45091:13;;45081:7;:23;45038:66;:153;;;;;45190:1;28878:8;45142:17;:26;45160:7;45142:26;;;;;;;;;;;;:44;:49;45038:153;45018:173;;44936:282;;;:::o;66702:105::-;66762:7;66789:10;66782:17;;66702:105;:::o;76802:95::-;76867:7;76890:1;76883:8;;76802:95;:::o;39556:1275::-;39623:7;39643:12;39658:7;39643:22;;39726:4;39707:15;:13;:15::i;:::-;:23;39703:1061;;39760:13;;39753:4;:20;39749:1015;;;39798:14;39815:17;:23;39833:4;39815:23;;;;;;;;;;;;39798:40;;39932:1;28878:8;39904:6;:24;:29;39900:845;;;40569:113;40586:1;40576:6;:11;40569:113;;;40629:17;:25;40647:6;;;;;;;40629:25;;;;;;;;;;;;40620:34;;40569:113;;;40715:6;40708:13;;;;;;39900:845;39749:1015;;39703:1061;40792:31;;;;;;;;;;;;;;39556:1275;;;;:::o;46099:479::-;46201:27;46230:23;46271:38;46312:15;:24;46328:7;46312:24;;;;;;;;;;;46271:65;;46483:18;46460:41;;46540:19;46534:26;46515:45;;46445:126;;;;:::o;45327:659::-;45476:11;45641:16;45634:5;45630:28;45621:37;;45801:16;45790:9;45786:32;45773:45;;45951:15;45940:9;45937:30;45929:5;45918:9;45915:20;45912:56;45902:66;;45509:470;;;;;:::o;51955:159::-;;;;;:::o;66011:311::-;66146:7;66166:16;29282:3;66192:19;:41;;66166:68;;29282:3;66260:31;66271:4;66277:2;66281:9;66260:10;:31::i;:::-;66252:40;;:62;;66245:69;;;66011:311;;;;;:::o;41379:450::-;41459:14;41627:16;41620:5;41616:28;41607:37;;41804:5;41790:11;41765:23;41761:41;41758:52;41751:5;41748:63;41738:73;;41495:327;;;;:::o;52779:158::-;;;;;:::o;12260:98::-;12313:7;12340:10;12333:17;;12260:98;:::o;4075:190::-;4200:4;4253;4224:25;4237:5;4244:4;4224:12;:25::i;:::-;:33;4217:40;;4075:190;;;;;:::o;60534:112::-;60611:27;60621:2;60625:8;60611:27;;;;;;;;;;;;:9;:27::i;:::-;60534:112;;:::o;14976:191::-;15050:16;15069:6;;;;;;;;;;;15050:25;;15095:8;15086:6;;:17;;;;;;;;;;;;;;;;;;15150:8;15119:40;;15140:8;15119:40;;;;;;;;;;;;14976:191;;:::o;53377:716::-;53540:4;53586:2;53561:45;;;53607:19;:17;:19::i;:::-;53628:4;53634:7;53643:5;53561:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;53557:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53861:1;53844:6;:13;:18;53840:235;;;53890:40;;;;;;;;;;;;;;53840:235;54033:6;54027:13;54018:6;54014:2;54010:15;54003:38;53557:529;53730:54;;;53720:64;;;:6;:64;;;;53713:71;;;53377:716;;;;;;:::o;77469:98::-;77529:13;77558:3;77551:10;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77469:98;:::o;15604:723::-;15660:13;15890:1;15881:5;:10;15877:53;;;15908:10;;;;;;;;;;;;;;;;;;;;;15877:53;15940:12;15955:5;15940:20;;15971:14;15996:78;16011:1;16003:4;:9;15996:78;;16029:8;;;;;:::i;:::-;;;;16060:2;16052:10;;;;;:::i;:::-;;;15996:78;;;16084:19;16116:6;16106:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16084:39;;16134:154;16150:1;16141:5;:10;16134:154;;16178:1;16168:11;;;;;:::i;:::-;;;16245:2;16237:5;:10;;;;:::i;:::-;16224:2;:24;;;;:::i;:::-;16211:39;;16194:6;16201;16194:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;16274:2;16265:11;;;;;:::i;:::-;;;16134:154;;;16312:6;16298:21;;;;;15604:723;;;;:::o;65712:147::-;65849:6;65712:147;;;;;:::o;4942:296::-;5025:7;5045:20;5068:4;5045:27;;5088:9;5083:118;5107:5;:12;5103:1;:16;5083:118;;;5156:33;5166:12;5180:5;5186:1;5180:8;;;;;;;;;;;;;;;;;;;;;;5156:9;:33::i;:::-;5141:48;;5121:3;;;;;:::i;:::-;;;;5083:118;;;;5218:12;5211:19;;;4942:296;;;;:::o;59761:689::-;59892:19;59898:2;59902:8;59892:5;:19::i;:::-;59971:1;59953:2;:14;;;:19;59949:483;;59993:11;60007:13;;59993:27;;60039:13;60061:8;60055:3;:14;60039:30;;60088:233;60119:62;60158:1;60162:2;60166:7;;;;;;60175:5;60119:30;:62::i;:::-;60114:167;;60217:40;;;;;;;;;;;;;;60114:167;60316:3;60308:5;:11;60088:233;;60403:3;60386:13;;:20;60382:34;;60408:8;;;60382:34;59949:483;;;59761:689;;;:::o;11149:149::-;11212:7;11243:1;11239;:5;:51;;11270:20;11285:1;11288;11270:14;:20::i;:::-;11239:51;;;11247:20;11262:1;11265;11247:14;:20::i;:::-;11239:51;11232:58;;11149:149;;;;:::o;54555:2454::-;54628:20;54651:13;;54628:36;;54691:1;54679:8;:13;54675:44;;;54701:18;;;;;;;;;;;;;;54675:44;54732:61;54762:1;54766:2;54770:12;54784:8;54732:21;:61::i;:::-;55276:1;28240:2;55246:1;:26;;55245:32;55233:8;:45;55207:18;:22;55226:2;55207:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;55555:139;55592:2;55646:33;55669:1;55673:2;55677:1;55646:14;:33::i;:::-;55613:30;55634:8;55613:20;:30::i;:::-;:66;55555:18;:139::i;:::-;55521:17;:31;55539:12;55521:31;;;;;;;;;;;:173;;;;55711:16;55742:11;55771:8;55756:12;:23;55742:37;;56026:16;56022:2;56018:25;56006:37;;56398:12;56358:8;56317:1;56255:25;56196:1;56135;56108:335;56523:1;56509:12;56505:20;56463:346;56564:3;56555:7;56552:16;56463:346;;56782:7;56772:8;56769:1;56742:25;56739:1;56736;56731:59;56617:1;56608:7;56604:15;56593:26;;56463:346;;;56467:77;56854:1;56842:8;:13;56838:45;;;56864:19;;;;;;;;;;;;;;56838:45;56916:3;56900:13;:19;;;;54555:2454;;56941:60;56970:1;56974:2;56978:12;56992:8;56941:20;:60::i;:::-;54555:2454;;;:::o;11306:268::-;11374:13;11481:1;11475:4;11468:15;11510:1;11504:4;11497:15;11551:4;11545;11535:21;11526:30;;11453:114;;;;:::o;41931:324::-;42001:14;42234:1;42224:8;42221:15;42195:24;42191:46;42181:56;;42103:145;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;869:367::-;942:8;952:6;1002:3;995:4;987:6;983:17;979:27;969:2;;1020:1;1017;1010:12;969:2;1056:6;1043:20;1033:30;;1086:18;1078:6;1075:30;1072:2;;;1118:1;1115;1108:12;1072:2;1155:4;1147:6;1143:17;1131:29;;1209:3;1201:4;1193:6;1189:17;1179:8;1175:32;1172:41;1169:2;;;1226:1;1223;1216:12;1169:2;959:277;;;;;:::o;1242:133::-;1285:5;1323:6;1310:20;1301:29;;1339:30;1363:5;1339:30;:::i;:::-;1291:84;;;;:::o;1381:139::-;1427:5;1465:6;1452:20;1443:29;;1481:33;1508:5;1481:33;:::i;:::-;1433:87;;;;:::o;1526:137::-;1571:5;1609:6;1596:20;1587:29;;1625:32;1651:5;1625:32;:::i;:::-;1577:86;;;;:::o;1669:141::-;1725:5;1756:6;1750:13;1741:22;;1772:32;1798:5;1772:32;:::i;:::-;1731:79;;;;:::o;1829:271::-;1884:5;1933:3;1926:4;1918:6;1914:17;1910:27;1900:2;;1951:1;1948;1941:12;1900:2;1991:6;1978:20;2016:78;2090:3;2082:6;2075:4;2067:6;2063:17;2016:78;:::i;:::-;2007:87;;1890:210;;;;;:::o;2120:273::-;2176:5;2225:3;2218:4;2210:6;2206:17;2202:27;2192:2;;2243:1;2240;2233:12;2192:2;2283:6;2270:20;2308:79;2383:3;2375:6;2368:4;2360:6;2356:17;2308:79;:::i;:::-;2299:88;;2182:211;;;;;:::o;2399:139::-;2445:5;2483:6;2470:20;2461:29;;2499:33;2526:5;2499:33;:::i;:::-;2451:87;;;;:::o;2544:262::-;2603:6;2652:2;2640:9;2631:7;2627:23;2623:32;2620:2;;;2668:1;2665;2658:12;2620:2;2711:1;2736:53;2781:7;2772:6;2761:9;2757:22;2736:53;:::i;:::-;2726:63;;2682:117;2610:196;;;;:::o;2812:407::-;2880:6;2888;2937:2;2925:9;2916:7;2912:23;2908:32;2905:2;;;2953:1;2950;2943:12;2905:2;2996:1;3021:53;3066:7;3057:6;3046:9;3042:22;3021:53;:::i;:::-;3011:63;;2967:117;3123:2;3149:53;3194:7;3185:6;3174:9;3170:22;3149:53;:::i;:::-;3139:63;;3094:118;2895:324;;;;;:::o;3225:552::-;3302:6;3310;3318;3367:2;3355:9;3346:7;3342:23;3338:32;3335:2;;;3383:1;3380;3373:12;3335:2;3426:1;3451:53;3496:7;3487:6;3476:9;3472:22;3451:53;:::i;:::-;3441:63;;3397:117;3553:2;3579:53;3624:7;3615:6;3604:9;3600:22;3579:53;:::i;:::-;3569:63;;3524:118;3681:2;3707:53;3752:7;3743:6;3732:9;3728:22;3707:53;:::i;:::-;3697:63;;3652:118;3325:452;;;;;:::o;3783:809::-;3878:6;3886;3894;3902;3951:3;3939:9;3930:7;3926:23;3922:33;3919:2;;;3968:1;3965;3958:12;3919:2;4011:1;4036:53;4081:7;4072:6;4061:9;4057:22;4036:53;:::i;:::-;4026:63;;3982:117;4138:2;4164:53;4209:7;4200:6;4189:9;4185:22;4164:53;:::i;:::-;4154:63;;4109:118;4266:2;4292:53;4337:7;4328:6;4317:9;4313:22;4292:53;:::i;:::-;4282:63;;4237:118;4422:2;4411:9;4407:18;4394:32;4453:18;4445:6;4442:30;4439:2;;;4485:1;4482;4475:12;4439:2;4513:62;4567:7;4558:6;4547:9;4543:22;4513:62;:::i;:::-;4503:72;;4365:220;3909:683;;;;;;;:::o;4598:401::-;4663:6;4671;4720:2;4708:9;4699:7;4695:23;4691:32;4688:2;;;4736:1;4733;4726:12;4688:2;4779:1;4804:53;4849:7;4840:6;4829:9;4825:22;4804:53;:::i;:::-;4794:63;;4750:117;4906:2;4932:50;4974:7;4965:6;4954:9;4950:22;4932:50;:::i;:::-;4922:60;;4877:115;4678:321;;;;;:::o;5005:407::-;5073:6;5081;5130:2;5118:9;5109:7;5105:23;5101:32;5098:2;;;5146:1;5143;5136:12;5098:2;5189:1;5214:53;5259:7;5250:6;5239:9;5235:22;5214:53;:::i;:::-;5204:63;;5160:117;5316:2;5342:53;5387:7;5378:6;5367:9;5363:22;5342:53;:::i;:::-;5332:63;;5287:118;5088:324;;;;;:::o;5418:256::-;5474:6;5523:2;5511:9;5502:7;5498:23;5494:32;5491:2;;;5539:1;5536;5529:12;5491:2;5582:1;5607:50;5649:7;5640:6;5629:9;5625:22;5607:50;:::i;:::-;5597:60;;5553:114;5481:193;;;;:::o;5680:262::-;5739:6;5788:2;5776:9;5767:7;5763:23;5759:32;5756:2;;;5804:1;5801;5794:12;5756:2;5847:1;5872:53;5917:7;5908:6;5897:9;5893:22;5872:53;:::i;:::-;5862:63;;5818:117;5746:196;;;;:::o;5948:260::-;6006:6;6055:2;6043:9;6034:7;6030:23;6026:32;6023:2;;;6071:1;6068;6061:12;6023:2;6114:1;6139:52;6183:7;6174:6;6163:9;6159:22;6139:52;:::i;:::-;6129:62;;6085:116;6013:195;;;;:::o;6214:282::-;6283:6;6332:2;6320:9;6311:7;6307:23;6303:32;6300:2;;;6348:1;6345;6338:12;6300:2;6391:1;6416:63;6471:7;6462:6;6451:9;6447:22;6416:63;:::i;:::-;6406:73;;6362:127;6290:206;;;;:::o;6502:375::-;6571:6;6620:2;6608:9;6599:7;6595:23;6591:32;6588:2;;;6636:1;6633;6626:12;6588:2;6707:1;6696:9;6692:17;6679:31;6737:18;6729:6;6726:30;6723:2;;;6769:1;6766;6759:12;6723:2;6797:63;6852:7;6843:6;6832:9;6828:22;6797:63;:::i;:::-;6787:73;;6650:220;6578:299;;;;:::o;6883:262::-;6942:6;6991:2;6979:9;6970:7;6966:23;6962:32;6959:2;;;7007:1;7004;6997:12;6959:2;7050:1;7075:53;7120:7;7111:6;7100:9;7096:22;7075:53;:::i;:::-;7065:63;;7021:117;6949:196;;;;:::o;7151:407::-;7219:6;7227;7276:2;7264:9;7255:7;7251:23;7247:32;7244:2;;;7292:1;7289;7282:12;7244:2;7335:1;7360:53;7405:7;7396:6;7385:9;7381:22;7360:53;:::i;:::-;7350:63;;7306:117;7462:2;7488:53;7533:7;7524:6;7513:9;7509:22;7488:53;:::i;:::-;7478:63;;7433:118;7234:324;;;;;:::o;7564:570::-;7659:6;7667;7675;7724:2;7712:9;7703:7;7699:23;7695:32;7692:2;;;7740:1;7737;7730:12;7692:2;7783:1;7808:53;7853:7;7844:6;7833:9;7829:22;7808:53;:::i;:::-;7798:63;;7754:117;7938:2;7927:9;7923:18;7910:32;7969:18;7961:6;7958:30;7955:2;;;8001:1;7998;7991:12;7955:2;8037:80;8109:7;8100:6;8089:9;8085:22;8037:80;:::i;:::-;8019:98;;;;7881:246;7682:452;;;;;:::o;8140:179::-;8209:10;8230:46;8272:3;8264:6;8230:46;:::i;:::-;8308:4;8303:3;8299:14;8285:28;;8220:99;;;;:::o;8325:118::-;8412:24;8430:5;8412:24;:::i;:::-;8407:3;8400:37;8390:53;;:::o;8449:157::-;8554:45;8574:24;8592:5;8574:24;:::i;:::-;8554:45;:::i;:::-;8549:3;8542:58;8532:74;;:::o;8642:732::-;8761:3;8790:54;8838:5;8790:54;:::i;:::-;8860:86;8939:6;8934:3;8860:86;:::i;:::-;8853:93;;8970:56;9020:5;8970:56;:::i;:::-;9049:7;9080:1;9065:284;9090:6;9087:1;9084:13;9065:284;;;9166:6;9160:13;9193:63;9252:3;9237:13;9193:63;:::i;:::-;9186:70;;9279:60;9332:6;9279:60;:::i;:::-;9269:70;;9125:224;9112:1;9109;9105:9;9100:14;;9065:284;;;9069:14;9365:3;9358:10;;8766:608;;;;;;;:::o;9380:109::-;9461:21;9476:5;9461:21;:::i;:::-;9456:3;9449:34;9439:50;;:::o;9495:118::-;9582:24;9600:5;9582:24;:::i;:::-;9577:3;9570:37;9560:53;;:::o;9619:360::-;9705:3;9733:38;9765:5;9733:38;:::i;:::-;9787:70;9850:6;9845:3;9787:70;:::i;:::-;9780:77;;9866:52;9911:6;9906:3;9899:4;9892:5;9888:16;9866:52;:::i;:::-;9943:29;9965:6;9943:29;:::i;:::-;9938:3;9934:39;9927:46;;9709:270;;;;;:::o;9985:364::-;10073:3;10101:39;10134:5;10101:39;:::i;:::-;10156:71;10220:6;10215:3;10156:71;:::i;:::-;10149:78;;10236:52;10281:6;10276:3;10269:4;10262:5;10258:16;10236:52;:::i;:::-;10313:29;10335:6;10313:29;:::i;:::-;10308:3;10304:39;10297:46;;10077:272;;;;;:::o;10355:377::-;10461:3;10489:39;10522:5;10489:39;:::i;:::-;10544:89;10626:6;10621:3;10544:89;:::i;:::-;10537:96;;10642:52;10687:6;10682:3;10675:4;10668:5;10664:16;10642:52;:::i;:::-;10719:6;10714:3;10710:16;10703:23;;10465:267;;;;;:::o;10762:845::-;10865:3;10902:5;10896:12;10931:36;10957:9;10931:36;:::i;:::-;10983:89;11065:6;11060:3;10983:89;:::i;:::-;10976:96;;11103:1;11092:9;11088:17;11119:1;11114:137;;;;11265:1;11260:341;;;;11081:520;;11114:137;11198:4;11194:9;11183;11179:25;11174:3;11167:38;11234:6;11229:3;11225:16;11218:23;;11114:137;;11260:341;11327:38;11359:5;11327:38;:::i;:::-;11387:1;11401:154;11415:6;11412:1;11409:13;11401:154;;;11489:7;11483:14;11479:1;11474:3;11470:11;11463:35;11539:1;11530:7;11526:15;11515:26;;11437:4;11434:1;11430:12;11425:17;;11401:154;;;11584:6;11579:3;11575:16;11568:23;;11267:334;;11081:520;;10869:738;;;;;;:::o;11613:366::-;11755:3;11776:67;11840:2;11835:3;11776:67;:::i;:::-;11769:74;;11852:93;11941:3;11852:93;:::i;:::-;11970:2;11965:3;11961:12;11954:19;;11759:220;;;:::o;11985:366::-;12127:3;12148:67;12212:2;12207:3;12148:67;:::i;:::-;12141:74;;12224:93;12313:3;12224:93;:::i;:::-;12342:2;12337:3;12333:12;12326:19;;12131:220;;;:::o;12357:366::-;12499:3;12520:67;12584:2;12579:3;12520:67;:::i;:::-;12513:74;;12596:93;12685:3;12596:93;:::i;:::-;12714:2;12709:3;12705:12;12698:19;;12503:220;;;:::o;12729:366::-;12871:3;12892:67;12956:2;12951:3;12892:67;:::i;:::-;12885:74;;12968:93;13057:3;12968:93;:::i;:::-;13086:2;13081:3;13077:12;13070:19;;12875:220;;;:::o;13101:366::-;13243:3;13264:67;13328:2;13323:3;13264:67;:::i;:::-;13257:74;;13340:93;13429:3;13340:93;:::i;:::-;13458:2;13453:3;13449:12;13442:19;;13247:220;;;:::o;13473:366::-;13615:3;13636:67;13700:2;13695:3;13636:67;:::i;:::-;13629:74;;13712:93;13801:3;13712:93;:::i;:::-;13830:2;13825:3;13821:12;13814:19;;13619:220;;;:::o;13845:366::-;13987:3;14008:67;14072:2;14067:3;14008:67;:::i;:::-;14001:74;;14084:93;14173:3;14084:93;:::i;:::-;14202:2;14197:3;14193:12;14186:19;;13991:220;;;:::o;14217:398::-;14376:3;14397:83;14478:1;14473:3;14397:83;:::i;:::-;14390:90;;14489:93;14578:3;14489:93;:::i;:::-;14607:1;14602:3;14598:11;14591:18;;14380:235;;;:::o;14621:366::-;14763:3;14784:67;14848:2;14843:3;14784:67;:::i;:::-;14777:74;;14860:93;14949:3;14860:93;:::i;:::-;14978:2;14973:3;14969:12;14962:19;;14767:220;;;:::o;14993:366::-;15135:3;15156:67;15220:2;15215:3;15156:67;:::i;:::-;15149:74;;15232:93;15321:3;15232:93;:::i;:::-;15350:2;15345:3;15341:12;15334:19;;15139:220;;;:::o;15365:366::-;15507:3;15528:67;15592:2;15587:3;15528:67;:::i;:::-;15521:74;;15604:93;15693:3;15604:93;:::i;:::-;15722:2;15717:3;15713:12;15706:19;;15511:220;;;:::o;15737:366::-;15879:3;15900:67;15964:2;15959:3;15900:67;:::i;:::-;15893:74;;15976:93;16065:3;15976:93;:::i;:::-;16094:2;16089:3;16085:12;16078:19;;15883:220;;;:::o;16109:366::-;16251:3;16272:67;16336:2;16331:3;16272:67;:::i;:::-;16265:74;;16348:93;16437:3;16348:93;:::i;:::-;16466:2;16461:3;16457:12;16450:19;;16255:220;;;:::o;16481:108::-;16558:24;16576:5;16558:24;:::i;:::-;16553:3;16546:37;16536:53;;:::o;16595:118::-;16682:24;16700:5;16682:24;:::i;:::-;16677:3;16670:37;16660:53;;:::o;16719:256::-;16831:3;16846:75;16917:3;16908:6;16846:75;:::i;:::-;16946:2;16941:3;16937:12;16930:19;;16966:3;16959:10;;16835:140;;;;:::o;16981:589::-;17206:3;17228:95;17319:3;17310:6;17228:95;:::i;:::-;17221:102;;17340:95;17431:3;17422:6;17340:95;:::i;:::-;17333:102;;17452:92;17540:3;17531:6;17452:92;:::i;:::-;17445:99;;17561:3;17554:10;;17210:360;;;;;;:::o;17576:379::-;17760:3;17782:147;17925:3;17782:147;:::i;:::-;17775:154;;17946:3;17939:10;;17764:191;;;:::o;17961:222::-;18054:4;18092:2;18081:9;18077:18;18069:26;;18105:71;18173:1;18162:9;18158:17;18149:6;18105:71;:::i;:::-;18059:124;;;;:::o;18189:640::-;18384:4;18422:3;18411:9;18407:19;18399:27;;18436:71;18504:1;18493:9;18489:17;18480:6;18436:71;:::i;:::-;18517:72;18585:2;18574:9;18570:18;18561:6;18517:72;:::i;:::-;18599;18667:2;18656:9;18652:18;18643:6;18599:72;:::i;:::-;18718:9;18712:4;18708:20;18703:2;18692:9;18688:18;18681:48;18746:76;18817:4;18808:6;18746:76;:::i;:::-;18738:84;;18389:440;;;;;;;:::o;18835:373::-;18978:4;19016:2;19005:9;19001:18;18993:26;;19065:9;19059:4;19055:20;19051:1;19040:9;19036:17;19029:47;19093:108;19196:4;19187:6;19093:108;:::i;:::-;19085:116;;18983:225;;;;:::o;19214:210::-;19301:4;19339:2;19328:9;19324:18;19316:26;;19352:65;19414:1;19403:9;19399:17;19390:6;19352:65;:::i;:::-;19306:118;;;;:::o;19430:222::-;19523:4;19561:2;19550:9;19546:18;19538:26;;19574:71;19642:1;19631:9;19627:17;19618:6;19574:71;:::i;:::-;19528:124;;;;:::o;19658:313::-;19771:4;19809:2;19798:9;19794:18;19786:26;;19858:9;19852:4;19848:20;19844:1;19833:9;19829:17;19822:47;19886:78;19959:4;19950:6;19886:78;:::i;:::-;19878:86;;19776:195;;;;:::o;19977:419::-;20143:4;20181:2;20170:9;20166:18;20158:26;;20230:9;20224:4;20220:20;20216:1;20205:9;20201:17;20194:47;20258:131;20384:4;20258:131;:::i;:::-;20250:139;;20148:248;;;:::o;20402:419::-;20568:4;20606:2;20595:9;20591:18;20583:26;;20655:9;20649:4;20645:20;20641:1;20630:9;20626:17;20619:47;20683:131;20809:4;20683:131;:::i;:::-;20675:139;;20573:248;;;:::o;20827:419::-;20993:4;21031:2;21020:9;21016:18;21008:26;;21080:9;21074:4;21070:20;21066:1;21055:9;21051:17;21044:47;21108:131;21234:4;21108:131;:::i;:::-;21100:139;;20998:248;;;:::o;21252:419::-;21418:4;21456:2;21445:9;21441:18;21433:26;;21505:9;21499:4;21495:20;21491:1;21480:9;21476:17;21469:47;21533:131;21659:4;21533:131;:::i;:::-;21525:139;;21423:248;;;:::o;21677:419::-;21843:4;21881:2;21870:9;21866:18;21858:26;;21930:9;21924:4;21920:20;21916:1;21905:9;21901:17;21894:47;21958:131;22084:4;21958:131;:::i;:::-;21950:139;;21848:248;;;:::o;22102:419::-;22268:4;22306:2;22295:9;22291:18;22283:26;;22355:9;22349:4;22345:20;22341:1;22330:9;22326:17;22319:47;22383:131;22509:4;22383:131;:::i;:::-;22375:139;;22273:248;;;:::o;22527:419::-;22693:4;22731:2;22720:9;22716:18;22708:26;;22780:9;22774:4;22770:20;22766:1;22755:9;22751:17;22744:47;22808:131;22934:4;22808:131;:::i;:::-;22800:139;;22698:248;;;:::o;22952:419::-;23118:4;23156:2;23145:9;23141:18;23133:26;;23205:9;23199:4;23195:20;23191:1;23180:9;23176:17;23169:47;23233:131;23359:4;23233:131;:::i;:::-;23225:139;;23123:248;;;:::o;23377:419::-;23543:4;23581:2;23570:9;23566:18;23558:26;;23630:9;23624:4;23620:20;23616:1;23605:9;23601:17;23594:47;23658:131;23784:4;23658:131;:::i;:::-;23650:139;;23548:248;;;:::o;23802:419::-;23968:4;24006:2;23995:9;23991:18;23983:26;;24055:9;24049:4;24045:20;24041:1;24030:9;24026:17;24019:47;24083:131;24209:4;24083:131;:::i;:::-;24075:139;;23973:248;;;:::o;24227:419::-;24393:4;24431:2;24420:9;24416:18;24408:26;;24480:9;24474:4;24470:20;24466:1;24455:9;24451:17;24444:47;24508:131;24634:4;24508:131;:::i;:::-;24500:139;;24398:248;;;:::o;24652:419::-;24818:4;24856:2;24845:9;24841:18;24833:26;;24905:9;24899:4;24895:20;24891:1;24880:9;24876:17;24869:47;24933:131;25059:4;24933:131;:::i;:::-;24925:139;;24823:248;;;:::o;25077:222::-;25170:4;25208:2;25197:9;25193:18;25185:26;;25221:71;25289:1;25278:9;25274:17;25265:6;25221:71;:::i;:::-;25175:124;;;;:::o;25305:129::-;25339:6;25366:20;;:::i;:::-;25356:30;;25395:33;25423:4;25415:6;25395:33;:::i;:::-;25346:88;;;:::o;25440:75::-;25473:6;25506:2;25500:9;25490:19;;25480:35;:::o;25521:307::-;25582:4;25672:18;25664:6;25661:30;25658:2;;;25694:18;;:::i;:::-;25658:2;25732:29;25754:6;25732:29;:::i;:::-;25724:37;;25816:4;25810;25806:15;25798:23;;25587:241;;;:::o;25834:308::-;25896:4;25986:18;25978:6;25975:30;25972:2;;;26008:18;;:::i;:::-;25972:2;26046:29;26068:6;26046:29;:::i;:::-;26038:37;;26130:4;26124;26120:15;26112:23;;25901:241;;;:::o;26148:132::-;26215:4;26238:3;26230:11;;26268:4;26263:3;26259:14;26251:22;;26220:60;;;:::o;26286:141::-;26335:4;26358:3;26350:11;;26381:3;26378:1;26371:14;26415:4;26412:1;26402:18;26394:26;;26340:87;;;:::o;26433:114::-;26500:6;26534:5;26528:12;26518:22;;26507:40;;;:::o;26553:98::-;26604:6;26638:5;26632:12;26622:22;;26611:40;;;:::o;26657:99::-;26709:6;26743:5;26737:12;26727:22;;26716:40;;;:::o;26762:113::-;26832:4;26864;26859:3;26855:14;26847:22;;26837:38;;;:::o;26881:184::-;26980:11;27014:6;27009:3;27002:19;27054:4;27049:3;27045:14;27030:29;;26992:73;;;;:::o;27071:168::-;27154:11;27188:6;27183:3;27176:19;27228:4;27223:3;27219:14;27204:29;;27166:73;;;;:::o;27245:147::-;27346:11;27383:3;27368:18;;27358:34;;;;:::o;27398:169::-;27482:11;27516:6;27511:3;27504:19;27556:4;27551:3;27547:14;27532:29;;27494:73;;;;:::o;27573:148::-;27675:11;27712:3;27697:18;;27687:34;;;;:::o;27727:305::-;27767:3;27786:20;27804:1;27786:20;:::i;:::-;27781:25;;27820:20;27838:1;27820:20;:::i;:::-;27815:25;;27974:1;27906:66;27902:74;27899:1;27896:81;27893:2;;;27980:18;;:::i;:::-;27893:2;28024:1;28021;28017:9;28010:16;;27771:261;;;;:::o;28038:185::-;28078:1;28095:20;28113:1;28095:20;:::i;:::-;28090:25;;28129:20;28147:1;28129:20;:::i;:::-;28124:25;;28168:1;28158:2;;28173:18;;:::i;:::-;28158:2;28215:1;28212;28208:9;28203:14;;28080:143;;;;:::o;28229:348::-;28269:7;28292:20;28310:1;28292:20;:::i;:::-;28287:25;;28326:20;28344:1;28326:20;:::i;:::-;28321:25;;28514:1;28446:66;28442:74;28439:1;28436:81;28431:1;28424:9;28417:17;28413:105;28410:2;;;28521:18;;:::i;:::-;28410:2;28569:1;28566;28562:9;28551:20;;28277:300;;;;:::o;28583:191::-;28623:4;28643:20;28661:1;28643:20;:::i;:::-;28638:25;;28677:20;28695:1;28677:20;:::i;:::-;28672:25;;28716:1;28713;28710:8;28707:2;;;28721:18;;:::i;:::-;28707:2;28766:1;28763;28759:9;28751:17;;28628:146;;;;:::o;28780:96::-;28817:7;28846:24;28864:5;28846:24;:::i;:::-;28835:35;;28825:51;;;:::o;28882:90::-;28916:7;28959:5;28952:13;28945:21;28934:32;;28924:48;;;:::o;28978:77::-;29015:7;29044:5;29033:16;;29023:32;;;:::o;29061:149::-;29097:7;29137:66;29130:5;29126:78;29115:89;;29105:105;;;:::o;29216:126::-;29253:7;29293:42;29286:5;29282:54;29271:65;;29261:81;;;:::o;29348:77::-;29385:7;29414:5;29403:16;;29393:32;;;:::o;29431:154::-;29515:6;29510:3;29505;29492:30;29577:1;29568:6;29563:3;29559:16;29552:27;29482:103;;;:::o;29591:307::-;29659:1;29669:113;29683:6;29680:1;29677:13;29669:113;;;29768:1;29763:3;29759:11;29753:18;29749:1;29744:3;29740:11;29733:39;29705:2;29702:1;29698:10;29693:15;;29669:113;;;29800:6;29797:1;29794:13;29791:2;;;29880:1;29871:6;29866:3;29862:16;29855:27;29791:2;29640:258;;;;:::o;29904:320::-;29948:6;29985:1;29979:4;29975:12;29965:22;;30032:1;30026:4;30022:12;30053:18;30043:2;;30109:4;30101:6;30097:17;30087:27;;30043:2;30171;30163:6;30160:14;30140:18;30137:38;30134:2;;;30190:18;;:::i;:::-;30134:2;29955:269;;;;:::o;30230:281::-;30313:27;30335:4;30313:27;:::i;:::-;30305:6;30301:40;30443:6;30431:10;30428:22;30407:18;30395:10;30392:34;30389:62;30386:2;;;30454:18;;:::i;:::-;30386:2;30494:10;30490:2;30483:22;30273:238;;;:::o;30517:233::-;30556:3;30579:24;30597:5;30579:24;:::i;:::-;30570:33;;30625:66;30618:5;30615:77;30612:2;;;30695:18;;:::i;:::-;30612:2;30742:1;30735:5;30731:13;30724:20;;30560:190;;;:::o;30756:100::-;30795:7;30824:26;30844:5;30824:26;:::i;:::-;30813:37;;30803:53;;;:::o;30862:94::-;30901:7;30930:20;30944:5;30930:20;:::i;:::-;30919:31;;30909:47;;;:::o;30962:176::-;30994:1;31011:20;31029:1;31011:20;:::i;:::-;31006:25;;31045:20;31063:1;31045:20;:::i;:::-;31040:25;;31084:1;31074:2;;31089:18;;:::i;:::-;31074:2;31130:1;31127;31123:9;31118:14;;30996:142;;;;:::o;31144:180::-;31192:77;31189:1;31182:88;31289:4;31286:1;31279:15;31313:4;31310:1;31303:15;31330:180;31378:77;31375:1;31368:88;31475:4;31472:1;31465:15;31499:4;31496:1;31489:15;31516:180;31564:77;31561:1;31554:88;31661:4;31658:1;31651:15;31685:4;31682:1;31675:15;31702:180;31750:77;31747:1;31740:88;31847:4;31844:1;31837:15;31871:4;31868:1;31861:15;31888:102;31929:6;31980:2;31976:7;31971:2;31964:5;31960:14;31956:28;31946:38;;31936:54;;;:::o;31996:94::-;32029:8;32077:5;32073:2;32069:14;32048:35;;32038:52;;;:::o;32096:164::-;32236:16;32232:1;32224:6;32220:14;32213:40;32202:58;:::o;32266:225::-;32406:34;32402:1;32394:6;32390:14;32383:58;32475:8;32470:2;32462:6;32458:15;32451:33;32372:119;:::o;32497:170::-;32637:22;32633:1;32625:6;32621:14;32614:46;32603:64;:::o;32673:179::-;32813:31;32809:1;32801:6;32797:14;32790:55;32779:73;:::o;32858:182::-;32998:34;32994:1;32986:6;32982:14;32975:58;32964:76;:::o;33046:234::-;33186:34;33182:1;33174:6;33170:14;33163:58;33255:17;33250:2;33242:6;33238:15;33231:42;33152:128;:::o;33286:171::-;33426:23;33422:1;33414:6;33410:14;33403:47;33392:65;:::o;33463:114::-;33569:8;:::o;33583:170::-;33723:22;33719:1;33711:6;33707:14;33700:46;33689:64;:::o;33759:175::-;33899:27;33895:1;33887:6;33883:14;33876:51;33865:69;:::o;33940:171::-;34080:23;34076:1;34068:6;34064:14;34057:47;34046:65;:::o;34117:181::-;34257:33;34253:1;34245:6;34241:14;34234:57;34223:75;:::o;34304:169::-;34444:21;34440:1;34432:6;34428:14;34421:45;34410:63;:::o;34479:122::-;34552:24;34570:5;34552:24;:::i;:::-;34545:5;34542:35;34532:2;;34591:1;34588;34581:12;34532:2;34522:79;:::o;34607:116::-;34677:21;34692:5;34677:21;:::i;:::-;34670:5;34667:32;34657:2;;34713:1;34710;34703:12;34657:2;34647:76;:::o;34729:122::-;34802:24;34820:5;34802:24;:::i;:::-;34795:5;34792:35;34782:2;;34841:1;34838;34831:12;34782:2;34772:79;:::o;34857:120::-;34929:23;34946:5;34929:23;:::i;:::-;34922:5;34919:34;34909:2;;34967:1;34964;34957:12;34909:2;34899:78;:::o;34983:122::-;35056:24;35074:5;35056:24;:::i;:::-;35049:5;35046:35;35036:2;;35095:1;35092;35085:12;35036:2;35026:79;:::o
Swarm Source
ipfs://0cb1cc2f0ad17f0c3b1b2e2c4cd4ffeb77f94c31d3bc65edc3dec43ad008a184
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.