Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 89 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 19591344 | 267 days ago | IN | 0 ETH | 0.00081715 | ||||
Mint Whitelisted | 19322590 | 305 days ago | IN | 0.044 ETH | 0.00472313 | ||||
Withdraw | 19045092 | 344 days ago | IN | 0 ETH | 0.00065654 | ||||
Gift | 19015716 | 348 days ago | IN | 0 ETH | 0.00538424 | ||||
Set Approval For... | 18835540 | 373 days ago | IN | 0 ETH | 0.00322287 | ||||
Gift | 18758751 | 384 days ago | IN | 0 ETH | 0.00270387 | ||||
Gift | 17979651 | 493 days ago | IN | 0 ETH | 0.00275428 | ||||
Gift | 17979649 | 493 days ago | IN | 0 ETH | 0.00287586 | ||||
Gift | 17979648 | 493 days ago | IN | 0 ETH | 0.00287877 | ||||
Gift | 17979646 | 493 days ago | IN | 0 ETH | 0.00298565 | ||||
Gift | 17979645 | 493 days ago | IN | 0 ETH | 0.00278786 | ||||
Gift | 17979644 | 493 days ago | IN | 0 ETH | 0.00277326 | ||||
Gift | 17979641 | 493 days ago | IN | 0 ETH | 0.00289473 | ||||
Gift | 17979640 | 493 days ago | IN | 0 ETH | 0.00305135 | ||||
Gift | 17979639 | 493 days ago | IN | 0 ETH | 0.00291607 | ||||
Gift | 17979637 | 493 days ago | IN | 0 ETH | 0.00300795 | ||||
Set Approval For... | 17442330 | 569 days ago | IN | 0 ETH | 0.00068778 | ||||
Set Approval For... | 17442323 | 569 days ago | IN | 0 ETH | 0.00076659 | ||||
Transfer From | 16961464 | 636 days ago | IN | 0 ETH | 0.00135848 | ||||
Mint Whitelisted | 16938449 | 640 days ago | IN | 0.044 ETH | 0.00377363 | ||||
Withdraw | 16723743 | 670 days ago | IN | 0 ETH | 0.00069784 | ||||
Mint Whitelisted | 16707259 | 672 days ago | IN | 0.044 ETH | 0.00317258 | ||||
Set Approval For... | 16657492 | 679 days ago | IN | 0 ETH | 0.0013373 | ||||
Mint Whitelisted | 16571665 | 691 days ago | IN | 0.044 ETH | 0.00389774 | ||||
Set Approval For... | 16520829 | 698 days ago | IN | 0 ETH | 0.00111487 |
Loading...
Loading
Contract Name:
CreationBabies
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-12-07 */ // File: IOperatorFilterRegistry.sol pragma solidity ^0.8.7; interface IOperatorFilterRegistry { function isOperatorAllowed(address registrant, address operator) external view returns (bool); function register(address registrant) external; function registerAndSubscribe(address registrant, address subscription) external; function registerAndCopyEntries(address registrant, address registrantToCopy) external; function unregister(address addr) external; function updateOperator(address registrant, address operator, bool filtered) external; function updateOperators(address registrant, address[] calldata operators, bool filtered) external; function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external; function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external; function subscribe(address registrant, address registrantToSubscribe) external; function unsubscribe(address registrant, bool copyExistingEntries) external; function subscriptionOf(address addr) external returns (address registrant); function subscribers(address registrant) external returns (address[] memory); function subscriberAt(address registrant, uint256 index) external returns (address); function copyEntriesOf(address registrant, address registrantToCopy) external; function isOperatorFiltered(address registrant, address operator) external returns (bool); function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool); function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool); function filteredOperators(address addr) external returns (address[] memory); function filteredCodeHashes(address addr) external returns (bytes32[] memory); function filteredOperatorAt(address registrant, uint256 index) external returns (address); function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32); function isRegistered(address addr) external returns (bool); function codeHashOf(address addr) external returns (bytes32); } // File: OperatorFilterer.sol pragma solidity ^0.8.7; /** * @title OperatorFilterer * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another * registrant's entries in the OperatorFilterRegistry. * @dev This smart contract is meant to be inherited by token contracts so they can use the following: * - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods. * - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods. */ abstract contract OperatorFilterer { error OperatorNotAllowed(address operator); IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY = IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E); constructor(address subscriptionOrRegistrantToCopy, bool subscribe) { // If an inheriting token contract is deployed to a network without the registry deployed, the modifier // will not revert, but the contract will need to be registered with the registry once it is deployed in // order for the modifier to filter addresses. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (subscribe) { OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy); } else { if (subscriptionOrRegistrantToCopy != address(0)) { OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy); } else { OPERATOR_FILTER_REGISTRY.register(address(this)); } } } } modifier onlyAllowedOperator(address from) virtual { // Allow spending tokens from addresses with balance // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred // from an EOA. if (from != msg.sender) { _checkFilterOperator(msg.sender); } _; } modifier onlyAllowedOperatorApproval(address operator) virtual { _checkFilterOperator(operator); _; } function _checkFilterOperator(address operator) internal view virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) { revert OperatorNotAllowed(operator); } } } } // File: DefaultOperatorFilterer.sol pragma solidity ^0.8.7; /** * @title DefaultOperatorFilterer * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription. */ abstract contract DefaultOperatorFilterer is OperatorFilterer { address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6); constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {} } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/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/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 v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/interfaces/IERC2981.sol // OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.0; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); } // File: @openzeppelin/contracts/token/common/ERC2981.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/common/ERC2981.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the * fee is specified in basis points by default. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. * * _Available since v4.5._ */ abstract contract ERC2981 is IERC2981, ERC165 { struct RoyaltyInfo { address receiver; uint96 royaltyFraction; } RoyaltyInfo private _defaultRoyaltyInfo; mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981 */ function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) { RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator(); return (royalty.receiver, royaltyAmount); } /** * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an * override. */ function _feeDenominator() internal pure virtual returns (uint96) { return 10000; } /** * @dev Sets the royalty information that all ids in this contract will default to. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: invalid receiver"); _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Removes default royalty information. */ function _deleteDefaultRoyalty() internal virtual { delete _defaultRoyaltyInfo; } /** * @dev Sets the royalty information for a specific token id, overriding the global default. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setTokenRoyalty( uint256 tokenId, address receiver, uint96 feeNumerator ) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: Invalid parameters"); _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Resets royalty information for the token id back to the global default. */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/contracts/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/Counters.sol // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: erc721a/contracts/IERC721A.sol // ERC721A Contracts v4.2.3 // 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(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================================================= // IERC721 // ============================================================= /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables * (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, * checking first that contract recipients are aware of the ERC721 protocol * to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move * this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external payable; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Transfers `tokenId` from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} * whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external payable; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } // File: erc721a/contracts/ERC721A.sol // ERC721A Contracts v4.2.3 // 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 { // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364). 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 payable 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 { _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].value`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) public payable virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_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 payable virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public payable virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Hook that is called before a set of serially-ordered token IDs * are about to be transferred. This includes minting. * And also called before burning one token. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token IDs * have been transferred. This includes minting. * And also called after one token has been burned. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns whether the call correctly returned the expected magic value. */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__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. // The duplicated `log4` removes an extra check and reduces stack juggling. // The assembly, together with the surrounding Solidity code, have been // delicately arranged to nudge the compiler into producing optimized opcodes. assembly { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(to, _BITMASK_ADDRESS) // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. startTokenId // `tokenId`. ) // The `iszero(eq(,))` check ensures that large values of `quantity` // that overflows uint256 will make the loop run out of gas. // The compiler will optimize the `iszero` away for performance. for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { // Emit the `Transfer` event. Similar to above. log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } if (toMasked == 0) revert MintToZeroAddress(); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function _toString(uint256 value) internal pure virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), but // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned. // We will need 1 word for the trailing zeros padding, 1 word for the length, // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0. let m := add(mload(0x40), 0xa0) // Update the free memory pointer to allocate. mstore(0x40, m) // Assign the `str` to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } } // File: contracts/CreationBabies.sol //SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.7; contract CreationBabies is ERC721A, DefaultOperatorFilterer, Ownable, ReentrancyGuard, ERC2981 { using Counters for Counters.Counter; address public pieContractAddress = 0xfb5aceff3117ac013a387D383fD1643D573bd5b4; address public cakeContractAddress = 0xd5027B602B50F18Ee2A5D95Dd141Ee7bDe5AA476; string public baseURI; mapping (address => bool) private gifters; bytes32 public whitelistMerkleRoot; address public split; uint256 public mintStartTime; mapping (uint256 => uint256) public mintedAt; mapping (uint256 => uint256) public quantityToDiscountPct; mapping (uint256 => bool) public quantityHasDiscount; bool public mintPaused = true; bool public baseURILocked = false; uint256 private maxSupply = 111; uint96 private royaltyBps = 1000; uint256 private basePrice = 0.088 ether; uint256 private cakeBasePrice = 0.066 ether; uint256 private pieBasePrice = 0.055 ether; uint256 private cakeAndPieBasePrice = 0.044 ether; function updateRoyalty(uint96 _royaltyBps) public onlyOwner { require(split!=address(0), "split address not set, please set split address before updating royalty"); royaltyBps = _royaltyBps; _setDefaultRoyalty(split, royaltyBps); } function getTokenInfo() public view returns (address[] memory, uint256[] memory) { address[] memory owners = new address[](totalSupply()); uint256[] memory mintedAts = new uint256[](totalSupply()); for (uint256 i = 0; i < totalSupply(); i++) { owners[i] = ownerOf(i); mintedAts[i] = mintedAt[i]; } return (owners, mintedAts); } function updateMerkleRoot(bytes32 _whitelistMerkleRoot) public onlyOwner { whitelistMerkleRoot = _whitelistMerkleRoot; } function updatePieContractAddress(address _address) public onlyOwner { pieContractAddress = _address; } function updateCakeContractAddress(address _address) public onlyOwner { cakeContractAddress = _address; } function updateBasePrice(uint256 _basePrice) public onlyOwner { basePrice = _basePrice; } function updateCakeBasePrice(uint256 _cakeBasePrice) public onlyOwner { cakeBasePrice = _cakeBasePrice; } function updatePieBasePrice(uint256 _pieBasePrice) public onlyOwner { pieBasePrice = _pieBasePrice; } function updateCakeAndPieBasePrice(uint256 _cakeAndPieBasePrice) public onlyOwner { cakeAndPieBasePrice = _cakeAndPieBasePrice; } function updateMintPaused(bool _mintPaused) public onlyOwner { mintPaused = _mintPaused; if(!mintPaused) { mintStartTime = block.timestamp; } } function updateBaseURI(string calldata givenBaseURI) public onlyOwner { require(!baseURILocked, "base uri locked"); baseURI = givenBaseURI; } function tokenURI(uint256 tokenID) public view override returns (string memory) { require(_exists(tokenID), "ERC721Metadata: URI query for nonexistent token"); return string(abi.encodePacked(baseURI, Strings.toString(tokenID))); } function lockBaseURI() public onlyOwner { baseURILocked = true; } function updateGifters(address _address, bool canGift) public onlyOwner { gifters[_address] = canGift; } modifier onlyGifter() { require(gifters[msg.sender] == true, "only gifters can gift"); _; } modifier callerIsUser() { require(tx.origin == msg.sender, "the caller is another contract."); _; } function addQuantityDiscount(uint256 _quantity, uint256 _discountPct) public onlyOwner { quantityToDiscountPct[_quantity] = _discountPct; quantityHasDiscount[_quantity] = true; } function checkPieHolder(address user) public view returns (bool) { IERC721 pieContract = IERC721(pieContractAddress); bool hasPie = pieContract.balanceOf(user) > 0; return hasPie; } function checkCakeHolder(address user) public view returns (bool) { IERC721 cakeContract = IERC721(cakeContractAddress); bool hasCake = cakeContract.balanceOf(user) > 0; return hasCake; } constructor() ERC721A("CreationBabies", "CREATIONBABIES") { gifters[msg.sender] = true; mintStartTime = block.timestamp; addQuantityDiscount(5, 5); addQuantityDiscount(10, 10); addQuantityDiscount(15, 15); } function checkPrice(uint256 quantity, address user, bool whitelisted) public view returns (uint256) { bool hasPie = checkPieHolder(user); bool hasCake = checkCakeHolder(user); uint256 price = basePrice; if(hasPie && (hasCake || whitelisted)) { price = cakeAndPieBasePrice; } else if(hasPie) { price = pieBasePrice; } else if(hasCake || whitelisted) { price = cakeBasePrice; } uint256 total = price * quantity; if(quantityHasDiscount[quantity]) { uint256 discountPct = quantityToDiscountPct[quantity]; uint256 discountAmt = (basePrice * quantity) * (discountPct / 100); total = total - discountAmt; } return total; } function mintWhitelisted(uint256 quantity, bytes32[] calldata merkleProof) public payable nonReentrant callerIsUser { require(!mintPaused, "minting paused"); bytes32 leaf = keccak256(abi.encodePacked(msg.sender)); require(MerkleProof.verify(merkleProof, whitelistMerkleRoot, leaf), "invalid proof"); uint256 totalPrice = checkPrice(quantity, msg.sender, true); require(msg.value == totalPrice, "did not send correct amount of eth"); require(totalSupply() + quantity <= maxSupply, "not enough supply"); uint256 minTokenID = totalSupply(); uint256 maxTokenID = totalSupply() + quantity - 1; _safeMint(msg.sender, quantity); for (uint256 id = minTokenID; id <= maxTokenID; id++) { mintedAt[id] = block.timestamp; } } function mint(uint256 quantity) public payable nonReentrant callerIsUser { require(!mintPaused, "minting paused"); uint256 totalPrice = checkPrice(quantity, msg.sender, false); require(msg.value == totalPrice, "did not send correct amount of eth"); require(totalSupply() + quantity <= maxSupply, "not enough supply"); uint256 minTokenID = totalSupply(); uint256 maxTokenID = totalSupply() + quantity - 1; _safeMint(msg.sender, quantity); for (uint256 id = minTokenID; id <= maxTokenID; id++) { mintedAt[id] = block.timestamp; } } function gift(uint256 quantity, address to) public onlyGifter { require(totalSupply() + quantity <= maxSupply, "not enough supply"); uint256 minTokenID = totalSupply(); uint256 maxTokenID = totalSupply() + quantity - 1; _safeMint(to, quantity); for (uint256 id = minTokenID; id <= maxTokenID; id++) { mintedAt[id] = block.timestamp; } } function setSplitAddress(address _address) public onlyOwner { split = _address; _setDefaultRoyalty(split, royaltyBps); } function withdraw() public onlyOwner { require(split != address(0), "split address not set"); (bool success, ) = split.call{value: address(this).balance}(""); require(success, "Transfer failed."); } // Opensea Operator filter registry function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) { super.setApprovalForAll(operator, approved); } function approve(address operator, uint256 tokenId) public payable override onlyAllowedOperatorApproval(operator) { super.approve(operator, tokenId); } function transferFrom(address from, address to, uint256 tokenId) public payable override onlyAllowedOperator(from) { super.transferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId) public payable override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public payable override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId, data); } function supportsInterface( bytes4 interfaceId ) public view virtual override(ERC721A, ERC2981) returns (bool) { return ERC721A.supportsInterface(interfaceId) || ERC2981.supportsInterface(interfaceId); } }
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":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","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":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"},{"internalType":"uint256","name":"_discountPct","type":"uint256"}],"name":"addQuantityDiscount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURILocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cakeContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"checkCakeHolder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"checkPieHolder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"address","name":"user","type":"address"},{"internalType":"bool","name":"whitelisted","type":"bool"}],"name":"checkPrice","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":"getTokenInfo","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"gift","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"mintWhitelisted","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mintedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pieContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"quantityHasDiscount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"quantityToDiscountPct","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setSplitAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"split","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenID","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_basePrice","type":"uint256"}],"name":"updateBasePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"givenBaseURI","type":"string"}],"name":"updateBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cakeAndPieBasePrice","type":"uint256"}],"name":"updateCakeAndPieBasePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cakeBasePrice","type":"uint256"}],"name":"updateCakeBasePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"updateCakeContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"canGift","type":"bool"}],"name":"updateGifters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_whitelistMerkleRoot","type":"bytes32"}],"name":"updateMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_mintPaused","type":"bool"}],"name":"updateMintPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pieBasePrice","type":"uint256"}],"name":"updatePieBasePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"updatePieContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint96","name":"_royaltyBps","type":"uint96"}],"name":"updateRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052600c80546001600160a01b031990811673fb5aceff3117ac013a387d383fd1643d573bd5b417909155600d805490911673d5027b602b50f18ee2a5d95dd141ee7bde5aa4761790556016805461ffff19166001179055606f601755601880546001600160601b0319166103e8179055670138a388a43c000060195566ea7aa67b2d0000601a5566c3663566a58000601b55669c51c4521e0000601c55348015620000ad57600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600e81526020016d4372656174696f6e42616269657360901b8152506040518060400160405280600e81526020016d4352454154494f4e42414249455360901b81525081600290816200012491906200045d565b5060036200013382826200045d565b506000805550506daaeb6d7670e522a718067333cd4e3b156200027f578015620001cd57604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b158015620001ae57600080fd5b505af1158015620001c3573d6000803e3d6000fd5b505050506200027f565b6001600160a01b038216156200021e5760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af29039060440162000193565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401600060405180830381600087803b1580156200026557600080fd5b505af11580156200027a573d6000803e3d6000fd5b505050505b506200028d905033620002df565b60016009819055336000908152600f60205260409020805460ff1916909117905542601255620002bf60058062000331565b620002cc600a8062000331565b620002d9600f8062000331565b62000529565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6008546001600160a01b03163314620003905760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b600091825260146020908152604080842092909255601590529020805460ff19166001179055565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620003e357607f821691505b6020821081036200040457634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200045857600081815260208120601f850160051c81016020861015620004335750805b601f850160051c820191505b8181101562000454578281556001016200043f565b5050505b505050565b81516001600160401b03811115620004795762000479620003b8565b62000491816200048a8454620003ce565b846200040a565b602080601f831160018114620004c95760008415620004b05750858301515b600019600386901b1c1916600185901b17855562000454565b600085815260208120601f198616915b82811015620004fa57888601518255948401946001909101908401620004d9565b5085821015620005195787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b612f0880620005396000396000f3fe6080604052600436106102ff5760003560e01c80638da5cb5b11610190578063b9e35574116100dc578063e775920c11610095578063f1b0aa151161006f578063f1b0aa15146108d7578063f2fde38b14610904578063f765417614610924578063fd5baa881461094457600080fd5b8063e775920c14610877578063e985e9c514610897578063f0ee9b9e146108b757600080fd5b8063b9e35574146107b4578063bb30ac49146107c7578063c4c6be75146107e7578063c7d0db0414610817578063c87b56dd14610837578063e5ad0b2b1461085757600080fd5b8063a44acf1e11610149578063aa98e0c611610123578063aa98e0c614610748578063aab4ece51461075e578063abb1dc441461077e578063b88d4fde146107a157600080fd5b8063a44acf1e146106db578063a79c00e314610708578063a91657b71461072857600080fd5b80638da5cb5b1461063f578063931688cb1461065d578063931e2e491461067d57806395d89b4114610693578063a0712d68146106a8578063a22cb465146106bb57600080fd5b806353df5c7c1161024f57806370a08231116102085780637e4831d3116101e25780637e4831d3146105c557806383a076be146105df578063847e3d0d146105ff578063856e05041461061f57600080fd5b806370a0823114610570578063715018a6146105905780637a7aa287146105a557600080fd5b806353df5c7c146104c75780635d148e5c146104dc5780636352211e146104fb57806364c1caf81461051b57806369b2f16e1461053b5780636c0360eb1461055b57600080fd5b806323b872dd116102bc57806341f434341161029657806341f434341461045257806342842e0e146104745780634783f0ef146104875780635273ca15146104a757600080fd5b806323b872dd146103eb5780632a55205a146103fe5780633ccfd60b1461043d57600080fd5b806301ffc9a71461030457806302acd0881461033957806306fdde031461035b578063081812fc1461037d578063095ea7b3146103b557806318160ddd146103c8575b600080fd5b34801561031057600080fd5b5061032461031f366004612639565b610964565b60405190151581526020015b60405180910390f35b34801561034557600080fd5b50610359610354366004612680565b610984565b005b34801561036757600080fd5b506103706109e2565b6040516103309190612707565b34801561038957600080fd5b5061039d61039836600461271a565b610a74565b6040516001600160a01b039091168152602001610330565b6103596103c3366004612733565b610ab8565b3480156103d457600080fd5b50600154600054035b604051908152602001610330565b6103596103f936600461275d565b610ad1565b34801561040a57600080fd5b5061041e610419366004612799565b610afc565b604080516001600160a01b039093168352602083019190915201610330565b34801561044957600080fd5b50610359610ba8565b34801561045e57600080fd5b5061039d6daaeb6d7670e522a718067333cd4e81565b61035961048236600461275d565b610cbb565b34801561049357600080fd5b506103596104a236600461271a565b610ce0565b3480156104b357600080fd5b506103246104c23660046127bb565b610d0f565b3480156104d357600080fd5b50610359610d8e565b3480156104e857600080fd5b5060165461032490610100900460ff1681565b34801561050757600080fd5b5061039d61051636600461271a565b610dc9565b34801561052757600080fd5b50600c5461039d906001600160a01b031681565b34801561054757600080fd5b50600d5461039d906001600160a01b031681565b34801561056757600080fd5b50610370610dd4565b34801561057c57600080fd5b506103dd61058b3660046127bb565b610e62565b34801561059c57600080fd5b50610359610eb1565b3480156105b157600080fd5b506103596105c036600461271a565b610ee7565b3480156105d157600080fd5b506016546103249060ff1681565b3480156105eb57600080fd5b506103596105fa3660046127d6565b610f16565b34801561060b57600080fd5b5061032461061a3660046127bb565b611021565b34801561062b57600080fd5b5061035961063a3660046127bb565b61105a565b34801561064b57600080fd5b506008546001600160a01b031661039d565b34801561066957600080fd5b50610359610678366004612802565b6110b8565b34801561068957600080fd5b506103dd60125481565b34801561069f57600080fd5b50610370611139565b6103596106b636600461271a565b611148565b3480156106c757600080fd5b506103596106d6366004612680565b611315565b3480156106e757600080fd5b506103dd6106f636600461271a565b60146020526000908152604090205481565b34801561071457600080fd5b506103596107233660046127bb565b611329565b34801561073457600080fd5b5061035961074336600461271a565b611375565b34801561075457600080fd5b506103dd60105481565b34801561076a57600080fd5b5061035961077936600461271a565b6113a4565b34801561078a57600080fd5b506107936113d3565b604051610330929190612874565b6103596107af36600461290e565b611509565b6103596107c23660046129ea565b61152f565b3480156107d357600080fd5b506103596107e2366004612799565b6117b5565b3480156107f357600080fd5b5061032461080236600461271a565b60156020526000908152604090205460ff1681565b34801561082357600080fd5b50610359610832366004612a69565b611807565b34801561084357600080fd5b5061037061085236600461271a565b611850565b34801561086357600080fd5b50610359610872366004612a86565b6118f1565b34801561088357600080fd5b506103596108923660046127bb565b6119e4565b3480156108a357600080fd5b506103246108b2366004612aaf565b611a30565b3480156108c357600080fd5b506103dd6108d2366004612ad9565b611a5e565b3480156108e357600080fd5b506103dd6108f236600461271a565b60136020526000908152604090205481565b34801561091057600080fd5b5061035961091f3660046127bb565b611b33565b34801561093057600080fd5b5060115461039d906001600160a01b031681565b34801561095057600080fd5b5061035961095f36600461271a565b611bcb565b600061096f82611bfa565b8061097e575061097e82611c48565b92915050565b6008546001600160a01b031633146109b75760405162461bcd60e51b81526004016109ae90612b19565b60405180910390fd5b6001600160a01b03919091166000908152600f60205260409020805460ff1916911515919091179055565b6060600280546109f190612b4e565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1d90612b4e565b8015610a6a5780601f10610a3f57610100808354040283529160200191610a6a565b820191906000526020600020905b815481529060010190602001808311610a4d57829003601f168201915b5050505050905090565b6000610a7f82611c7d565b610a9c576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b81610ac281611ca4565b610acc8383611d5d565b505050565b826001600160a01b0381163314610aeb57610aeb33611ca4565b610af6848484611dfd565b50505050565b6000828152600b602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291610b71575060408051808201909152600a546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610b90906001600160601b031687612b9e565b610b9a9190612bcb565b915196919550909350505050565b6008546001600160a01b03163314610bd25760405162461bcd60e51b81526004016109ae90612b19565b6011546001600160a01b0316610c225760405162461bcd60e51b81526020600482015260156024820152741cdc1b1a5d081859191c995cdcc81b9bdd081cd95d605a1b60448201526064016109ae565b6011546040516000916001600160a01b03169047908381818185875af1925050503d8060008114610c6f576040519150601f19603f3d011682016040523d82523d6000602084013e610c74565b606091505b5050905080610cb85760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b60448201526064016109ae565b50565b826001600160a01b0381163314610cd557610cd533611ca4565b610af6848484611f96565b6008546001600160a01b03163314610d0a5760405162461bcd60e51b81526004016109ae90612b19565b601055565b600d546040516370a0823160e01b81526001600160a01b03838116600483015260009216908290819083906370a08231906024015b602060405180830381865afa158015610d61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d859190612bdf565b11949350505050565b6008546001600160a01b03163314610db85760405162461bcd60e51b81526004016109ae90612b19565b6016805461ff001916610100179055565b600061097e82611fb1565b600e8054610de190612b4e565b80601f0160208091040260200160405190810160405280929190818152602001828054610e0d90612b4e565b8015610e5a5780601f10610e2f57610100808354040283529160200191610e5a565b820191906000526020600020905b815481529060010190602001808311610e3d57829003601f168201915b505050505081565b60006001600160a01b038216610e8b576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6008546001600160a01b03163314610edb5760405162461bcd60e51b81526004016109ae90612b19565b610ee5600061201f565b565b6008546001600160a01b03163314610f115760405162461bcd60e51b81526004016109ae90612b19565b601a55565b336000908152600f602052604090205460ff161515600114610f725760405162461bcd60e51b81526020600482015260156024820152741bdb9b1e4819da599d195c9cc818d85b8819da599d605a1b60448201526064016109ae565b60175482610f836001546000540390565b610f8d9190612bf8565b1115610fab5760405162461bcd60e51b81526004016109ae90612c0b565b6000610fba6001546000540390565b90506000600184610fce6001546000540390565b610fd89190612bf8565b610fe29190612c36565b9050610fee8385612071565b815b81811161101a5760008181526013602052604090204290558061101281612c49565b915050610ff0565b5050505050565b600c546040516370a0823160e01b81526001600160a01b03838116600483015260009216908290819083906370a0823190602401610d44565b6008546001600160a01b031633146110845760405162461bcd60e51b81526004016109ae90612b19565b601180546001600160a01b0319166001600160a01b038316908117909155601854610cb891906001600160601b031661208f565b6008546001600160a01b031633146110e25760405162461bcd60e51b81526004016109ae90612b19565b601654610100900460ff161561112c5760405162461bcd60e51b815260206004820152600f60248201526e18985cd9481d5c9a481b1bd8dad959608a1b60448201526064016109ae565b600e610acc828483612ca8565b6060600380546109f190612b4e565b60026009540361119a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016109ae565b60026009553233146111ee5760405162461bcd60e51b815260206004820152601f60248201527f7468652063616c6c657220697320616e6f7468657220636f6e74726163742e0060448201526064016109ae565b60165460ff16156112325760405162461bcd60e51b815260206004820152600e60248201526d1b5a5b9d1a5b99c81c185d5cd95960921b60448201526064016109ae565b600061124082336000611a5e565b90508034146112615760405162461bcd60e51b81526004016109ae90612d68565b601754826112726001546000540390565b61127c9190612bf8565b111561129a5760405162461bcd60e51b81526004016109ae90612c0b565b60006112a96001546000540390565b905060006001846112bd6001546000540390565b6112c79190612bf8565b6112d19190612c36565b90506112dd3385612071565b815b8181116113095760008181526013602052604090204290558061130181612c49565b9150506112df565b50506001600955505050565b8161131f81611ca4565b610acc838361218c565b6008546001600160a01b031633146113535760405162461bcd60e51b81526004016109ae90612b19565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6008546001600160a01b0316331461139f5760405162461bcd60e51b81526004016109ae90612b19565b601c55565b6008546001600160a01b031633146113ce5760405162461bcd60e51b81526004016109ae90612b19565b601b55565b60608060006113e56001546000540390565b67ffffffffffffffff8111156113fd576113fd6128f8565b604051908082528060200260200182016040528015611426578160200160208202803683370190505b50905060006114386001546000540390565b67ffffffffffffffff811115611450576114506128f8565b604051908082528060200260200182016040528015611479578160200160208202803683370190505b50905060005b600154600054038110156114ff5761149681610dc9565b8382815181106114a8576114a8612daa565b6001600160a01b0390921660209283029190910182015260008281526013909152604090205482518390839081106114e2576114e2612daa565b6020908102919091010152806114f781612c49565b91505061147f565b5090939092509050565b836001600160a01b03811633146115235761152333611ca4565b61101a858585856121f8565b6002600954036115815760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016109ae565b60026009553233146115d55760405162461bcd60e51b815260206004820152601f60248201527f7468652063616c6c657220697320616e6f7468657220636f6e74726163742e0060448201526064016109ae565b60165460ff16156116195760405162461bcd60e51b815260206004820152600e60248201526d1b5a5b9d1a5b99c81c185d5cd95960921b60448201526064016109ae565b6040516bffffffffffffffffffffffff193360601b16602082015260009060340160405160208183030381529060405280519060200120905061169383838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050601054915084905061223c565b6116cf5760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b210383937b7b360991b60448201526064016109ae565b60006116dd85336001611a5e565b90508034146116fe5760405162461bcd60e51b81526004016109ae90612d68565b6017548561170f6001546000540390565b6117199190612bf8565b11156117375760405162461bcd60e51b81526004016109ae90612c0b565b60006117466001546000540390565b9050600060018761175a6001546000540390565b6117649190612bf8565b61176e9190612c36565b905061177a3388612071565b815b8181116117a65760008181526013602052604090204290558061179e81612c49565b91505061177c565b50506001600955505050505050565b6008546001600160a01b031633146117df5760405162461bcd60e51b81526004016109ae90612b19565b600091825260146020908152604080842092909255601590529020805460ff19166001179055565b6008546001600160a01b031633146118315760405162461bcd60e51b81526004016109ae90612b19565b6016805460ff191682151590811790915560ff16610cb8574260125550565b606061185b82611c7d565b6118bf5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016109ae565b600e6118ca83612252565b6040516020016118db929190612dc0565b6040516020818303038152906040529050919050565b6008546001600160a01b0316331461191b5760405162461bcd60e51b81526004016109ae90612b19565b6011546001600160a01b03166119a95760405162461bcd60e51b815260206004820152604760248201527f73706c69742061646472657373206e6f74207365742c20706c6561736520736560448201527f742073706c69742061646472657373206265666f7265207570646174696e6720606482015266726f79616c747960c81b608482015260a4016109ae565b601880546bffffffffffffffffffffffff19166001600160601b038316908117909155601154610cb8916001600160a01b039091169061208f565b6008546001600160a01b03163314611a0e5760405162461bcd60e51b81526004016109ae90612b19565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b600080611a6a84611021565b90506000611a7785610d0f565b601954909150828015611a8e57508180611a8e5750845b15611a9c5750601c54611abe565b8215611aab5750601b54611abe565b8180611ab45750845b15611abe5750601a545b6000611aca8883612b9e565b60008981526015602052604090205490915060ff1615611b285760008881526014602052604081205490611aff606483612bcb565b8a601954611b0d9190612b9e565b611b179190612b9e565b9050611b238184612c36565b925050505b979650505050505050565b6008546001600160a01b03163314611b5d5760405162461bcd60e51b81526004016109ae90612b19565b6001600160a01b038116611bc25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109ae565b610cb88161201f565b6008546001600160a01b03163314611bf55760405162461bcd60e51b81526004016109ae90612b19565b601955565b60006301ffc9a760e01b6001600160e01b031983161480611c2b57506380ac58cd60e01b6001600160e01b03198316145b8061097e5750506001600160e01b031916635b5e139f60e01b1490565b60006001600160e01b0319821663152a902d60e11b148061097e57506301ffc9a760e01b6001600160e01b031983161461097e565b600080548210801561097e575050600090815260046020526040902054600160e01b161590565b6daaeb6d7670e522a718067333cd4e3b15610cb857604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611d11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d359190612e47565b610cb857604051633b79c77360e21b81526001600160a01b03821660048201526024016109ae565b6000611d6882610dc9565b9050336001600160a01b03821614611da157611d848133611a30565b611da1576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611e0882611fb1565b9050836001600160a01b0316816001600160a01b031614611e3b5760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b03881690911417611e8857611e6b8633611a30565b611e8857604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038516611eaf57604051633a954ecd60e21b815260040160405180910390fd5b8015611eba57600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040812091909155600160e11b84169003611f4c57600184016000818152600460205260408120549003611f4a576000548114611f4a5760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b610acc83838360405180602001604052806000815250611509565b6000816000548110156120065760008181526004602052604081205490600160e01b82169003612004575b80600003611ffd575060001901600081815260046020526040902054611fdc565b9392505050565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61208b82826040518060200160405280600081525061235b565b5050565b6127106001600160601b03821611156120fd5760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b60648201526084016109ae565b6001600160a01b0382166121535760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c69642072656365697665720000000000000060448201526064016109ae565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600a55565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b612203848484610ad1565b6001600160a01b0383163b15610af65761221f848484846123c1565b610af6576040516368d2bf6b60e11b815260040160405180910390fd5b60008261224985846124ac565b14949350505050565b6060816000036122795750506040805180820190915260018152600360fc1b602082015290565b8160005b81156122a3578061228d81612c49565b915061229c9050600a83612bcb565b915061227d565b60008167ffffffffffffffff8111156122be576122be6128f8565b6040519080825280601f01601f1916602001820160405280156122e8576020820181803683370190505b5090505b8415612353576122fd600183612c36565b915061230a600a86612e64565b612315906030612bf8565b60f81b81838151811061232a5761232a612daa565b60200101906001600160f81b031916908160001a90535061234c600a86612bcb565b94506122ec565b949350505050565b61236583836124f9565b6001600160a01b0383163b15610acc576000548281035b61238f60008683806001019450866123c1565b6123ac576040516368d2bf6b60e11b815260040160405180910390fd5b81811061237c57816000541461101a57600080fd5b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906123f6903390899088908890600401612e78565b6020604051808303816000875af1925050508015612431575060408051601f3d908101601f1916820190925261242e91810190612eb5565b60015b61248f573d80801561245f576040519150601f19603f3d011682016040523d82523d6000602084013e612464565b606091505b508051600003612487576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b600081815b84518110156124f1576124dd828683815181106124d0576124d0612daa565b60200260200101516125f7565b9150806124e981612c49565b9150506124b1565b509392505050565b600080549082900361251e5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b8181146125cd57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600101612595565b50816000036125ee57604051622e076360e81b815260040160405180910390fd5b60005550505050565b6000818310612613576000828152602084905260409020611ffd565b5060009182526020526040902090565b6001600160e01b031981168114610cb857600080fd5b60006020828403121561264b57600080fd5b8135611ffd81612623565b80356001600160a01b038116811461266d57600080fd5b919050565b8015158114610cb857600080fd5b6000806040838503121561269357600080fd5b61269c83612656565b915060208301356126ac81612672565b809150509250929050565b60005b838110156126d25781810151838201526020016126ba565b50506000910152565b600081518084526126f38160208601602086016126b7565b601f01601f19169290920160200192915050565b602081526000611ffd60208301846126db565b60006020828403121561272c57600080fd5b5035919050565b6000806040838503121561274657600080fd5b61274f83612656565b946020939093013593505050565b60008060006060848603121561277257600080fd5b61277b84612656565b925061278960208501612656565b9150604084013590509250925092565b600080604083850312156127ac57600080fd5b50508035926020909101359150565b6000602082840312156127cd57600080fd5b611ffd82612656565b600080604083850312156127e957600080fd5b823591506127f960208401612656565b90509250929050565b6000806020838503121561281557600080fd5b823567ffffffffffffffff8082111561282d57600080fd5b818501915085601f83011261284157600080fd5b81358181111561285057600080fd5b86602082850101111561286257600080fd5b60209290920196919550909350505050565b604080825283519082018190526000906020906060840190828701845b828110156128b65781516001600160a01b031684529284019290840190600101612891565b5050508381038285015284518082528583019183019060005b818110156128eb578351835292840192918401916001016128cf565b5090979650505050505050565b634e487b7160e01b600052604160045260246000fd5b6000806000806080858703121561292457600080fd5b61292d85612656565b935061293b60208601612656565b925060408501359150606085013567ffffffffffffffff8082111561295f57600080fd5b818701915087601f83011261297357600080fd5b813581811115612985576129856128f8565b604051601f8201601f19908116603f011681019083821181831017156129ad576129ad6128f8565b816040528281528a60208487010111156129c657600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806000604084860312156129ff57600080fd5b83359250602084013567ffffffffffffffff80821115612a1e57600080fd5b818601915086601f830112612a3257600080fd5b813581811115612a4157600080fd5b8760208260051b8501011115612a5657600080fd5b6020830194508093505050509250925092565b600060208284031215612a7b57600080fd5b8135611ffd81612672565b600060208284031215612a9857600080fd5b81356001600160601b0381168114611ffd57600080fd5b60008060408385031215612ac257600080fd5b612acb83612656565b91506127f960208401612656565b600080600060608486031215612aee57600080fd5b83359250612afe60208501612656565b91506040840135612b0e81612672565b809150509250925092565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c90821680612b6257607f821691505b602082108103612b8257634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761097e5761097e612b88565b634e487b7160e01b600052601260045260246000fd5b600082612bda57612bda612bb5565b500490565b600060208284031215612bf157600080fd5b5051919050565b8082018082111561097e5761097e612b88565b6020808252601190820152706e6f7420656e6f75676820737570706c7960781b604082015260600190565b8181038181111561097e5761097e612b88565b600060018201612c5b57612c5b612b88565b5060010190565b601f821115610acc57600081815260208120601f850160051c81016020861015612c895750805b601f850160051c820191505b81811015611f8e57828155600101612c95565b67ffffffffffffffff831115612cc057612cc06128f8565b612cd483612cce8354612b4e565b83612c62565b6000601f841160018114612d085760008515612cf05750838201355b600019600387901b1c1916600186901b17835561101a565b600083815260209020601f19861690835b82811015612d395786850135825560209485019460019092019101612d19565b5086821015612d565760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60208082526022908201527f646964206e6f742073656e6420636f727265637420616d6f756e74206f6620656040820152610e8d60f31b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b6000808454612dce81612b4e565b60018281168015612de65760018114612dfb57612e2a565b60ff1984168752821515830287019450612e2a565b8860005260208060002060005b85811015612e215781548a820152908401908201612e08565b50505082870194505b505050508351612e3e8183602088016126b7565b01949350505050565b600060208284031215612e5957600080fd5b8151611ffd81612672565b600082612e7357612e73612bb5565b500690565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612eab908301846126db565b9695505050505050565b600060208284031215612ec757600080fd5b8151611ffd8161262356fea264697066735822122025e8170a00c74ddfbb751b2050ab79879b4bde2c3a51ec158e6dff44817a78e064736f6c63430008110033
Deployed Bytecode
0x6080604052600436106102ff5760003560e01c80638da5cb5b11610190578063b9e35574116100dc578063e775920c11610095578063f1b0aa151161006f578063f1b0aa15146108d7578063f2fde38b14610904578063f765417614610924578063fd5baa881461094457600080fd5b8063e775920c14610877578063e985e9c514610897578063f0ee9b9e146108b757600080fd5b8063b9e35574146107b4578063bb30ac49146107c7578063c4c6be75146107e7578063c7d0db0414610817578063c87b56dd14610837578063e5ad0b2b1461085757600080fd5b8063a44acf1e11610149578063aa98e0c611610123578063aa98e0c614610748578063aab4ece51461075e578063abb1dc441461077e578063b88d4fde146107a157600080fd5b8063a44acf1e146106db578063a79c00e314610708578063a91657b71461072857600080fd5b80638da5cb5b1461063f578063931688cb1461065d578063931e2e491461067d57806395d89b4114610693578063a0712d68146106a8578063a22cb465146106bb57600080fd5b806353df5c7c1161024f57806370a08231116102085780637e4831d3116101e25780637e4831d3146105c557806383a076be146105df578063847e3d0d146105ff578063856e05041461061f57600080fd5b806370a0823114610570578063715018a6146105905780637a7aa287146105a557600080fd5b806353df5c7c146104c75780635d148e5c146104dc5780636352211e146104fb57806364c1caf81461051b57806369b2f16e1461053b5780636c0360eb1461055b57600080fd5b806323b872dd116102bc57806341f434341161029657806341f434341461045257806342842e0e146104745780634783f0ef146104875780635273ca15146104a757600080fd5b806323b872dd146103eb5780632a55205a146103fe5780633ccfd60b1461043d57600080fd5b806301ffc9a71461030457806302acd0881461033957806306fdde031461035b578063081812fc1461037d578063095ea7b3146103b557806318160ddd146103c8575b600080fd5b34801561031057600080fd5b5061032461031f366004612639565b610964565b60405190151581526020015b60405180910390f35b34801561034557600080fd5b50610359610354366004612680565b610984565b005b34801561036757600080fd5b506103706109e2565b6040516103309190612707565b34801561038957600080fd5b5061039d61039836600461271a565b610a74565b6040516001600160a01b039091168152602001610330565b6103596103c3366004612733565b610ab8565b3480156103d457600080fd5b50600154600054035b604051908152602001610330565b6103596103f936600461275d565b610ad1565b34801561040a57600080fd5b5061041e610419366004612799565b610afc565b604080516001600160a01b039093168352602083019190915201610330565b34801561044957600080fd5b50610359610ba8565b34801561045e57600080fd5b5061039d6daaeb6d7670e522a718067333cd4e81565b61035961048236600461275d565b610cbb565b34801561049357600080fd5b506103596104a236600461271a565b610ce0565b3480156104b357600080fd5b506103246104c23660046127bb565b610d0f565b3480156104d357600080fd5b50610359610d8e565b3480156104e857600080fd5b5060165461032490610100900460ff1681565b34801561050757600080fd5b5061039d61051636600461271a565b610dc9565b34801561052757600080fd5b50600c5461039d906001600160a01b031681565b34801561054757600080fd5b50600d5461039d906001600160a01b031681565b34801561056757600080fd5b50610370610dd4565b34801561057c57600080fd5b506103dd61058b3660046127bb565b610e62565b34801561059c57600080fd5b50610359610eb1565b3480156105b157600080fd5b506103596105c036600461271a565b610ee7565b3480156105d157600080fd5b506016546103249060ff1681565b3480156105eb57600080fd5b506103596105fa3660046127d6565b610f16565b34801561060b57600080fd5b5061032461061a3660046127bb565b611021565b34801561062b57600080fd5b5061035961063a3660046127bb565b61105a565b34801561064b57600080fd5b506008546001600160a01b031661039d565b34801561066957600080fd5b50610359610678366004612802565b6110b8565b34801561068957600080fd5b506103dd60125481565b34801561069f57600080fd5b50610370611139565b6103596106b636600461271a565b611148565b3480156106c757600080fd5b506103596106d6366004612680565b611315565b3480156106e757600080fd5b506103dd6106f636600461271a565b60146020526000908152604090205481565b34801561071457600080fd5b506103596107233660046127bb565b611329565b34801561073457600080fd5b5061035961074336600461271a565b611375565b34801561075457600080fd5b506103dd60105481565b34801561076a57600080fd5b5061035961077936600461271a565b6113a4565b34801561078a57600080fd5b506107936113d3565b604051610330929190612874565b6103596107af36600461290e565b611509565b6103596107c23660046129ea565b61152f565b3480156107d357600080fd5b506103596107e2366004612799565b6117b5565b3480156107f357600080fd5b5061032461080236600461271a565b60156020526000908152604090205460ff1681565b34801561082357600080fd5b50610359610832366004612a69565b611807565b34801561084357600080fd5b5061037061085236600461271a565b611850565b34801561086357600080fd5b50610359610872366004612a86565b6118f1565b34801561088357600080fd5b506103596108923660046127bb565b6119e4565b3480156108a357600080fd5b506103246108b2366004612aaf565b611a30565b3480156108c357600080fd5b506103dd6108d2366004612ad9565b611a5e565b3480156108e357600080fd5b506103dd6108f236600461271a565b60136020526000908152604090205481565b34801561091057600080fd5b5061035961091f3660046127bb565b611b33565b34801561093057600080fd5b5060115461039d906001600160a01b031681565b34801561095057600080fd5b5061035961095f36600461271a565b611bcb565b600061096f82611bfa565b8061097e575061097e82611c48565b92915050565b6008546001600160a01b031633146109b75760405162461bcd60e51b81526004016109ae90612b19565b60405180910390fd5b6001600160a01b03919091166000908152600f60205260409020805460ff1916911515919091179055565b6060600280546109f190612b4e565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1d90612b4e565b8015610a6a5780601f10610a3f57610100808354040283529160200191610a6a565b820191906000526020600020905b815481529060010190602001808311610a4d57829003601f168201915b5050505050905090565b6000610a7f82611c7d565b610a9c576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b81610ac281611ca4565b610acc8383611d5d565b505050565b826001600160a01b0381163314610aeb57610aeb33611ca4565b610af6848484611dfd565b50505050565b6000828152600b602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291610b71575060408051808201909152600a546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610b90906001600160601b031687612b9e565b610b9a9190612bcb565b915196919550909350505050565b6008546001600160a01b03163314610bd25760405162461bcd60e51b81526004016109ae90612b19565b6011546001600160a01b0316610c225760405162461bcd60e51b81526020600482015260156024820152741cdc1b1a5d081859191c995cdcc81b9bdd081cd95d605a1b60448201526064016109ae565b6011546040516000916001600160a01b03169047908381818185875af1925050503d8060008114610c6f576040519150601f19603f3d011682016040523d82523d6000602084013e610c74565b606091505b5050905080610cb85760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b60448201526064016109ae565b50565b826001600160a01b0381163314610cd557610cd533611ca4565b610af6848484611f96565b6008546001600160a01b03163314610d0a5760405162461bcd60e51b81526004016109ae90612b19565b601055565b600d546040516370a0823160e01b81526001600160a01b03838116600483015260009216908290819083906370a08231906024015b602060405180830381865afa158015610d61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d859190612bdf565b11949350505050565b6008546001600160a01b03163314610db85760405162461bcd60e51b81526004016109ae90612b19565b6016805461ff001916610100179055565b600061097e82611fb1565b600e8054610de190612b4e565b80601f0160208091040260200160405190810160405280929190818152602001828054610e0d90612b4e565b8015610e5a5780601f10610e2f57610100808354040283529160200191610e5a565b820191906000526020600020905b815481529060010190602001808311610e3d57829003601f168201915b505050505081565b60006001600160a01b038216610e8b576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6008546001600160a01b03163314610edb5760405162461bcd60e51b81526004016109ae90612b19565b610ee5600061201f565b565b6008546001600160a01b03163314610f115760405162461bcd60e51b81526004016109ae90612b19565b601a55565b336000908152600f602052604090205460ff161515600114610f725760405162461bcd60e51b81526020600482015260156024820152741bdb9b1e4819da599d195c9cc818d85b8819da599d605a1b60448201526064016109ae565b60175482610f836001546000540390565b610f8d9190612bf8565b1115610fab5760405162461bcd60e51b81526004016109ae90612c0b565b6000610fba6001546000540390565b90506000600184610fce6001546000540390565b610fd89190612bf8565b610fe29190612c36565b9050610fee8385612071565b815b81811161101a5760008181526013602052604090204290558061101281612c49565b915050610ff0565b5050505050565b600c546040516370a0823160e01b81526001600160a01b03838116600483015260009216908290819083906370a0823190602401610d44565b6008546001600160a01b031633146110845760405162461bcd60e51b81526004016109ae90612b19565b601180546001600160a01b0319166001600160a01b038316908117909155601854610cb891906001600160601b031661208f565b6008546001600160a01b031633146110e25760405162461bcd60e51b81526004016109ae90612b19565b601654610100900460ff161561112c5760405162461bcd60e51b815260206004820152600f60248201526e18985cd9481d5c9a481b1bd8dad959608a1b60448201526064016109ae565b600e610acc828483612ca8565b6060600380546109f190612b4e565b60026009540361119a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016109ae565b60026009553233146111ee5760405162461bcd60e51b815260206004820152601f60248201527f7468652063616c6c657220697320616e6f7468657220636f6e74726163742e0060448201526064016109ae565b60165460ff16156112325760405162461bcd60e51b815260206004820152600e60248201526d1b5a5b9d1a5b99c81c185d5cd95960921b60448201526064016109ae565b600061124082336000611a5e565b90508034146112615760405162461bcd60e51b81526004016109ae90612d68565b601754826112726001546000540390565b61127c9190612bf8565b111561129a5760405162461bcd60e51b81526004016109ae90612c0b565b60006112a96001546000540390565b905060006001846112bd6001546000540390565b6112c79190612bf8565b6112d19190612c36565b90506112dd3385612071565b815b8181116113095760008181526013602052604090204290558061130181612c49565b9150506112df565b50506001600955505050565b8161131f81611ca4565b610acc838361218c565b6008546001600160a01b031633146113535760405162461bcd60e51b81526004016109ae90612b19565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6008546001600160a01b0316331461139f5760405162461bcd60e51b81526004016109ae90612b19565b601c55565b6008546001600160a01b031633146113ce5760405162461bcd60e51b81526004016109ae90612b19565b601b55565b60608060006113e56001546000540390565b67ffffffffffffffff8111156113fd576113fd6128f8565b604051908082528060200260200182016040528015611426578160200160208202803683370190505b50905060006114386001546000540390565b67ffffffffffffffff811115611450576114506128f8565b604051908082528060200260200182016040528015611479578160200160208202803683370190505b50905060005b600154600054038110156114ff5761149681610dc9565b8382815181106114a8576114a8612daa565b6001600160a01b0390921660209283029190910182015260008281526013909152604090205482518390839081106114e2576114e2612daa565b6020908102919091010152806114f781612c49565b91505061147f565b5090939092509050565b836001600160a01b03811633146115235761152333611ca4565b61101a858585856121f8565b6002600954036115815760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016109ae565b60026009553233146115d55760405162461bcd60e51b815260206004820152601f60248201527f7468652063616c6c657220697320616e6f7468657220636f6e74726163742e0060448201526064016109ae565b60165460ff16156116195760405162461bcd60e51b815260206004820152600e60248201526d1b5a5b9d1a5b99c81c185d5cd95960921b60448201526064016109ae565b6040516bffffffffffffffffffffffff193360601b16602082015260009060340160405160208183030381529060405280519060200120905061169383838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050601054915084905061223c565b6116cf5760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b210383937b7b360991b60448201526064016109ae565b60006116dd85336001611a5e565b90508034146116fe5760405162461bcd60e51b81526004016109ae90612d68565b6017548561170f6001546000540390565b6117199190612bf8565b11156117375760405162461bcd60e51b81526004016109ae90612c0b565b60006117466001546000540390565b9050600060018761175a6001546000540390565b6117649190612bf8565b61176e9190612c36565b905061177a3388612071565b815b8181116117a65760008181526013602052604090204290558061179e81612c49565b91505061177c565b50506001600955505050505050565b6008546001600160a01b031633146117df5760405162461bcd60e51b81526004016109ae90612b19565b600091825260146020908152604080842092909255601590529020805460ff19166001179055565b6008546001600160a01b031633146118315760405162461bcd60e51b81526004016109ae90612b19565b6016805460ff191682151590811790915560ff16610cb8574260125550565b606061185b82611c7d565b6118bf5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016109ae565b600e6118ca83612252565b6040516020016118db929190612dc0565b6040516020818303038152906040529050919050565b6008546001600160a01b0316331461191b5760405162461bcd60e51b81526004016109ae90612b19565b6011546001600160a01b03166119a95760405162461bcd60e51b815260206004820152604760248201527f73706c69742061646472657373206e6f74207365742c20706c6561736520736560448201527f742073706c69742061646472657373206265666f7265207570646174696e6720606482015266726f79616c747960c81b608482015260a4016109ae565b601880546bffffffffffffffffffffffff19166001600160601b038316908117909155601154610cb8916001600160a01b039091169061208f565b6008546001600160a01b03163314611a0e5760405162461bcd60e51b81526004016109ae90612b19565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b600080611a6a84611021565b90506000611a7785610d0f565b601954909150828015611a8e57508180611a8e5750845b15611a9c5750601c54611abe565b8215611aab5750601b54611abe565b8180611ab45750845b15611abe5750601a545b6000611aca8883612b9e565b60008981526015602052604090205490915060ff1615611b285760008881526014602052604081205490611aff606483612bcb565b8a601954611b0d9190612b9e565b611b179190612b9e565b9050611b238184612c36565b925050505b979650505050505050565b6008546001600160a01b03163314611b5d5760405162461bcd60e51b81526004016109ae90612b19565b6001600160a01b038116611bc25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109ae565b610cb88161201f565b6008546001600160a01b03163314611bf55760405162461bcd60e51b81526004016109ae90612b19565b601955565b60006301ffc9a760e01b6001600160e01b031983161480611c2b57506380ac58cd60e01b6001600160e01b03198316145b8061097e5750506001600160e01b031916635b5e139f60e01b1490565b60006001600160e01b0319821663152a902d60e11b148061097e57506301ffc9a760e01b6001600160e01b031983161461097e565b600080548210801561097e575050600090815260046020526040902054600160e01b161590565b6daaeb6d7670e522a718067333cd4e3b15610cb857604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611d11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d359190612e47565b610cb857604051633b79c77360e21b81526001600160a01b03821660048201526024016109ae565b6000611d6882610dc9565b9050336001600160a01b03821614611da157611d848133611a30565b611da1576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611e0882611fb1565b9050836001600160a01b0316816001600160a01b031614611e3b5760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b03881690911417611e8857611e6b8633611a30565b611e8857604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038516611eaf57604051633a954ecd60e21b815260040160405180910390fd5b8015611eba57600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040812091909155600160e11b84169003611f4c57600184016000818152600460205260408120549003611f4a576000548114611f4a5760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b610acc83838360405180602001604052806000815250611509565b6000816000548110156120065760008181526004602052604081205490600160e01b82169003612004575b80600003611ffd575060001901600081815260046020526040902054611fdc565b9392505050565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61208b82826040518060200160405280600081525061235b565b5050565b6127106001600160601b03821611156120fd5760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b60648201526084016109ae565b6001600160a01b0382166121535760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c69642072656365697665720000000000000060448201526064016109ae565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600a55565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b612203848484610ad1565b6001600160a01b0383163b15610af65761221f848484846123c1565b610af6576040516368d2bf6b60e11b815260040160405180910390fd5b60008261224985846124ac565b14949350505050565b6060816000036122795750506040805180820190915260018152600360fc1b602082015290565b8160005b81156122a3578061228d81612c49565b915061229c9050600a83612bcb565b915061227d565b60008167ffffffffffffffff8111156122be576122be6128f8565b6040519080825280601f01601f1916602001820160405280156122e8576020820181803683370190505b5090505b8415612353576122fd600183612c36565b915061230a600a86612e64565b612315906030612bf8565b60f81b81838151811061232a5761232a612daa565b60200101906001600160f81b031916908160001a90535061234c600a86612bcb565b94506122ec565b949350505050565b61236583836124f9565b6001600160a01b0383163b15610acc576000548281035b61238f60008683806001019450866123c1565b6123ac576040516368d2bf6b60e11b815260040160405180910390fd5b81811061237c57816000541461101a57600080fd5b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906123f6903390899088908890600401612e78565b6020604051808303816000875af1925050508015612431575060408051601f3d908101601f1916820190925261242e91810190612eb5565b60015b61248f573d80801561245f576040519150601f19603f3d011682016040523d82523d6000602084013e612464565b606091505b508051600003612487576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b600081815b84518110156124f1576124dd828683815181106124d0576124d0612daa565b60200260200101516125f7565b9150806124e981612c49565b9150506124b1565b509392505050565b600080549082900361251e5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b8181146125cd57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600101612595565b50816000036125ee57604051622e076360e81b815260040160405180910390fd5b60005550505050565b6000818310612613576000828152602084905260409020611ffd565b5060009182526020526040902090565b6001600160e01b031981168114610cb857600080fd5b60006020828403121561264b57600080fd5b8135611ffd81612623565b80356001600160a01b038116811461266d57600080fd5b919050565b8015158114610cb857600080fd5b6000806040838503121561269357600080fd5b61269c83612656565b915060208301356126ac81612672565b809150509250929050565b60005b838110156126d25781810151838201526020016126ba565b50506000910152565b600081518084526126f38160208601602086016126b7565b601f01601f19169290920160200192915050565b602081526000611ffd60208301846126db565b60006020828403121561272c57600080fd5b5035919050565b6000806040838503121561274657600080fd5b61274f83612656565b946020939093013593505050565b60008060006060848603121561277257600080fd5b61277b84612656565b925061278960208501612656565b9150604084013590509250925092565b600080604083850312156127ac57600080fd5b50508035926020909101359150565b6000602082840312156127cd57600080fd5b611ffd82612656565b600080604083850312156127e957600080fd5b823591506127f960208401612656565b90509250929050565b6000806020838503121561281557600080fd5b823567ffffffffffffffff8082111561282d57600080fd5b818501915085601f83011261284157600080fd5b81358181111561285057600080fd5b86602082850101111561286257600080fd5b60209290920196919550909350505050565b604080825283519082018190526000906020906060840190828701845b828110156128b65781516001600160a01b031684529284019290840190600101612891565b5050508381038285015284518082528583019183019060005b818110156128eb578351835292840192918401916001016128cf565b5090979650505050505050565b634e487b7160e01b600052604160045260246000fd5b6000806000806080858703121561292457600080fd5b61292d85612656565b935061293b60208601612656565b925060408501359150606085013567ffffffffffffffff8082111561295f57600080fd5b818701915087601f83011261297357600080fd5b813581811115612985576129856128f8565b604051601f8201601f19908116603f011681019083821181831017156129ad576129ad6128f8565b816040528281528a60208487010111156129c657600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806000604084860312156129ff57600080fd5b83359250602084013567ffffffffffffffff80821115612a1e57600080fd5b818601915086601f830112612a3257600080fd5b813581811115612a4157600080fd5b8760208260051b8501011115612a5657600080fd5b6020830194508093505050509250925092565b600060208284031215612a7b57600080fd5b8135611ffd81612672565b600060208284031215612a9857600080fd5b81356001600160601b0381168114611ffd57600080fd5b60008060408385031215612ac257600080fd5b612acb83612656565b91506127f960208401612656565b600080600060608486031215612aee57600080fd5b83359250612afe60208501612656565b91506040840135612b0e81612672565b809150509250925092565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c90821680612b6257607f821691505b602082108103612b8257634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761097e5761097e612b88565b634e487b7160e01b600052601260045260246000fd5b600082612bda57612bda612bb5565b500490565b600060208284031215612bf157600080fd5b5051919050565b8082018082111561097e5761097e612b88565b6020808252601190820152706e6f7420656e6f75676820737570706c7960781b604082015260600190565b8181038181111561097e5761097e612b88565b600060018201612c5b57612c5b612b88565b5060010190565b601f821115610acc57600081815260208120601f850160051c81016020861015612c895750805b601f850160051c820191505b81811015611f8e57828155600101612c95565b67ffffffffffffffff831115612cc057612cc06128f8565b612cd483612cce8354612b4e565b83612c62565b6000601f841160018114612d085760008515612cf05750838201355b600019600387901b1c1916600186901b17835561101a565b600083815260209020601f19861690835b82811015612d395786850135825560209485019460019092019101612d19565b5086821015612d565760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60208082526022908201527f646964206e6f742073656e6420636f727265637420616d6f756e74206f6620656040820152610e8d60f31b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b6000808454612dce81612b4e565b60018281168015612de65760018114612dfb57612e2a565b60ff1984168752821515830287019450612e2a565b8860005260208060002060005b85811015612e215781548a820152908401908201612e08565b50505082870194505b505050508351612e3e8183602088016126b7565b01949350505050565b600060208284031215612e5957600080fd5b8151611ffd81612672565b600082612e7357612e73612bb5565b500690565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612eab908301846126db565b9695505050505050565b600060208284031215612ec757600080fd5b8151611ffd8161262356fea264697066735822122025e8170a00c74ddfbb751b2050ab79879b4bde2c3a51ec158e6dff44817a78e064736f6c63430008110033
Deployed Bytecode Sourcemap
87268:9096:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;96106:255;;;;;;;;;;-1:-1:-1;96106:255:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;96106:255:0;;;;;;;;90633:118;;;;;;;;;;-1:-1:-1;90633:118:0;;;;;:::i;:::-;;:::i;:::-;;55011:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;61502:218::-;;;;;;;;;;-1:-1:-1;61502:218:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2318:32:1;;;2300:51;;2288:2;2273:18;61502:218:0;2154:203:1;95314:165:0;;;;;;:::i;:::-;;:::i;50762:323::-;;;;;;;;;;-1:-1:-1;51036:12:0;;50823:7;51020:13;:28;50762:323;;;2767:25:1;;;2755:2;2740:18;50762:323:0;2621:177:1;95487:171:0;;;;;;:::i;:::-;;:::i;18141:442::-;;;;;;;;;;-1:-1:-1;18141:442:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;3581:32:1;;;3563:51;;3645:2;3630:18;;3623:34;;;;3536:18;18141:442:0;3389:274:1;94849:232:0;;;;;;;;;;;;;:::i;2867:143::-;;;;;;;;;;;;2967:42;2867:143;;95666:179;;;;;;:::i;:::-;;:::i;89007:134::-;;;;;;;;;;-1:-1:-1;89007:134:0;;;;;:::i;:::-;;:::i;91441:219::-;;;;;;;;;;-1:-1:-1;91441:219:0;;;;;:::i;:::-;;:::i;90546:79::-;;;;;;;;;;;;;:::i;87997:33::-;;;;;;;;;;-1:-1:-1;87997:33:0;;;;;;;;;;;56404:152;;;;;;;;;;-1:-1:-1;56404:152:0;;;;;:::i;:::-;;:::i;87416:78::-;;;;;;;;;;-1:-1:-1;87416:78:0;;;;-1:-1:-1;;;;;87416:78:0;;;87501:79;;;;;;;;;;-1:-1:-1;87501:79:0;;;;-1:-1:-1;;;;;87501:79:0;;;87593:21;;;;;;;;;;;;;:::i;51946:233::-;;;;;;;;;;-1:-1:-1;51946:233:0;;;;;:::i;:::-;;:::i;12824:103::-;;;;;;;;;;;;;:::i;89512:119::-;;;;;;;;;;-1:-1:-1;89512:119:0;;;;;:::i;:::-;;:::i;87961:29::-;;;;;;;;;;-1:-1:-1;87961:29:0;;;;;;;;94276:414;;;;;;;;;;-1:-1:-1;94276:414:0;;;;;:::i;:::-;;:::i;91220:213::-;;;;;;;;;;-1:-1:-1;91220:213:0;;;;;:::i;:::-;;:::i;94698:143::-;;;;;;;;;;-1:-1:-1;94698:143:0;;;;;:::i;:::-;;:::i;12173:87::-;;;;;;;;;;-1:-1:-1;12246:6:0;;-1:-1:-1;;;;;12246:6:0;12173:87;;90111:164;;;;;;;;;;-1:-1:-1;90111:164:0;;;;;:::i;:::-;;:::i;87746:28::-;;;;;;;;;;;;;;;;55187:104;;;;;;;;;;;;;:::i;93628:640::-;;;;;;:::i;:::-;;:::i;95130:176::-;;;;;;;;;;-1:-1:-1;95130:176:0;;;;;:::i;:::-;;:::i;87836:57::-;;;;;;;;;;-1:-1:-1;87836:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;89274:119;;;;;;;;;;-1:-1:-1;89274:119:0;;;;;:::i;:::-;;:::i;89762:143::-;;;;;;;;;;-1:-1:-1;89762:143:0;;;;;:::i;:::-;;:::i;87674:34::-;;;;;;;;;;;;;;;;89639:115;;;;;;;;;;-1:-1:-1;89639:115:0;;;;;:::i;:::-;;:::i;88594:405::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;95853:245::-;;;;;;:::i;:::-;;:::i;92778:842::-;;;;;;:::i;:::-;;:::i;91011:201::-;;;;;;;;;;-1:-1:-1;91011:201:0;;;;;:::i;:::-;;:::i;87900:52::-;;;;;;;;;;-1:-1:-1;87900:52:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;89913:190;;;;;;;;;;-1:-1:-1;89913:190:0;;;;;:::i;:::-;;:::i;90283:255::-;;;;;;;;;;-1:-1:-1;90283:255:0;;;;;:::i;:::-;;:::i;88323:263::-;;;;;;;;;;-1:-1:-1;88323:263:0;;;;;:::i;:::-;;:::i;89149:117::-;;;;;;;;;;-1:-1:-1;89149:117:0;;;;;:::i;:::-;;:::i;62451:164::-;;;;;;;;;;-1:-1:-1;62451:164:0;;;;;:::i;:::-;;:::i;91939:831::-;;;;;;;;;;-1:-1:-1;91939:831:0;;;;;:::i;:::-;;:::i;87783:44::-;;;;;;;;;;-1:-1:-1;87783:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;13082:201;;;;;;;;;;-1:-1:-1;13082:201:0;;;;;:::i;:::-;;:::i;87717:20::-;;;;;;;;;;-1:-1:-1;87717:20:0;;;;-1:-1:-1;;;;;87717:20:0;;;89401:103;;;;;;;;;;-1:-1:-1;89401:103:0;;;;;:::i;:::-;;:::i;96106:255::-;96221:4;96259:38;96285:11;96259:25;:38::i;:::-;:94;;;;96315:38;96341:11;96315:25;:38::i;:::-;96238:115;96106:255;-1:-1:-1;;96106:255:0:o;90633:118::-;12246:6;;-1:-1:-1;;;;;12246:6:0;10977:10;12393:23;12385:68;;;;-1:-1:-1;;;12385:68:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;90716:17:0;;;::::1;;::::0;;;:7:::1;:17;::::0;;;;:27;;-1:-1:-1;;90716:27:0::1;::::0;::::1;;::::0;;;::::1;::::0;;90633:118::o;55011:100::-;55065:13;55098:5;55091:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55011:100;:::o;61502:218::-;61578:7;61603:16;61611:7;61603;:16::i;:::-;61598:64;;61628:34;;-1:-1:-1;;;61628:34:0;;;;;;;;;;;61598:64;-1:-1:-1;61682:24:0;;;;:15;:24;;;;;:30;-1:-1:-1;;;;;61682:30:0;;61502:218::o;95314:165::-;95418:8;4388:30;4409:8;4388:20;:30::i;:::-;95439:32:::1;95453:8;95463:7;95439:13;:32::i;:::-;95314:165:::0;;;:::o;95487:171::-;95596:4;-1:-1:-1;;;;;4208:18:0;;4216:10;4208:18;4204:83;;4243:32;4264:10;4243:20;:32::i;:::-;95613:37:::1;95632:4;95638:2;95642:7;95613:18;:37::i;:::-;95487:171:::0;;;;:::o;18141:442::-;18238:7;18296:27;;;:17;:27;;;;;;;;18267:56;;;;;;;;;-1:-1:-1;;;;;18267:56:0;;;;;-1:-1:-1;;;18267:56:0;;;-1:-1:-1;;;;;18267:56:0;;;;;;;;18238:7;;18336:92;;-1:-1:-1;18387:29:0;;;;;;;;;18397:19;18387:29;-1:-1:-1;;;;;18387:29:0;;;;-1:-1:-1;;;18387:29:0;;-1:-1:-1;;;;;18387:29:0;;;;;18336:92;18478:23;;;;18440:21;;18949:5;;18465:36;;-1:-1:-1;;;;;18465:36:0;:10;:36;:::i;:::-;18464:58;;;;:::i;:::-;18543:16;;;;;-1:-1:-1;18141:442:0;;-1:-1:-1;;;;18141:442:0:o;94849:232::-;12246:6;;-1:-1:-1;;;;;12246:6:0;10977:10;12393:23;12385:68;;;;-1:-1:-1;;;12385:68:0;;;;;;;:::i;:::-;94905:5:::1;::::0;-1:-1:-1;;;;;94905:5:0::1;94897:53;;;::::0;-1:-1:-1;;;94897:53:0;;11173:2:1;94897:53:0::1;::::0;::::1;11155:21:1::0;11212:2;11192:18;;;11185:30;-1:-1:-1;;;11231:18:1;;;11224:51;11292:18;;94897:53:0::1;10971:345:1::0;94897:53:0::1;94982:5;::::0;:44:::1;::::0;94964:12:::1;::::0;-1:-1:-1;;;;;94982:5:0::1;::::0;95000:21:::1;::::0;94964:12;94982:44;94964:12;94982:44;95000:21;94982:5;:44:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;94963:63;;;95045:7;95037:36;;;::::0;-1:-1:-1;;;95037:36:0;;11733:2:1;95037:36:0::1;::::0;::::1;11715:21:1::0;11772:2;11752:18;;;11745:30;-1:-1:-1;;;11791:18:1;;;11784:46;11847:18;;95037:36:0::1;11531:340:1::0;95037:36:0::1;94886:195;94849:232::o:0;95666:179::-;95779:4;-1:-1:-1;;;;;4208:18:0;;4216:10;4208:18;4204:83;;4243:32;4264:10;4243:20;:32::i;:::-;95796:41:::1;95819:4;95825:2;95829:7;95796:22;:41::i;89007:134::-:0;12246:6;;-1:-1:-1;;;;;12246:6:0;10977:10;12393:23;12385:68;;;;-1:-1:-1;;;12385:68:0;;;;;;;:::i;:::-;89091:19:::1;:42:::0;89007:134::o;91441:219::-;91549:19;;91595:28;;-1:-1:-1;;;91595:28:0;;-1:-1:-1;;;;;2318:32:1;;;91595:28:0;;;2300:51:1;91501:4:0;;91549:19;;91501:4;;;;91549:19;;91595:22;;2273:18:1;;91595:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:32;;91441:219;-1:-1:-1;;;;91441:219:0:o;90546:79::-;12246:6;;-1:-1:-1;;;;;12246:6:0;10977:10;12393:23;12385:68;;;;-1:-1:-1;;;12385:68:0;;;;;;;:::i;:::-;90597:13:::1;:20:::0;;-1:-1:-1;;90597:20:0::1;;;::::0;;90546:79::o;56404:152::-;56476:7;56519:27;56538:7;56519:18;:27::i;87593:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;51946:233::-;52018:7;-1:-1:-1;;;;;52042:19:0;;52038:60;;52070:28;;-1:-1:-1;;;52070:28:0;;;;;;;;;;;52038:60;-1:-1:-1;;;;;;52116:25:0;;;;;:18;:25;;;;;;46105:13;52116:55;;51946:233::o;12824:103::-;12246:6;;-1:-1:-1;;;;;12246:6:0;10977:10;12393:23;12385:68;;;;-1:-1:-1;;;12385:68:0;;;;;;;:::i;:::-;12889:30:::1;12916:1;12889:18;:30::i;:::-;12824:103::o:0;89512:119::-;12246:6;;-1:-1:-1;;;;;12246:6:0;10977:10;12393:23;12385:68;;;;-1:-1:-1;;;12385:68:0;;;;;;;:::i;:::-;89593:13:::1;:30:::0;89512:119::o;94276:414::-;90808:10;90800:19;;;;:7;:19;;;;;;;;:27;;:19;:27;90792:61;;;;-1:-1:-1;;;90792:61:0;;12267:2:1;90792:61:0;;;12249:21:1;12306:2;12286:18;;;12279:30;-1:-1:-1;;;12325:18:1;;;12318:51;12386:18;;90792:61:0;12065:345:1;90792:61:0;94385:9:::1;;94373:8;94357:13;51036:12:::0;;50823:7;51020:13;:28;;50762:323;94357:13:::1;:24;;;;:::i;:::-;:37;;94349:67;;;;-1:-1:-1::0;;;94349:67:0::1;;;;;;;:::i;:::-;94429:18;94450:13;51036:12:::0;;50823:7;51020:13;:28;;50762:323;94450:13:::1;94429:34;;94474:18;94522:1;94511:8;94495:13;51036:12:::0;;50823:7;51020:13;:28;;50762:323;94495:13:::1;:24;;;;:::i;:::-;:28;;;;:::i;:::-;94474:49;;94536:23;94546:2;94550:8;94536:9;:23::i;:::-;94590:10:::0;94572:111:::1;94608:10;94602:2;:16;94572:111;;94641:12;::::0;;;:8:::1;:12;::::0;;;;94656:15:::1;94641:30:::0;;94650:2;94620:4:::1;94650:2:::0;94620:4:::1;:::i;:::-;;;;94572:111;;;;94338:352;;94276:414:::0;;:::o;91220:213::-;91326:18;;91370:27;;-1:-1:-1;;;91370:27:0;;-1:-1:-1;;;;;2318:32:1;;;91370:27:0;;;2300:51:1;91279:4:0;;91326:18;;91279:4;;;;91326:18;;91370:21;;2273:18:1;;91370:27:0;2154:203:1;94698:143:0;12246:6;;-1:-1:-1;;;;;12246:6:0;10977:10;12393:23;12385:68;;;;-1:-1:-1;;;12385:68:0;;;;;;;:::i;:::-;94769:5:::1;:16:::0;;-1:-1:-1;;;;;;94769:16:0::1;-1:-1:-1::0;;;;;94769:16:0;::::1;::::0;;::::1;::::0;;;94822:10:::1;::::0;94796:37:::1;::::0;94769:16;-1:-1:-1;;;;;94822:10:0::1;94796:18;:37::i;90111:164::-:0;12246:6;;-1:-1:-1;;;;;12246:6:0;10977:10;12393:23;12385:68;;;;-1:-1:-1;;;12385:68:0;;;;;;;:::i;:::-;90201:13:::1;::::0;::::1;::::0;::::1;;;90200:14;90192:42;;;::::0;-1:-1:-1;;;90192:42:0;;13366:2:1;90192:42:0::1;::::0;::::1;13348:21:1::0;13405:2;13385:18;;;13378:30;-1:-1:-1;;;13424:18:1;;;13417:45;13479:18;;90192:42:0::1;13164:339:1::0;90192:42:0::1;90245:7;:22;90255:12:::0;;90245:7;:22:::1;:::i;55187:104::-:0;55243:13;55276:7;55269:14;;;;;:::i;93628:640::-;9271:1;9869:7;;:19;9861:63;;;;-1:-1:-1;;;9861:63:0;;15768:2:1;9861:63:0;;;15750:21:1;15807:2;15787:18;;;15780:30;15846:33;15826:18;;;15819:61;15897:18;;9861:63:0;15566:355:1;9861:63:0;9271:1;10002:7;:18;90924:9:::1;90937:10;90924:23;90916:67;;;::::0;-1:-1:-1;;;90916:67:0;;16128:2:1;90916:67:0::1;::::0;::::1;16110:21:1::0;16167:2;16147:18;;;16140:30;16206:33;16186:18;;;16179:61;16257:18;;90916:67:0::1;15926:355:1::0;90916:67:0::1;93721:10:::2;::::0;::::2;;93720:11;93712:38;;;::::0;-1:-1:-1;;;93712:38:0;;16488:2:1;93712:38:0::2;::::0;::::2;16470:21:1::0;16527:2;16507:18;;;16500:30;-1:-1:-1;;;16546:18:1;;;16539:44;16600:18;;93712:38:0::2;16286:338:1::0;93712:38:0::2;93763:18;93784:39;93795:8;93805:10;93817:5;93784:10;:39::i;:::-;93763:60;;93857:10;93844:9;:23;93836:70;;;;-1:-1:-1::0;;;93836:70:0::2;;;;;;;:::i;:::-;93955:9;;93943:8;93927:13;51036:12:::0;;50823:7;51020:13;:28;;50762:323;93927:13:::2;:24;;;;:::i;:::-;:37;;93919:67;;;;-1:-1:-1::0;;;93919:67:0::2;;;;;;;:::i;:::-;93999:18;94020:13;51036:12:::0;;50823:7;51020:13;:28;;50762:323;94020:13:::2;93999:34;;94044:18;94092:1;94081:8;94065:13;51036:12:::0;;50823:7;51020:13;:28;;50762:323;94065:13:::2;:24;;;;:::i;:::-;:28;;;;:::i;:::-;94044:49;;94106:31;94116:10;94128:8;94106:9;:31::i;:::-;94168:10:::0;94150:111:::2;94186:10;94180:2;:16;94150:111;;94219:12;::::0;;;:8:::2;:12;::::0;;;;94234:15:::2;94219:30:::0;;94228:2;94198:4:::2;94228:2:::0;94198:4:::2;:::i;:::-;;;;94150:111;;;-1:-1:-1::0;;9227:1:0;10181:7;:22;-1:-1:-1;;;93628:640:0:o;95130:176::-;95234:8;4388:30;4409:8;4388:20;:30::i;:::-;95255:43:::1;95279:8;95289;95255:23;:43::i;89274:119::-:0;12246:6;;-1:-1:-1;;;;;12246:6:0;10977:10;12393:23;12385:68;;;;-1:-1:-1;;;12385:68:0;;;;;;;:::i;:::-;89355:19:::1;:30:::0;;-1:-1:-1;;;;;;89355:30:0::1;-1:-1:-1::0;;;;;89355:30:0;;;::::1;::::0;;;::::1;::::0;;89274:119::o;89762:143::-;12246:6;;-1:-1:-1;;;;;12246:6:0;10977:10;12393:23;12385:68;;;;-1:-1:-1;;;12385:68:0;;;;;;;:::i;:::-;89855:19:::1;:42:::0;89762:143::o;89639:115::-;12246:6;;-1:-1:-1;;;;;12246:6:0;10977:10;12393:23;12385:68;;;;-1:-1:-1;;;12385:68:0;;;;;;;:::i;:::-;89718:12:::1;:28:::0;89639:115::o;88594:405::-;88639:16;88657;88686:23;88726:13;51036:12;;50823:7;51020:13;:28;;50762:323;88726:13;88712:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;88712:28:0;;88686:54;;88751:26;88794:13;51036:12;;50823:7;51020:13;:28;;50762:323;88794:13;88780:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;88780:28:0;;88751:57;;88826:9;88821:134;51036:12;;50823:7;51020:13;:28;88841:1;:17;88821:134;;;88892:10;88900:1;88892:7;:10::i;:::-;88880:6;88887:1;88880:9;;;;;;;;:::i;:::-;-1:-1:-1;;;;;88880:22:0;;;:9;;;;;;;;;;:22;88932:11;;;;:8;:11;;;;;;;88917:12;;:9;;88941:1;;88917:12;;;;;;:::i;:::-;;;;;;;;;;:26;88860:3;;;;:::i;:::-;;;;88821:134;;;-1:-1:-1;88973:6:0;;88981:9;;-1:-1:-1;88594:405:0;-1:-1:-1;88594:405:0:o;95853:245::-;96021:4;-1:-1:-1;;;;;4208:18:0;;4216:10;4208:18;4204:83;;4243:32;4264:10;4243:20;:32::i;:::-;96043:47:::1;96066:4;96072:2;96076:7;96085:4;96043:22;:47::i;92778:842::-:0;9271:1;9869:7;;:19;9861:63;;;;-1:-1:-1;;;9861:63:0;;15768:2:1;9861:63:0;;;15750:21:1;15807:2;15787:18;;;15780:30;15846:33;15826:18;;;15819:61;15897:18;;9861:63:0;15566:355:1;9861:63:0;9271:1;10002:7;:18;90924:9:::1;90937:10;90924:23;90916:67;;;::::0;-1:-1:-1;;;90916:67:0;;16128:2:1;90916:67:0::1;::::0;::::1;16110:21:1::0;16167:2;16147:18;;;16140:30;16206:33;16186:18;;;16179:61;16257:18;;90916:67:0::1;15926:355:1::0;90916:67:0::1;92914:10:::2;::::0;::::2;;92913:11;92905:38;;;::::0;-1:-1:-1;;;92905:38:0;;16488:2:1;92905:38:0::2;::::0;::::2;16470:21:1::0;16527:2;16507:18;;;16500:30;-1:-1:-1;;;16546:18:1;;;16539:44;16600:18;;92905:38:0::2;16286:338:1::0;92905:38:0::2;92981:28;::::0;-1:-1:-1;;92998:10:0::2;17313:2:1::0;17309:15;17305:53;92981:28:0::2;::::0;::::2;17293:66:1::0;92956:12:0::2;::::0;17375::1;;92981:28:0::2;;;;;;;;;;;;92971:39;;;;;;92956:54;;93029:58;93048:11;;93029:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;::::0;;;;-1:-1:-1;;93061:19:0::2;::::0;;-1:-1:-1;93082:4:0;;-1:-1:-1;93029:18:0::2;:58::i;:::-;93021:84;;;::::0;-1:-1:-1;;;93021:84:0;;17600:2:1;93021:84:0::2;::::0;::::2;17582:21:1::0;17639:2;17619:18;;;17612:30;-1:-1:-1;;;17658:18:1;;;17651:43;17711:18;;93021:84:0::2;17398:337:1::0;93021:84:0::2;93118:18;93139:38;93150:8;93160:10;93172:4;93139:10;:38::i;:::-;93118:59;;93211:10;93198:9;:23;93190:70;;;;-1:-1:-1::0;;;93190:70:0::2;;;;;;;:::i;:::-;93307:9;;93295:8;93279:13;51036:12:::0;;50823:7;51020:13;:28;;50762:323;93279:13:::2;:24;;;;:::i;:::-;:37;;93271:67;;;;-1:-1:-1::0;;;93271:67:0::2;;;;;;;:::i;:::-;93351:18;93372:13;51036:12:::0;;50823:7;51020:13;:28;;50762:323;93372:13:::2;93351:34;;93396:18;93444:1;93433:8;93417:13;51036:12:::0;;50823:7;51020:13;:28;;50762:323;93417:13:::2;:24;;;;:::i;:::-;:28;;;;:::i;:::-;93396:49;;93458:31;93468:10;93480:8;93458:9;:31::i;:::-;93520:10:::0;93502:111:::2;93538:10;93532:2;:16;93502:111;;93571:12;::::0;;;:8:::2;:12;::::0;;;;93586:15:::2;93571:30:::0;;93580:2;93550:4:::2;93580:2:::0;93550:4:::2;:::i;:::-;;;;93502:111;;;-1:-1:-1::0;;9227:1:0;10181:7;:22;-1:-1:-1;;;;;;92778:842:0:o;91011:201::-;12246:6;;-1:-1:-1;;;;;12246:6:0;10977:10;12393:23;12385:68;;;;-1:-1:-1;;;12385:68:0;;;;;;;:::i;:::-;91109:32:::1;::::0;;;:21:::1;:32;::::0;;;;;;;:47;;;;91167:19:::1;:30:::0;;;;:37;;-1:-1:-1;;91167:37:0::1;91200:4;91167:37;::::0;;91011:201::o;89913:190::-;12246:6;;-1:-1:-1;;;;;12246:6:0;10977:10;12393:23;12385:68;;;;-1:-1:-1;;;12385:68:0;;;;;;;:::i;:::-;89985:10:::1;:24:::0;;-1:-1:-1;;89985:24:0::1;::::0;::::1;;::::0;;::::1;::::0;;;::::1;90026:10:::0;90022:74:::1;;90069:15;90053:13;:31:::0;89913:190;:::o;90283:255::-;90348:13;90382:16;90390:7;90382;:16::i;:::-;90374:76;;;;-1:-1:-1;;;90374:76:0;;17942:2:1;90374:76:0;;;17924:21:1;17981:2;17961:18;;;17954:30;18020:34;18000:18;;;17993:62;-1:-1:-1;;;18071:18:1;;;18064:45;18126:19;;90374:76:0;17740:411:1;90374:76:0;90494:7;90503:25;90520:7;90503:16;:25::i;:::-;90477:52;;;;;;;;;:::i;:::-;;;;;;;;;;;;;90463:67;;90283:255;;;:::o;88323:263::-;12246:6;;-1:-1:-1;;;;;12246:6:0;10977:10;12393:23;12385:68;;;;-1:-1:-1;;;12385:68:0;;;;;;;:::i;:::-;88402:5:::1;::::0;-1:-1:-1;;;;;88402:5:0::1;88394:101;;;::::0;-1:-1:-1;;;88394:101:0;;19383:2:1;88394:101:0::1;::::0;::::1;19365:21:1::0;19422:2;19402:18;;;19395:30;19461:34;19441:18;;;19434:62;19532:34;19512:18;;;19505:62;-1:-1:-1;;;19583:19:1;;;19576:38;19631:19;;88394:101:0::1;19181:475:1::0;88394:101:0::1;88506:10;:24:::0;;-1:-1:-1;;88506:24:0::1;-1:-1:-1::0;;;;;88506:24:0;::::1;::::0;;::::1;::::0;;;88560:5:::1;::::0;88541:37:::1;::::0;-1:-1:-1;;;;;88560:5:0;;::::1;::::0;88541:18:::1;:37::i;89149:117::-:0;12246:6;;-1:-1:-1;;;;;12246:6:0;10977:10;12393:23;12385:68;;;;-1:-1:-1;;;12385:68:0;;;;;;;:::i;:::-;89229:18:::1;:29:::0;;-1:-1:-1;;;;;;89229:29:0::1;-1:-1:-1::0;;;;;89229:29:0;;;::::1;::::0;;;::::1;::::0;;89149:117::o;62451:164::-;-1:-1:-1;;;;;62572:25:0;;;62548:4;62572:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;62451:164::o;91939:831::-;92030:7;92050:11;92064:20;92079:4;92064:14;:20::i;:::-;92050:34;;92095:12;92110:21;92126:4;92110:15;:21::i;:::-;92160:9;;92095:36;;-1:-1:-1;92185:6:0;:34;;;;;92196:7;:22;;;;92207:11;92196:22;92182:260;;;-1:-1:-1;92244:19:0;;92182:260;;;92295:6;92292:150;;;-1:-1:-1;92326:12:0;;92292:150;;;92370:7;:22;;;;92381:11;92370:22;92367:75;;;-1:-1:-1;92417:13:0;;92367:75;92454:13;92470:16;92478:8;92470:5;:16;:::i;:::-;92502:29;;;;:19;:29;;;;;;92454:32;;-1:-1:-1;92502:29:0;;92499:239;;;92548:19;92570:31;;;:21;:31;;;;;;;92666:17;92680:3;92570:31;92666:17;:::i;:::-;92653:8;92641:9;;:20;;;;:::i;:::-;92640:44;;;;:::i;:::-;92618:66;-1:-1:-1;92707:19:0;92618:66;92707:5;:19;:::i;:::-;92699:27;;92533:205;;92499:239;92757:5;91939:831;-1:-1:-1;;;;;;;91939:831:0:o;13082:201::-;12246:6;;-1:-1:-1;;;;;12246:6:0;10977:10;12393:23;12385:68;;;;-1:-1:-1;;;12385:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;13171:22:0;::::1;13163:73;;;::::0;-1:-1:-1;;;13163:73:0;;19863:2:1;13163:73:0::1;::::0;::::1;19845:21:1::0;19902:2;19882:18;;;19875:30;19941:34;19921:18;;;19914:62;-1:-1:-1;;;19992:18:1;;;19985:36;20038:19;;13163:73:0::1;19661:402:1::0;13163:73:0::1;13247:28;13266:8;13247:18;:28::i;89401:103::-:0;12246:6;;-1:-1:-1;;;;;12246:6:0;10977:10;12393:23;12385:68;;;;-1:-1:-1;;;12385:68:0;;;;;;;:::i;:::-;89474:9:::1;:22:::0;89401:103::o;54109:639::-;54194:4;-1:-1:-1;;;;;;;;;54518:25:0;;;;:102;;-1:-1:-1;;;;;;;;;;54595:25:0;;;54518:102;:179;;;-1:-1:-1;;;;;;;;54672:25:0;-1:-1:-1;;;54672:25:0;;54109:639::o;17871:215::-;17973:4;-1:-1:-1;;;;;;17997:41:0;;-1:-1:-1;;;17997:41:0;;:81;;-1:-1:-1;;;;;;;;;;15532:40:0;;;18042:36;15423:157;62873:282;62938:4;63028:13;;63018:7;:23;62975:153;;;;-1:-1:-1;;63079:26:0;;;;:17;:26;;;;;;-1:-1:-1;;;63079:44:0;:49;;62873:282::o;4446:419::-;2967:42;4637:45;:49;4633:225;;4708:67;;-1:-1:-1;;;4708:67:0;;4759:4;4708:67;;;20280:34:1;-1:-1:-1;;;;;20350:15:1;;20330:18;;;20323:43;2967:42:0;;4708;;20215:18:1;;4708:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4703:144;;4803:28;;-1:-1:-1;;;4803:28:0;;-1:-1:-1;;;;;2318:32:1;;4803:28:0;;;2300:51:1;2273:18;;4803:28:0;2154:203:1;60935:408:0;61024:13;61040:16;61048:7;61040;:16::i;:::-;61024:32;-1:-1:-1;10977:10:0;-1:-1:-1;;;;;61073:28:0;;;61069:175;;61121:44;61138:5;10977:10;62451:164;:::i;61121:44::-;61116:128;;61193:35;;-1:-1:-1;;;61193:35:0;;;;;;;;;;;61116:128;61256:24;;;;:15;:24;;;;;;:35;;-1:-1:-1;;;;;;61256:35:0;-1:-1:-1;;;;;61256:35:0;;;;;;;;;61307:28;;61256:24;;61307:28;;;;;;;61013:330;60935:408;;:::o;65141:2825::-;65283:27;65313;65332:7;65313:18;:27::i;:::-;65283:57;;65398:4;-1:-1:-1;;;;;65357:45:0;65373:19;-1:-1:-1;;;;;65357:45:0;;65353:86;;65411:28;;-1:-1:-1;;;65411:28:0;;;;;;;;;;;65353:86;65453:27;64249:24;;;:15;:24;;;;;64477:26;;10977:10;63874:30;;;-1:-1:-1;;;;;63567:28:0;;63852:20;;;63849:56;65639:180;;65732:43;65749:4;10977:10;62451:164;:::i;65732:43::-;65727:92;;65784:35;;-1:-1:-1;;;65784:35:0;;;;;;;;;;;65727:92;-1:-1:-1;;;;;65836:16:0;;65832:52;;65861:23;;-1:-1:-1;;;65861:23:0;;;;;;;;;;;65832:52;66033:15;66030:160;;;66173:1;66152:19;66145:30;66030:160;-1:-1:-1;;;;;66570:24:0;;;;;;;:18;:24;;;;;;66568:26;;-1:-1:-1;;66568:26:0;;;66639:22;;;;;;;;;66637:24;;-1:-1:-1;66637:24:0;;;59793:11;59768:23;59764:41;59751:63;-1:-1:-1;;;59751:63:0;66932:26;;;;:17;:26;;;;;:175;;;;-1:-1:-1;;;67227:47:0;;:52;;67223:627;;67332:1;67322:11;;67300:19;67455:30;;;:17;:30;;;;;;:35;;67451:384;;67593:13;;67578:11;:28;67574:242;;67740:30;;;;:17;:30;;;;;:52;;;67574:242;67281:569;67223:627;67897:7;67893:2;-1:-1:-1;;;;;67878:27:0;67887:4;-1:-1:-1;;;;;67878:27:0;;;;;;;;;;;67916:42;65272:2694;;;65141:2825;;;:::o;68062:193::-;68208:39;68225:4;68231:2;68235:7;68208:39;;;;;;;;;;;;:16;:39::i;57559:1275::-;57626:7;57661;57763:13;;57756:4;:20;57752:1015;;;57801:14;57818:23;;;:17;:23;;;;;;;-1:-1:-1;;;57907:24:0;;:29;;57903:845;;58572:113;58579:6;58589:1;58579:11;58572:113;;-1:-1:-1;;;58650:6:0;58632:25;;;;:17;:25;;;;;;58572:113;;;58718:6;57559:1275;-1:-1:-1;;;57559:1275:0:o;57903:845::-;57778:989;57752:1015;58795:31;;-1:-1:-1;;;58795:31:0;;;;;;;;;;;13443:191;13536:6;;;-1:-1:-1;;;;;13553:17:0;;;-1:-1:-1;;;;;;13553:17:0;;;;;;;13586:40;;13536:6;;;13553:17;13536:6;;13586:40;;13517:16;;13586:40;13506:128;13443:191;:::o;79013:112::-;79090:27;79100:2;79104:8;79090:27;;;;;;;;;;;;:9;:27::i;:::-;79013:112;;:::o;19233:332::-;18949:5;-1:-1:-1;;;;;19336:33:0;;;;19328:88;;;;-1:-1:-1;;;19328:88:0;;20829:2:1;19328:88:0;;;20811:21:1;20868:2;20848:18;;;20841:30;20907:34;20887:18;;;20880:62;-1:-1:-1;;;20958:18:1;;;20951:40;21008:19;;19328:88:0;20627:406:1;19328:88:0;-1:-1:-1;;;;;19435:22:0;;19427:60;;;;-1:-1:-1;;;19427:60:0;;21240:2:1;19427:60:0;;;21222:21:1;21279:2;21259:18;;;21252:30;21318:27;21298:18;;;21291:55;21363:18;;19427:60:0;21038:349:1;19427:60:0;19522:35;;;;;;;;;-1:-1:-1;;;;;19522:35:0;;;;;;-1:-1:-1;;;;;19522:35:0;;;;;;;;;;-1:-1:-1;;;19500:57:0;;;;:19;:57;19233:332::o;62060:234::-;10977:10;62155:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;62155:49:0;;;;;;;;;;;;:60;;-1:-1:-1;;62155:60:0;;;;;;;;;;62231:55;;540:41:1;;;62155:49:0;;10977:10;62231:55;;513:18:1;62231:55:0;;;;;;;62060:234;;:::o;68853:407::-;69028:31;69041:4;69047:2;69051:7;69028:12;:31::i;:::-;-1:-1:-1;;;;;69074:14:0;;;:19;69070:183;;69113:56;69144:4;69150:2;69154:7;69163:5;69113:30;:56::i;:::-;69108:145;;69197:40;;-1:-1:-1;;;69197:40:0;;;;;;;;;;;26734:190;26859:4;26912;26883:25;26896:5;26903:4;26883:12;:25::i;:::-;:33;;26734:190;-1:-1:-1;;;;26734:190:0:o;5700:723::-;5756:13;5977:5;5986:1;5977:10;5973:53;;-1:-1:-1;;6004:10:0;;;;;;;;;;;;-1:-1:-1;;;6004:10:0;;;;;5700:723::o;5973:53::-;6051:5;6036:12;6092:78;6099:9;;6092:78;;6125:8;;;;:::i;:::-;;-1:-1:-1;6148:10:0;;-1:-1:-1;6156:2:0;6148:10;;:::i;:::-;;;6092:78;;;6180:19;6212:6;6202:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6202:17:0;;6180:39;;6230:154;6237:10;;6230:154;;6264:11;6274:1;6264:11;;:::i;:::-;;-1:-1:-1;6333:10:0;6341:2;6333:5;:10;:::i;:::-;6320:24;;:2;:24;:::i;:::-;6307:39;;6290:6;6297;6290:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;6290:56:0;;;;;;;;-1:-1:-1;6361:11:0;6370:2;6361:11;;:::i;:::-;;;6230:154;;;6408:6;5700:723;-1:-1:-1;;;;5700:723:0:o;78240:689::-;78371:19;78377:2;78381:8;78371:5;:19::i;:::-;-1:-1:-1;;;;;78432:14:0;;;:19;78428:483;;78472:11;78486:13;78534:14;;;78567:233;78598:62;78637:1;78641:2;78645:7;;;;;;78654:5;78598:30;:62::i;:::-;78593:167;;78696:40;;-1:-1:-1;;;78696:40:0;;;;;;;;;;;78593:167;78795:3;78787:5;:11;78567:233;;78882:3;78865:13;;:20;78861:34;;78887:8;;;71344:716;71528:88;;-1:-1:-1;;;71528:88:0;;71507:4;;-1:-1:-1;;;;;71528:45:0;;;;;:88;;10977:10;;71595:4;;71601:7;;71610:5;;71528:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;71528:88:0;;;;;;;;-1:-1:-1;;71528:88:0;;;;;;;;;;;;:::i;:::-;;;71524:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71811:6;:13;71828:1;71811:18;71807:235;;71857:40;;-1:-1:-1;;;71857:40:0;;;;;;;;;;;71807:235;72000:6;71994:13;71985:6;71981:2;71977:15;71970:38;71524:529;-1:-1:-1;;;;;;71687:64:0;-1:-1:-1;;;71687:64:0;;-1:-1:-1;71344:716:0;;;;;;:::o;27601:296::-;27684:7;27727:4;27684:7;27742:118;27766:5;:12;27762:1;:16;27742:118;;;27815:33;27825:12;27839:5;27845:1;27839:8;;;;;;;;:::i;:::-;;;;;;;27815:9;:33::i;:::-;27800:48;-1:-1:-1;27780:3:0;;;;:::i;:::-;;;;27742:118;;;-1:-1:-1;27877:12:0;27601:296;-1:-1:-1;;;27601:296:0:o;72522:2966::-;72595:20;72618:13;;;72646;;;72642:44;;72668:18;;-1:-1:-1;;;72668:18:0;;;;;;;;;;;72642:44;-1:-1:-1;;;;;73174:22:0;;;;;;:18;:22;;;;46243:2;73174:22;;;:71;;73212:32;73200:45;;73174:71;;;73488:31;;;:17;:31;;;;;-1:-1:-1;60224:15:0;;60198:24;60194:46;59793:11;59768:23;59764:41;59761:52;59751:63;;73488:173;;73723:23;;;;73488:31;;73174:22;;74488:25;73174:22;;74341:335;75002:1;74988:12;74984:20;74942:346;75043:3;75034:7;75031:16;74942:346;;75261:7;75251:8;75248:1;75221:25;75218:1;75215;75210:59;75096:1;75083:15;74942:346;;;74946:77;75321:8;75333:1;75321:13;75317:45;;75343:19;;-1:-1:-1;;;75343:19:0;;;;;;;;;;;75317:45;75379:13;:19;-1:-1:-1;95314:165:0;;;:::o;33808:149::-;33871:7;33902:1;33898;:5;:51;;34033:13;34127:15;;;34163:4;34156:15;;;34210:4;34194:21;;33898:51;;;-1:-1:-1;34033:13:0;34127:15;;;34163:4;34156:15;34210:4;34194:21;;;33808:149::o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:173::-;660:20;;-1:-1:-1;;;;;709:31:1;;699:42;;689:70;;755:1;752;745:12;689:70;592:173;;;:::o;770:118::-;856:5;849:13;842:21;835:5;832:32;822:60;;878:1;875;868:12;893:315;958:6;966;1019:2;1007:9;998:7;994:23;990:32;987:52;;;1035:1;1032;1025:12;987:52;1058:29;1077:9;1058:29;:::i;:::-;1048:39;;1137:2;1126:9;1122:18;1109:32;1150:28;1172:5;1150:28;:::i;:::-;1197:5;1187:15;;;893:315;;;;;:::o;1213:250::-;1298:1;1308:113;1322:6;1319:1;1316:13;1308:113;;;1398:11;;;1392:18;1379:11;;;1372:39;1344:2;1337:10;1308:113;;;-1:-1:-1;;1455:1:1;1437:16;;1430:27;1213:250::o;1468:271::-;1510:3;1548:5;1542:12;1575:6;1570:3;1563:19;1591:76;1660:6;1653:4;1648:3;1644:14;1637:4;1630:5;1626:16;1591:76;:::i;:::-;1721:2;1700:15;-1:-1:-1;;1696:29:1;1687:39;;;;1728:4;1683:50;;1468:271;-1:-1:-1;;1468:271:1:o;1744:220::-;1893:2;1882:9;1875:21;1856:4;1913:45;1954:2;1943:9;1939:18;1931:6;1913:45;:::i;1969:180::-;2028:6;2081:2;2069:9;2060:7;2056:23;2052:32;2049:52;;;2097:1;2094;2087:12;2049:52;-1:-1:-1;2120:23:1;;1969:180;-1:-1:-1;1969:180:1:o;2362:254::-;2430:6;2438;2491:2;2479:9;2470:7;2466:23;2462:32;2459:52;;;2507:1;2504;2497:12;2459:52;2530:29;2549:9;2530:29;:::i;:::-;2520:39;2606:2;2591:18;;;;2578:32;;-1:-1:-1;;;2362:254:1:o;2803:328::-;2880:6;2888;2896;2949:2;2937:9;2928:7;2924:23;2920:32;2917:52;;;2965:1;2962;2955:12;2917:52;2988:29;3007:9;2988:29;:::i;:::-;2978:39;;3036:38;3070:2;3059:9;3055:18;3036:38;:::i;:::-;3026:48;;3121:2;3110:9;3106:18;3093:32;3083:42;;2803:328;;;;;:::o;3136:248::-;3204:6;3212;3265:2;3253:9;3244:7;3240:23;3236:32;3233:52;;;3281:1;3278;3271:12;3233:52;-1:-1:-1;;3304:23:1;;;3374:2;3359:18;;;3346:32;;-1:-1:-1;3136:248:1:o;4092:186::-;4151:6;4204:2;4192:9;4183:7;4179:23;4175:32;4172:52;;;4220:1;4217;4210:12;4172:52;4243:29;4262:9;4243:29;:::i;4283:254::-;4351:6;4359;4412:2;4400:9;4391:7;4387:23;4383:32;4380:52;;;4428:1;4425;4418:12;4380:52;4464:9;4451:23;4441:33;;4493:38;4527:2;4516:9;4512:18;4493:38;:::i;:::-;4483:48;;4283:254;;;;;:::o;4542:592::-;4613:6;4621;4674:2;4662:9;4653:7;4649:23;4645:32;4642:52;;;4690:1;4687;4680:12;4642:52;4730:9;4717:23;4759:18;4800:2;4792:6;4789:14;4786:34;;;4816:1;4813;4806:12;4786:34;4854:6;4843:9;4839:22;4829:32;;4899:7;4892:4;4888:2;4884:13;4880:27;4870:55;;4921:1;4918;4911:12;4870:55;4961:2;4948:16;4987:2;4979:6;4976:14;4973:34;;;5003:1;5000;4993:12;4973:34;5048:7;5043:2;5034:6;5030:2;5026:15;5022:24;5019:37;5016:57;;;5069:1;5066;5059:12;5016:57;5100:2;5092:11;;;;;5122:6;;-1:-1:-1;4542:592:1;;-1:-1:-1;;;;4542:592:1:o;5321:1178::-;5589:2;5601:21;;;5671:13;;5574:18;;;5693:22;;;5541:4;;5768;;5746:2;5731:18;;;5795:15;;;5541:4;5838:195;5852:6;5849:1;5846:13;5838:195;;;5917:13;;-1:-1:-1;;;;;5913:39:1;5901:52;;5973:12;;;;6008:15;;;;5949:1;5867:9;5838:195;;;-1:-1:-1;;;6069:19:1;;;6049:18;;;6042:47;6139:13;;6161:21;;;6237:15;;;;6200:12;;;6272:1;6282:189;6298:8;6293:3;6290:17;6282:189;;;6367:15;;6353:30;;6444:17;;;;6405:14;;;;6326:1;6317:11;6282:189;;;-1:-1:-1;6488:5:1;;5321:1178;-1:-1:-1;;;;;;;5321:1178:1:o;6504:127::-;6565:10;6560:3;6556:20;6553:1;6546:31;6596:4;6593:1;6586:15;6620:4;6617:1;6610:15;6636:1138;6731:6;6739;6747;6755;6808:3;6796:9;6787:7;6783:23;6779:33;6776:53;;;6825:1;6822;6815:12;6776:53;6848:29;6867:9;6848:29;:::i;:::-;6838:39;;6896:38;6930:2;6919:9;6915:18;6896:38;:::i;:::-;6886:48;;6981:2;6970:9;6966:18;6953:32;6943:42;;7036:2;7025:9;7021:18;7008:32;7059:18;7100:2;7092:6;7089:14;7086:34;;;7116:1;7113;7106:12;7086:34;7154:6;7143:9;7139:22;7129:32;;7199:7;7192:4;7188:2;7184:13;7180:27;7170:55;;7221:1;7218;7211:12;7170:55;7257:2;7244:16;7279:2;7275;7272:10;7269:36;;;7285:18;;:::i;:::-;7360:2;7354:9;7328:2;7414:13;;-1:-1:-1;;7410:22:1;;;7434:2;7406:31;7402:40;7390:53;;;7458:18;;;7478:22;;;7455:46;7452:72;;;7504:18;;:::i;:::-;7544:10;7540:2;7533:22;7579:2;7571:6;7564:18;7619:7;7614:2;7609;7605;7601:11;7597:20;7594:33;7591:53;;;7640:1;7637;7630:12;7591:53;7696:2;7691;7687;7683:11;7678:2;7670:6;7666:15;7653:46;7741:1;7736:2;7731;7723:6;7719:15;7715:24;7708:35;7762:6;7752:16;;;;;;;6636:1138;;;;;;;:::o;7779:683::-;7874:6;7882;7890;7943:2;7931:9;7922:7;7918:23;7914:32;7911:52;;;7959:1;7956;7949:12;7911:52;7995:9;7982:23;7972:33;;8056:2;8045:9;8041:18;8028:32;8079:18;8120:2;8112:6;8109:14;8106:34;;;8136:1;8133;8126:12;8106:34;8174:6;8163:9;8159:22;8149:32;;8219:7;8212:4;8208:2;8204:13;8200:27;8190:55;;8241:1;8238;8231:12;8190:55;8281:2;8268:16;8307:2;8299:6;8296:14;8293:34;;;8323:1;8320;8313:12;8293:34;8376:7;8371:2;8361:6;8358:1;8354:14;8350:2;8346:23;8342:32;8339:45;8336:65;;;8397:1;8394;8387:12;8336:65;8428:2;8424;8420:11;8410:21;;8450:6;8440:16;;;;;7779:683;;;;;:::o;8467:241::-;8523:6;8576:2;8564:9;8555:7;8551:23;8547:32;8544:52;;;8592:1;8589;8582:12;8544:52;8631:9;8618:23;8650:28;8672:5;8650:28;:::i;8713:292::-;8771:6;8824:2;8812:9;8803:7;8799:23;8795:32;8792:52;;;8840:1;8837;8830:12;8792:52;8879:9;8866:23;-1:-1:-1;;;;;8922:5:1;8918:38;8911:5;8908:49;8898:77;;8971:1;8968;8961:12;9010:260;9078:6;9086;9139:2;9127:9;9118:7;9114:23;9110:32;9107:52;;;9155:1;9152;9145:12;9107:52;9178:29;9197:9;9178:29;:::i;:::-;9168:39;;9226:38;9260:2;9249:9;9245:18;9226:38;:::i;9275:383::-;9349:6;9357;9365;9418:2;9406:9;9397:7;9393:23;9389:32;9386:52;;;9434:1;9431;9424:12;9386:52;9470:9;9457:23;9447:33;;9499:38;9533:2;9522:9;9518:18;9499:38;:::i;:::-;9489:48;;9587:2;9576:9;9572:18;9559:32;9600:28;9622:5;9600:28;:::i;:::-;9647:5;9637:15;;;9275:383;;;;;:::o;9663:356::-;9865:2;9847:21;;;9884:18;;;9877:30;9943:34;9938:2;9923:18;;9916:62;10010:2;9995:18;;9663:356::o;10024:380::-;10103:1;10099:12;;;;10146;;;10167:61;;10221:4;10213:6;10209:17;10199:27;;10167:61;10274:2;10266:6;10263:14;10243:18;10240:38;10237:161;;10320:10;10315:3;10311:20;10308:1;10301:31;10355:4;10352:1;10345:15;10383:4;10380:1;10373:15;10237:161;;10024:380;;;:::o;10409:127::-;10470:10;10465:3;10461:20;10458:1;10451:31;10501:4;10498:1;10491:15;10525:4;10522:1;10515:15;10541:168;10614:9;;;10645;;10662:15;;;10656:22;;10642:37;10632:71;;10683:18;;:::i;10714:127::-;10775:10;10770:3;10766:20;10763:1;10756:31;10806:4;10803:1;10796:15;10830:4;10827:1;10820:15;10846:120;10886:1;10912;10902:35;;10917:18;;:::i;:::-;-1:-1:-1;10951:9:1;;10846:120::o;11876:184::-;11946:6;11999:2;11987:9;11978:7;11974:23;11970:32;11967:52;;;12015:1;12012;12005:12;11967:52;-1:-1:-1;12038:16:1;;11876:184;-1:-1:-1;11876:184:1:o;12415:125::-;12480:9;;;12501:10;;;12498:36;;;12514:18;;:::i;12545:341::-;12747:2;12729:21;;;12786:2;12766:18;;;12759:30;-1:-1:-1;;;12820:2:1;12805:18;;12798:47;12877:2;12862:18;;12545:341::o;12891:128::-;12958:9;;;12979:11;;;12976:37;;;12993:18;;:::i;13024:135::-;13063:3;13084:17;;;13081:43;;13104:18;;:::i;:::-;-1:-1:-1;13151:1:1;13140:13;;13024:135::o;13634:545::-;13736:2;13731:3;13728:11;13725:448;;;13772:1;13797:5;13793:2;13786:17;13842:4;13838:2;13828:19;13912:2;13900:10;13896:19;13893:1;13889:27;13883:4;13879:38;13948:4;13936:10;13933:20;13930:47;;;-1:-1:-1;13971:4:1;13930:47;14026:2;14021:3;14017:12;14014:1;14010:20;14004:4;14000:31;13990:41;;14081:82;14099:2;14092:5;14089:13;14081:82;;;14144:17;;;14125:1;14114:13;14081:82;;14355:1206;14479:18;14474:3;14471:27;14468:53;;;14501:18;;:::i;:::-;14530:94;14620:3;14580:38;14612:4;14606:11;14580:38;:::i;:::-;14574:4;14530:94;:::i;:::-;14650:1;14675:2;14670:3;14667:11;14692:1;14687:616;;;;15347:1;15364:3;15361:93;;;-1:-1:-1;15420:19:1;;;15407:33;15361:93;-1:-1:-1;;14312:1:1;14308:11;;;14304:24;14300:29;14290:40;14336:1;14332:11;;;14287:57;15467:78;;14660:895;;14687:616;13581:1;13574:14;;;13618:4;13605:18;;-1:-1:-1;;14723:17:1;;;14824:9;14846:229;14860:7;14857:1;14854:14;14846:229;;;14949:19;;;14936:33;14921:49;;15056:4;15041:20;;;;15009:1;14997:14;;;;14876:12;14846:229;;;14850:3;15103;15094:7;15091:16;15088:159;;;15227:1;15223:6;15217:3;15211;15208:1;15204:11;15200:21;15196:34;15192:39;15179:9;15174:3;15170:19;15157:33;15153:79;15145:6;15138:95;15088:159;;;15290:1;15284:3;15281:1;15277:11;15273:19;15267:4;15260:33;14660:895;;14355:1206;;;:::o;16629:398::-;16831:2;16813:21;;;16870:2;16850:18;;;16843:30;16909:34;16904:2;16889:18;;16882:62;-1:-1:-1;;;16975:2:1;16960:18;;16953:32;17017:3;17002:19;;16629:398::o;17032:127::-;17093:10;17088:3;17084:20;17081:1;17074:31;17124:4;17121:1;17114:15;17148:4;17145:1;17138:15;18156:1020;18332:3;18361:1;18394:6;18388:13;18424:36;18450:9;18424:36;:::i;:::-;18479:1;18496:18;;;18523:133;;;;18670:1;18665:356;;;;18489:532;;18523:133;-1:-1:-1;;18556:24:1;;18544:37;;18629:14;;18622:22;18610:35;;18601:45;;;-1:-1:-1;18523:133:1;;18665:356;18696:6;18693:1;18686:17;18726:4;18771:2;18768:1;18758:16;18796:1;18810:165;18824:6;18821:1;18818:13;18810:165;;;18902:14;;18889:11;;;18882:35;18945:16;;;;18839:10;;18810:165;;;18814:3;;;19004:6;18999:3;18995:16;18988:23;;18489:532;;;;;19052:6;19046:13;19068:68;19127:8;19122:3;19115:4;19107:6;19103:17;19068:68;:::i;:::-;19152:18;;18156:1020;-1:-1:-1;;;;18156:1020:1:o;20377:245::-;20444:6;20497:2;20485:9;20476:7;20472:23;20468:32;20465:52;;;20513:1;20510;20503:12;20465:52;20545:9;20539:16;20564:28;20586:5;20564:28;:::i;21392:112::-;21424:1;21450;21440:35;;21455:18;;:::i;:::-;-1:-1:-1;21489:9:1;;21392:112::o;21509:489::-;-1:-1:-1;;;;;21778:15:1;;;21760:34;;21830:15;;21825:2;21810:18;;21803:43;21877:2;21862:18;;21855:34;;;21925:3;21920:2;21905:18;;21898:31;;;21703:4;;21946:46;;21972:19;;21964:6;21946:46;:::i;:::-;21938:54;21509:489;-1:-1:-1;;;;;;21509:489:1:o;22003:249::-;22072:6;22125:2;22113:9;22104:7;22100:23;22096:32;22093:52;;;22141:1;22138;22131:12;22093:52;22173:9;22167:16;22192:30;22216:5;22192:30;:::i
Swarm Source
ipfs://25e8170a00c74ddfbb751b2050ab79879b4bde2c3a51ec158e6dff44817a78e0
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.