ERC-721
Overview
Max Total Supply
1,246 Baldrupt
Holders
112
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
10 BaldruptLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Baldrupt
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-04-09 */ pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // SPDX-License-Identifier: MIT pragma solidity ^0.8.4; interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } 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); } abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } 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); } 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 1000; } /** * @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]; } } /// @notice Optimized and flexible operator filterer to abide to OpenSea's /// mandatory on-chain royalty enforcement in order for new collections to /// receive royalties. /// For more information, see: /// See: https://github.com/ProjectOpenSea/operator-filter-registry abstract contract OperatorFilterer { /// @dev The default OpenSea operator blocklist subscription. address internal constant _DEFAULT_SUBSCRIPTION = 0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6; /// @dev The OpenSea operator filter registry. address internal constant _OPERATOR_FILTER_REGISTRY = 0x000000000000AAeB6D7670E522A718067333cd4E; /// @dev Registers the current contract to OpenSea's operator filter, /// and subscribe to the default OpenSea operator blocklist. /// Note: Will not revert nor update existing settings for repeated registration. function _registerForOperatorFiltering() internal virtual { _registerForOperatorFiltering(_DEFAULT_SUBSCRIPTION, true); } /// @dev Registers the current contract to OpenSea's operator filter. /// Note: Will not revert nor update existing settings for repeated registration. function _registerForOperatorFiltering(address subscriptionOrRegistrantToCopy, bool subscribe) internal virtual { /// @solidity memory-safe-assembly assembly { let functionSelector := 0x7d3e3dbe // `registerAndSubscribe(address,address)`. // Clean the upper 96 bits of `subscriptionOrRegistrantToCopy` in case they are dirty. subscriptionOrRegistrantToCopy := shr(96, shl(96, subscriptionOrRegistrantToCopy)) for {} iszero(subscribe) {} { if iszero(subscriptionOrRegistrantToCopy) { functionSelector := 0x4420e486 // `register(address)`. break } functionSelector := 0xa0af2903 // `registerAndCopyEntries(address,address)`. break } // Store the function selector. mstore(0x00, shl(224, functionSelector)) // Store the `address(this)`. mstore(0x04, address()) // Store the `subscriptionOrRegistrantToCopy`. mstore(0x24, subscriptionOrRegistrantToCopy) // Register into the registry. if iszero(call(gas(), _OPERATOR_FILTER_REGISTRY, 0, 0x00, 0x44, 0x00, 0x04)) { // If the function selector has not been overwritten, // it is an out-of-gas error. if eq(shr(224, mload(0x00)), functionSelector) { // To prevent gas under-estimation. revert(0, 0) } } // Restore the part of the free memory pointer that was overwritten, // which is guaranteed to be zero, because of Solidity's memory size limits. mstore(0x24, 0) } } /// @dev Modifier to guard a function and revert if the caller is a blocked operator. modifier onlyAllowedOperator(address from) virtual { if (from != msg.sender) { if (!_isPriorityOperator(msg.sender)) { if (_operatorFilteringEnabled()) _revertIfBlocked(msg.sender); } } _; } /// @dev Modifier to guard a function from approving a blocked operator.. modifier onlyAllowedOperatorApproval(address operator) virtual { if (!_isPriorityOperator(operator)) { if (_operatorFilteringEnabled()) _revertIfBlocked(operator); } _; } /// @dev Helper function that reverts if the `operator` is blocked by the registry. function _revertIfBlocked(address operator) private view { /// @solidity memory-safe-assembly assembly { // Store the function selector of `isOperatorAllowed(address,address)`, // shifted left by 6 bytes, which is enough for 8tb of memory. // We waste 6-3 = 3 bytes to save on 6 runtime gas (PUSH1 0x224 SHL). mstore(0x00, 0xc6171134001122334455) // Store the `address(this)`. mstore(0x1a, address()) // Store the `operator`. mstore(0x3a, operator) // `isOperatorAllowed` always returns true if it does not revert. if iszero(staticcall(gas(), _OPERATOR_FILTER_REGISTRY, 0x16, 0x44, 0x00, 0x00)) { // Bubble up the revert if the staticcall reverts. returndatacopy(0x00, 0x00, returndatasize()) revert(0x00, returndatasize()) } // We'll skip checking if `from` is inside the blacklist. // Even though that can block transferring out of wrapper contracts, // we don't want tokens to be stuck. // Restore the part of the free memory pointer that was overwritten, // which is guaranteed to be zero, if less than 8tb of memory is used. mstore(0x3a, 0) } } /// @dev For deriving contracts to override, so that operator filtering /// can be turned on / off. /// Returns true by default. function _operatorFilteringEnabled() internal view virtual returns (bool) { return true; } /// @dev For deriving contracts to override, so that preferred marketplaces can /// skip operator filtering, helping users save gas. /// Returns false for all inputs by default. function _isPriorityOperator(address) internal view virtual returns (bool) { return false; } } 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); } contract ERC721A is IERC721A, ERC2981 { // 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 // ============================================================= function initial(string memory name_, string memory symbol_) internal { _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 1; } /** * @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(ERC2981, IERC721A) 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 == type(IERC721A).interfaceId || interfaceId == type(ERC2981).interfaceId || 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 { _beforeTransfer(); 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 {} function _beforeTransfer() internal { } /** * @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) } } } contract Baldrupt is ERC721A, Ownable { uint16 public constant maxSupply = 8888; uint256 public nftRemaining = maxSupply; uint128 public nftPrice = 3000000000000000; // 0.003ETH uint8 public maxToMint = 10; // per transaction bool public publicSaleHasStarted = false; string _baseTokenURI; constructor(){ super.initial("Baldrupt", "Baldrupt"); _baseTokenURI = "ipfs://QmdiD2nPqMM57XwgEjs3a3r48u2KziQNjEYx6xjb1U4FEH/"; } function setMaxToMint(uint8 _max) public onlyOwner { maxToMint = _max; } function setPrice(uint128 _price) public onlyOwner { nftPrice = _price; } function mint(uint8 nftsNumber) public payable { require(publicSaleHasStarted == true, "Sale is not live"); require(nftsNumber > 0, "Minting number cannot be negative"); require(nftsNumber <= maxToMint, "Minting number per transaction exceeded"); require(totalSupply() + nftsNumber <= maxSupply, "Mint less NFTs, hard cap exceeded"); if (msg.sender != owner()) { require(msg.value == nftsNumber * nftPrice, "Value not correct"); } _mint(msg.sender, nftsNumber); } function setBaseURI(string memory baseURI) public onlyOwner { _baseTokenURI = baseURI; } function tokenURI(uint256 tokenId) public view override returns (string memory) { return string(abi.encodePacked(_baseTokenURI, _toString(tokenId), ".json")); } function startPublicSale() public onlyOwner { publicSaleHasStarted = true; } function pausePublicSale() public onlyOwner { publicSaleHasStarted = false; } function withdraw() public onlyOwner { uint256 balance = address(this).balance; (bool os, ) = payable(msg.sender).call{value: balance}(""); require(os); } }
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":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"maxSupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxToMint","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"nftsNumber","type":"uint8"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPrice","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftRemaining","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pausePublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"publicSaleHasStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_max","type":"uint8"}],"name":"setMaxToMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"_price","type":"uint128"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526122b861ffff16600b55660aa87bee538000600c60006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550600a600c60106101000a81548160ff021916908360ff1602179055506000600c60116101000a81548160ff0219169083151502179055503480156200009257600080fd5b50620000b3620000a76200016560201b60201c565b6200016d60201b60201c565b620001346040518060400160405280600881526020017f42616c64727570740000000000000000000000000000000000000000000000008152506040518060400160405280600881526020017f42616c64727570740000000000000000000000000000000000000000000000008152506200023360201b620017e21760201c565b6040518060600160405280603681526020016200378b60369139600d90816200015e9190620004f4565b50620005db565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8160049081620002449190620004f4565b508060059081620002569190620004f4565b50620002676200027160201b60201c565b6002819055505050565b60006001905090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002fc57607f821691505b602082108103620003125762000311620002b4565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200037c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200033d565b6200038886836200033d565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003d5620003cf620003c984620003a0565b620003aa565b620003a0565b9050919050565b6000819050919050565b620003f183620003b4565b620004096200040082620003dc565b8484546200034a565b825550505050565b600090565b6200042062000411565b6200042d818484620003e6565b505050565b5b8181101562000455576200044960008262000416565b60018101905062000433565b5050565b601f821115620004a4576200046e8162000318565b62000479846200032d565b8101602085101562000489578190505b620004a162000498856200032d565b83018262000432565b50505b505050565b600082821c905092915050565b6000620004c960001984600802620004a9565b1980831691505092915050565b6000620004e48383620004b6565b9150826002028217905092915050565b620004ff826200027a565b67ffffffffffffffff8111156200051b576200051a62000285565b5b620005278254620002e3565b6200053482828562000459565b600060209050601f8311600181146200056c576000841562000557578287015190505b620005638582620004d6565b865550620005d3565b601f1984166200057c8662000318565b60005b82811015620005a6578489015182556001820191506020850194506020810190506200057f565b86831015620005c65784890151620005c2601f891682620004b6565b8355505b6001600288020188555050505b505050505050565b6131a080620005eb6000396000f3fe6080604052600436106101cd5760003560e01c806355f804b3116100f757806395d89b4111610095578063c87b56dd11610064578063c87b56dd146105e8578063d5abeb0114610625578063e985e9c514610650578063f2fde38b1461068d576101cd565b806395d89b411461054d578063a197817e14610578578063a22cb465146105a3578063b88d4fde146105cc576101cd565b806370a08231116100d157806370a08231146104a3578063715018a6146104e0578063830738ea146104f75780638da5cb5b14610522576101cd565b806355f804b3146104215780636352211e1461044a5780636ecd230614610487576101cd565b80630d39fc811161016f5780632a55205a1161013e5780632a55205a146103875780633ae84a82146103c55780633ccfd60b146103ee57806342842e0e14610405576101cd565b80630d39fc81146102ec57806318160ddd1461031757806323b872dd146103425780632a0cdb601461035e576101cd565b8063095ea7b3116101ab578063095ea7b3146102775780630ba133c5146102935780630c1c972a146102be5780630c41f497146102d5576101cd565b806301ffc9a7146101d257806306fdde031461020f578063081812fc1461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190611f53565b6106b6565b6040516102069190611f9b565b60405180910390f35b34801561021b57600080fd5b50610224610818565b6040516102319190612046565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c919061209e565b6108aa565b60405161026e919061210c565b60405180910390f35b610291600480360381019061028c9190612153565b610929565b005b34801561029f57600080fd5b506102a8610a6d565b6040516102b591906121af565b60405180910390f35b3480156102ca57600080fd5b506102d3610a80565b005b3480156102e157600080fd5b506102ea610aa5565b005b3480156102f857600080fd5b50610301610aca565b60405161030e91906121f5565b60405180910390f35b34801561032357600080fd5b5061032c610aec565b604051610339919061221f565b60405180910390f35b61035c6004803603810190610357919061223a565b610b03565b005b34801561036a57600080fd5b50610385600480360381019061038091906122b9565b610e2d565b005b34801561039357600080fd5b506103ae60048036038101906103a991906122e6565b610e53565b6040516103bc929190612326565b60405180910390f35b3480156103d157600080fd5b506103ec60048036038101906103e7919061237b565b61103d565b005b3480156103fa57600080fd5b50610403611081565b005b61041f600480360381019061041a919061223a565b611108565b005b34801561042d57600080fd5b50610448600480360381019061044391906124dd565b611128565b005b34801561045657600080fd5b50610471600480360381019061046c919061209e565b611143565b60405161047e919061210c565b60405180910390f35b6104a1600480360381019061049c91906122b9565b611155565b005b3480156104af57600080fd5b506104ca60048036038101906104c59190612526565b611372565b6040516104d7919061221f565b60405180910390f35b3480156104ec57600080fd5b506104f561142a565b005b34801561050357600080fd5b5061050c61143e565b604051610519919061221f565b60405180910390f35b34801561052e57600080fd5b50610537611444565b604051610544919061210c565b60405180910390f35b34801561055957600080fd5b5061056261146e565b60405161056f9190612046565b60405180910390f35b34801561058457600080fd5b5061058d611500565b60405161059a9190611f9b565b60405180910390f35b3480156105af57600080fd5b506105ca60048036038101906105c5919061257f565b611513565b005b6105e660048036038101906105e19190612660565b61161e565b005b3480156105f457600080fd5b5061060f600480360381019061060a919061209e565b611691565b60405161061c9190612046565b60405180910390f35b34801561063157600080fd5b5061063a6116c5565b6040516106479190612700565b60405180910390f35b34801561065c57600080fd5b506106776004803603810190610672919061271b565b6116cb565b6040516106849190611f9b565b60405180910390f35b34801561069957600080fd5b506106b460048036038101906106af9190612526565b61175f565b005b60007fc21b8f28000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061078157507f2baae9fd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107b157506301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107e157506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108115750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600480546108279061278a565b80601f01602080910402602001604051908101604052809291908181526020018280546108539061278a565b80156108a05780601f10610875576101008083540402835291602001916108a0565b820191906000526020600020905b81548152906001019060200180831161088357829003601f168201915b5050505050905090565b60006108b582611814565b6108eb576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6008600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061093482611143565b90508073ffffffffffffffffffffffffffffffffffffffff16610955611873565b73ffffffffffffffffffffffffffffffffffffffff16146109b8576109818161097c611873565b6116cb565b6109b7576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826008600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600c60109054906101000a900460ff1681565b610a8861187b565b6001600c60116101000a81548160ff021916908315150217905550565b610aad61187b565b6000600c60116101000a81548160ff021916908315150217905550565b600c60009054906101000a90046fffffffffffffffffffffffffffffffff1681565b6000610af66118f9565b6003546002540303905090565b610b0b611902565b6000610b1682611904565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b7d576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610b89846119d0565b91509150610b9f8187610b9a611873565b6119f7565b610beb57610bb486610baf611873565b6116cb565b610bea576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610c51576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c5e8686866001611a3b565b8015610c6957600082555b600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610d3785610d13888887611a41565b7c020000000000000000000000000000000000000000000000000000000017611a69565b600660008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603610dbd5760006001850190506000600660008381526020019081526020016000205403610dbb576002548114610dba578360066000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610e258686866001611a94565b505050505050565b610e3561187b565b80600c60106101000a81548160ff021916908360ff16021790555050565b6000806000600160008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610fe85760006040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610ff2611a9a565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff168661101e91906127ea565b611028919061285b565b90508160000151819350935050509250929050565b61104561187b565b80600c60006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555050565b61108961187b565b600047905060003373ffffffffffffffffffffffffffffffffffffffff16826040516110b4906128bd565b60006040518083038185875af1925050503d80600081146110f1576040519150601f19603f3d011682016040523d82523d6000602084013e6110f6565b606091505b505090508061110457600080fd5b5050565b6111238383836040518060200160405280600081525061161e565b505050565b61113061187b565b80600d908161113f9190612a7e565b5050565b600061114e82611904565b9050919050565b60011515600c60119054906101000a900460ff161515146111ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a290612b9c565b60405180910390fd5b60008160ff16116111f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e890612c2e565b60405180910390fd5b600c60109054906101000a900460ff1660ff168160ff161115611249576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124090612cc0565b60405180910390fd5b6122b861ffff168160ff1661125c610aec565b6112669190612ce0565b11156112a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129e90612d86565b60405180910390fd5b6112af611444565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461136257600c60009054906101000a90046fffffffffffffffffffffffffffffffff168160ff1661130e9190612da6565b6fffffffffffffffffffffffffffffffff163414611361576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135890612e2f565b60405180910390fd5b5b61136f338260ff16611aa4565b50565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036113d9576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61143261187b565b61143c6000611c60565b565b600b5481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606005805461147d9061278a565b80601f01602080910402602001604051908101604052809291908181526020018280546114a99061278a565b80156114f65780601f106114cb576101008083540402835291602001916114f6565b820191906000526020600020905b8154815290600101906020018083116114d957829003601f168201915b5050505050905090565b600c60119054906101000a900460ff1681565b8060096000611520611873565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166115cd611873565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116129190611f9b565b60405180910390a35050565b611629848484610b03565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461168b5761165484848484611d26565b61168a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060600d61169e83611e76565b6040516020016116af929190612f5a565b6040516020818303038152906040529050919050565b6122b881565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61176761187b565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036117d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cd90612ffb565b60405180910390fd5b6117df81611c60565b50565b81600490816117f19190612a7e565b5080600590816118019190612a7e565b5061180a6118f9565b6002819055505050565b60008161181f6118f9565b1115801561182e575060025482105b801561186c575060007c0100000000000000000000000000000000000000000000000000000000600660008581526020019081526020016000205416145b9050919050565b600033905090565b611883611ec6565b73ffffffffffffffffffffffffffffffffffffffff166118a1611444565b73ffffffffffffffffffffffffffffffffffffffff16146118f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ee90613067565b60405180910390fd5b565b60006001905090565b565b600080829050806119136118f9565b11611999576002548110156119985760006006600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611996575b6000810361198c576006600083600190039350838152602001908152602001600020549050611962565b80925050506119cb565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006008600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611a58868684611ece565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60006103e8905090565b6000600254905060008203611ae5576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611af26000848385611a3b565b600160406001901b178202600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550611b6983611b5a6000866000611a41565b611b6385611ed7565b17611a69565b6006600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114611c0a57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050611bcf565b5060008203611c45576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806002819055505050611c5b6000848385611a94565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611d4c611873565b8786866040518563ffffffff1660e01b8152600401611d6e94939291906130dc565b6020604051808303816000875af1925050508015611daa57506040513d601f19601f82011682018060405250810190611da7919061313d565b60015b611e23573d8060008114611dda576040519150601f19603f3d011682016040523d82523d6000602084013e611ddf565b606091505b506000815103611e1b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060a060405101806040526020810391506000825281835b600115611eb157600184039350600a81066030018453600a8104905080611e8f575b50828103602084039350808452505050919050565b600033905090565b60009392505050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611f3081611efb565b8114611f3b57600080fd5b50565b600081359050611f4d81611f27565b92915050565b600060208284031215611f6957611f68611ef1565b5b6000611f7784828501611f3e565b91505092915050565b60008115159050919050565b611f9581611f80565b82525050565b6000602082019050611fb06000830184611f8c565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611ff0578082015181840152602081019050611fd5565b60008484015250505050565b6000601f19601f8301169050919050565b600061201882611fb6565b6120228185611fc1565b9350612032818560208601611fd2565b61203b81611ffc565b840191505092915050565b60006020820190508181036000830152612060818461200d565b905092915050565b6000819050919050565b61207b81612068565b811461208657600080fd5b50565b60008135905061209881612072565b92915050565b6000602082840312156120b4576120b3611ef1565b5b60006120c284828501612089565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006120f6826120cb565b9050919050565b612106816120eb565b82525050565b600060208201905061212160008301846120fd565b92915050565b612130816120eb565b811461213b57600080fd5b50565b60008135905061214d81612127565b92915050565b6000806040838503121561216a57612169611ef1565b5b60006121788582860161213e565b925050602061218985828601612089565b9150509250929050565b600060ff82169050919050565b6121a981612193565b82525050565b60006020820190506121c460008301846121a0565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6121ef816121ca565b82525050565b600060208201905061220a60008301846121e6565b92915050565b61221981612068565b82525050565b60006020820190506122346000830184612210565b92915050565b60008060006060848603121561225357612252611ef1565b5b60006122618682870161213e565b93505060206122728682870161213e565b925050604061228386828701612089565b9150509250925092565b61229681612193565b81146122a157600080fd5b50565b6000813590506122b38161228d565b92915050565b6000602082840312156122cf576122ce611ef1565b5b60006122dd848285016122a4565b91505092915050565b600080604083850312156122fd576122fc611ef1565b5b600061230b85828601612089565b925050602061231c85828601612089565b9150509250929050565b600060408201905061233b60008301856120fd565b6123486020830184612210565b9392505050565b612358816121ca565b811461236357600080fd5b50565b6000813590506123758161234f565b92915050565b60006020828403121561239157612390611ef1565b5b600061239f84828501612366565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6123ea82611ffc565b810181811067ffffffffffffffff82111715612409576124086123b2565b5b80604052505050565b600061241c611ee7565b905061242882826123e1565b919050565b600067ffffffffffffffff821115612448576124476123b2565b5b61245182611ffc565b9050602081019050919050565b82818337600083830152505050565b600061248061247b8461242d565b612412565b90508281526020810184848401111561249c5761249b6123ad565b5b6124a784828561245e565b509392505050565b600082601f8301126124c4576124c36123a8565b5b81356124d484826020860161246d565b91505092915050565b6000602082840312156124f3576124f2611ef1565b5b600082013567ffffffffffffffff81111561251157612510611ef6565b5b61251d848285016124af565b91505092915050565b60006020828403121561253c5761253b611ef1565b5b600061254a8482850161213e565b91505092915050565b61255c81611f80565b811461256757600080fd5b50565b60008135905061257981612553565b92915050565b6000806040838503121561259657612595611ef1565b5b60006125a48582860161213e565b92505060206125b58582860161256a565b9150509250929050565b600067ffffffffffffffff8211156125da576125d96123b2565b5b6125e382611ffc565b9050602081019050919050565b60006126036125fe846125bf565b612412565b90508281526020810184848401111561261f5761261e6123ad565b5b61262a84828561245e565b509392505050565b600082601f830112612647576126466123a8565b5b81356126578482602086016125f0565b91505092915050565b6000806000806080858703121561267a57612679611ef1565b5b60006126888782880161213e565b94505060206126998782880161213e565b93505060406126aa87828801612089565b925050606085013567ffffffffffffffff8111156126cb576126ca611ef6565b5b6126d787828801612632565b91505092959194509250565b600061ffff82169050919050565b6126fa816126e3565b82525050565b600060208201905061271560008301846126f1565b92915050565b6000806040838503121561273257612731611ef1565b5b60006127408582860161213e565b92505060206127518582860161213e565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806127a257607f821691505b6020821081036127b5576127b461275b565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006127f582612068565b915061280083612068565b925082820261280e81612068565b91508282048414831517612825576128246127bb565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061286682612068565b915061287183612068565b9250826128815761288061282c565b5b828204905092915050565b600081905092915050565b50565b60006128a760008361288c565b91506128b282612897565b600082019050919050565b60006128c88261289a565b9150819050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026129347fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826128f7565b61293e86836128f7565b95508019841693508086168417925050509392505050565b6000819050919050565b600061297b61297661297184612068565b612956565b612068565b9050919050565b6000819050919050565b61299583612960565b6129a96129a182612982565b848454612904565b825550505050565b600090565b6129be6129b1565b6129c981848461298c565b505050565b5b818110156129ed576129e26000826129b6565b6001810190506129cf565b5050565b601f821115612a3257612a03816128d2565b612a0c846128e7565b81016020851015612a1b578190505b612a2f612a27856128e7565b8301826129ce565b50505b505050565b600082821c905092915050565b6000612a5560001984600802612a37565b1980831691505092915050565b6000612a6e8383612a44565b9150826002028217905092915050565b612a8782611fb6565b67ffffffffffffffff811115612aa057612a9f6123b2565b5b612aaa825461278a565b612ab58282856129f1565b600060209050601f831160018114612ae85760008415612ad6578287015190505b612ae08582612a62565b865550612b48565b601f198416612af6866128d2565b60005b82811015612b1e57848901518255600182019150602085019450602081019050612af9565b86831015612b3b5784890151612b37601f891682612a44565b8355505b6001600288020188555050505b505050505050565b7f53616c65206973206e6f74206c69766500000000000000000000000000000000600082015250565b6000612b86601083611fc1565b9150612b9182612b50565b602082019050919050565b60006020820190508181036000830152612bb581612b79565b9050919050565b7f4d696e74696e67206e756d6265722063616e6e6f74206265206e65676174697660008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b6000612c18602183611fc1565b9150612c2382612bbc565b604082019050919050565b60006020820190508181036000830152612c4781612c0b565b9050919050565b7f4d696e74696e67206e756d62657220706572207472616e73616374696f6e206560008201527f7863656564656400000000000000000000000000000000000000000000000000602082015250565b6000612caa602783611fc1565b9150612cb582612c4e565b604082019050919050565b60006020820190508181036000830152612cd981612c9d565b9050919050565b6000612ceb82612068565b9150612cf683612068565b9250828201905080821115612d0e57612d0d6127bb565b5b92915050565b7f4d696e74206c657373204e4654732c206861726420636170206578636565646560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b6000612d70602183611fc1565b9150612d7b82612d14565b604082019050919050565b60006020820190508181036000830152612d9f81612d63565b9050919050565b6000612db1826121ca565b9150612dbc836121ca565b9250828202612dca816121ca565b9150808214612ddc57612ddb6127bb565b5b5092915050565b7f56616c7565206e6f7420636f7272656374000000000000000000000000000000600082015250565b6000612e19601183611fc1565b9150612e2482612de3565b602082019050919050565b60006020820190508181036000830152612e4881612e0c565b9050919050565b600081905092915050565b60008154612e678161278a565b612e718186612e4f565b94506001821660008114612e8c5760018114612ea157612ed4565b60ff1983168652811515820286019350612ed4565b612eaa856128d2565b60005b83811015612ecc57815481890152600182019150602081019050612ead565b838801955050505b50505092915050565b6000612ee882611fb6565b612ef28185612e4f565b9350612f02818560208601611fd2565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000612f44600583612e4f565b9150612f4f82612f0e565b600582019050919050565b6000612f668285612e5a565b9150612f728284612edd565b9150612f7d82612f37565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612fe5602683611fc1565b9150612ff082612f89565b604082019050919050565b6000602082019050818103600083015261301481612fd8565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613051602083611fc1565b915061305c8261301b565b602082019050919050565b6000602082019050818103600083015261308081613044565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006130ae82613087565b6130b88185613092565b93506130c8818560208601611fd2565b6130d181611ffc565b840191505092915050565b60006080820190506130f160008301876120fd565b6130fe60208301866120fd565b61310b6040830185612210565b818103606083015261311d81846130a3565b905095945050505050565b60008151905061313781611f27565b92915050565b60006020828403121561315357613152611ef1565b5b600061316184828501613128565b9150509291505056fea264697066735822122026f2f9c056d4e9415d3143672fc06cc9704d769ed6b4d47bcdbcad1b90c51dbb64736f6c63430008120033697066733a2f2f516d646944326e50714d4d3537587767456a7333613372343875324b7a69514e6a45597836786a623155344645482f
Deployed Bytecode
0x6080604052600436106101cd5760003560e01c806355f804b3116100f757806395d89b4111610095578063c87b56dd11610064578063c87b56dd146105e8578063d5abeb0114610625578063e985e9c514610650578063f2fde38b1461068d576101cd565b806395d89b411461054d578063a197817e14610578578063a22cb465146105a3578063b88d4fde146105cc576101cd565b806370a08231116100d157806370a08231146104a3578063715018a6146104e0578063830738ea146104f75780638da5cb5b14610522576101cd565b806355f804b3146104215780636352211e1461044a5780636ecd230614610487576101cd565b80630d39fc811161016f5780632a55205a1161013e5780632a55205a146103875780633ae84a82146103c55780633ccfd60b146103ee57806342842e0e14610405576101cd565b80630d39fc81146102ec57806318160ddd1461031757806323b872dd146103425780632a0cdb601461035e576101cd565b8063095ea7b3116101ab578063095ea7b3146102775780630ba133c5146102935780630c1c972a146102be5780630c41f497146102d5576101cd565b806301ffc9a7146101d257806306fdde031461020f578063081812fc1461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190611f53565b6106b6565b6040516102069190611f9b565b60405180910390f35b34801561021b57600080fd5b50610224610818565b6040516102319190612046565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c919061209e565b6108aa565b60405161026e919061210c565b60405180910390f35b610291600480360381019061028c9190612153565b610929565b005b34801561029f57600080fd5b506102a8610a6d565b6040516102b591906121af565b60405180910390f35b3480156102ca57600080fd5b506102d3610a80565b005b3480156102e157600080fd5b506102ea610aa5565b005b3480156102f857600080fd5b50610301610aca565b60405161030e91906121f5565b60405180910390f35b34801561032357600080fd5b5061032c610aec565b604051610339919061221f565b60405180910390f35b61035c6004803603810190610357919061223a565b610b03565b005b34801561036a57600080fd5b50610385600480360381019061038091906122b9565b610e2d565b005b34801561039357600080fd5b506103ae60048036038101906103a991906122e6565b610e53565b6040516103bc929190612326565b60405180910390f35b3480156103d157600080fd5b506103ec60048036038101906103e7919061237b565b61103d565b005b3480156103fa57600080fd5b50610403611081565b005b61041f600480360381019061041a919061223a565b611108565b005b34801561042d57600080fd5b50610448600480360381019061044391906124dd565b611128565b005b34801561045657600080fd5b50610471600480360381019061046c919061209e565b611143565b60405161047e919061210c565b60405180910390f35b6104a1600480360381019061049c91906122b9565b611155565b005b3480156104af57600080fd5b506104ca60048036038101906104c59190612526565b611372565b6040516104d7919061221f565b60405180910390f35b3480156104ec57600080fd5b506104f561142a565b005b34801561050357600080fd5b5061050c61143e565b604051610519919061221f565b60405180910390f35b34801561052e57600080fd5b50610537611444565b604051610544919061210c565b60405180910390f35b34801561055957600080fd5b5061056261146e565b60405161056f9190612046565b60405180910390f35b34801561058457600080fd5b5061058d611500565b60405161059a9190611f9b565b60405180910390f35b3480156105af57600080fd5b506105ca60048036038101906105c5919061257f565b611513565b005b6105e660048036038101906105e19190612660565b61161e565b005b3480156105f457600080fd5b5061060f600480360381019061060a919061209e565b611691565b60405161061c9190612046565b60405180910390f35b34801561063157600080fd5b5061063a6116c5565b6040516106479190612700565b60405180910390f35b34801561065c57600080fd5b506106776004803603810190610672919061271b565b6116cb565b6040516106849190611f9b565b60405180910390f35b34801561069957600080fd5b506106b460048036038101906106af9190612526565b61175f565b005b60007fc21b8f28000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061078157507f2baae9fd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107b157506301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107e157506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108115750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600480546108279061278a565b80601f01602080910402602001604051908101604052809291908181526020018280546108539061278a565b80156108a05780601f10610875576101008083540402835291602001916108a0565b820191906000526020600020905b81548152906001019060200180831161088357829003601f168201915b5050505050905090565b60006108b582611814565b6108eb576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6008600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061093482611143565b90508073ffffffffffffffffffffffffffffffffffffffff16610955611873565b73ffffffffffffffffffffffffffffffffffffffff16146109b8576109818161097c611873565b6116cb565b6109b7576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826008600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600c60109054906101000a900460ff1681565b610a8861187b565b6001600c60116101000a81548160ff021916908315150217905550565b610aad61187b565b6000600c60116101000a81548160ff021916908315150217905550565b600c60009054906101000a90046fffffffffffffffffffffffffffffffff1681565b6000610af66118f9565b6003546002540303905090565b610b0b611902565b6000610b1682611904565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b7d576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610b89846119d0565b91509150610b9f8187610b9a611873565b6119f7565b610beb57610bb486610baf611873565b6116cb565b610bea576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610c51576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c5e8686866001611a3b565b8015610c6957600082555b600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610d3785610d13888887611a41565b7c020000000000000000000000000000000000000000000000000000000017611a69565b600660008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603610dbd5760006001850190506000600660008381526020019081526020016000205403610dbb576002548114610dba578360066000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610e258686866001611a94565b505050505050565b610e3561187b565b80600c60106101000a81548160ff021916908360ff16021790555050565b6000806000600160008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610fe85760006040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610ff2611a9a565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff168661101e91906127ea565b611028919061285b565b90508160000151819350935050509250929050565b61104561187b565b80600c60006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555050565b61108961187b565b600047905060003373ffffffffffffffffffffffffffffffffffffffff16826040516110b4906128bd565b60006040518083038185875af1925050503d80600081146110f1576040519150601f19603f3d011682016040523d82523d6000602084013e6110f6565b606091505b505090508061110457600080fd5b5050565b6111238383836040518060200160405280600081525061161e565b505050565b61113061187b565b80600d908161113f9190612a7e565b5050565b600061114e82611904565b9050919050565b60011515600c60119054906101000a900460ff161515146111ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a290612b9c565b60405180910390fd5b60008160ff16116111f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e890612c2e565b60405180910390fd5b600c60109054906101000a900460ff1660ff168160ff161115611249576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124090612cc0565b60405180910390fd5b6122b861ffff168160ff1661125c610aec565b6112669190612ce0565b11156112a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129e90612d86565b60405180910390fd5b6112af611444565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461136257600c60009054906101000a90046fffffffffffffffffffffffffffffffff168160ff1661130e9190612da6565b6fffffffffffffffffffffffffffffffff163414611361576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135890612e2f565b60405180910390fd5b5b61136f338260ff16611aa4565b50565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036113d9576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61143261187b565b61143c6000611c60565b565b600b5481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606005805461147d9061278a565b80601f01602080910402602001604051908101604052809291908181526020018280546114a99061278a565b80156114f65780601f106114cb576101008083540402835291602001916114f6565b820191906000526020600020905b8154815290600101906020018083116114d957829003601f168201915b5050505050905090565b600c60119054906101000a900460ff1681565b8060096000611520611873565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166115cd611873565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116129190611f9b565b60405180910390a35050565b611629848484610b03565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461168b5761165484848484611d26565b61168a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060600d61169e83611e76565b6040516020016116af929190612f5a565b6040516020818303038152906040529050919050565b6122b881565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61176761187b565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036117d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cd90612ffb565b60405180910390fd5b6117df81611c60565b50565b81600490816117f19190612a7e565b5080600590816118019190612a7e565b5061180a6118f9565b6002819055505050565b60008161181f6118f9565b1115801561182e575060025482105b801561186c575060007c0100000000000000000000000000000000000000000000000000000000600660008581526020019081526020016000205416145b9050919050565b600033905090565b611883611ec6565b73ffffffffffffffffffffffffffffffffffffffff166118a1611444565b73ffffffffffffffffffffffffffffffffffffffff16146118f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ee90613067565b60405180910390fd5b565b60006001905090565b565b600080829050806119136118f9565b11611999576002548110156119985760006006600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611996575b6000810361198c576006600083600190039350838152602001908152602001600020549050611962565b80925050506119cb565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006008600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611a58868684611ece565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60006103e8905090565b6000600254905060008203611ae5576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611af26000848385611a3b565b600160406001901b178202600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550611b6983611b5a6000866000611a41565b611b6385611ed7565b17611a69565b6006600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114611c0a57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050611bcf565b5060008203611c45576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806002819055505050611c5b6000848385611a94565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611d4c611873565b8786866040518563ffffffff1660e01b8152600401611d6e94939291906130dc565b6020604051808303816000875af1925050508015611daa57506040513d601f19601f82011682018060405250810190611da7919061313d565b60015b611e23573d8060008114611dda576040519150601f19603f3d011682016040523d82523d6000602084013e611ddf565b606091505b506000815103611e1b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060a060405101806040526020810391506000825281835b600115611eb157600184039350600a81066030018453600a8104905080611e8f575b50828103602084039350808452505050919050565b600033905090565b60009392505050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611f3081611efb565b8114611f3b57600080fd5b50565b600081359050611f4d81611f27565b92915050565b600060208284031215611f6957611f68611ef1565b5b6000611f7784828501611f3e565b91505092915050565b60008115159050919050565b611f9581611f80565b82525050565b6000602082019050611fb06000830184611f8c565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611ff0578082015181840152602081019050611fd5565b60008484015250505050565b6000601f19601f8301169050919050565b600061201882611fb6565b6120228185611fc1565b9350612032818560208601611fd2565b61203b81611ffc565b840191505092915050565b60006020820190508181036000830152612060818461200d565b905092915050565b6000819050919050565b61207b81612068565b811461208657600080fd5b50565b60008135905061209881612072565b92915050565b6000602082840312156120b4576120b3611ef1565b5b60006120c284828501612089565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006120f6826120cb565b9050919050565b612106816120eb565b82525050565b600060208201905061212160008301846120fd565b92915050565b612130816120eb565b811461213b57600080fd5b50565b60008135905061214d81612127565b92915050565b6000806040838503121561216a57612169611ef1565b5b60006121788582860161213e565b925050602061218985828601612089565b9150509250929050565b600060ff82169050919050565b6121a981612193565b82525050565b60006020820190506121c460008301846121a0565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6121ef816121ca565b82525050565b600060208201905061220a60008301846121e6565b92915050565b61221981612068565b82525050565b60006020820190506122346000830184612210565b92915050565b60008060006060848603121561225357612252611ef1565b5b60006122618682870161213e565b93505060206122728682870161213e565b925050604061228386828701612089565b9150509250925092565b61229681612193565b81146122a157600080fd5b50565b6000813590506122b38161228d565b92915050565b6000602082840312156122cf576122ce611ef1565b5b60006122dd848285016122a4565b91505092915050565b600080604083850312156122fd576122fc611ef1565b5b600061230b85828601612089565b925050602061231c85828601612089565b9150509250929050565b600060408201905061233b60008301856120fd565b6123486020830184612210565b9392505050565b612358816121ca565b811461236357600080fd5b50565b6000813590506123758161234f565b92915050565b60006020828403121561239157612390611ef1565b5b600061239f84828501612366565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6123ea82611ffc565b810181811067ffffffffffffffff82111715612409576124086123b2565b5b80604052505050565b600061241c611ee7565b905061242882826123e1565b919050565b600067ffffffffffffffff821115612448576124476123b2565b5b61245182611ffc565b9050602081019050919050565b82818337600083830152505050565b600061248061247b8461242d565b612412565b90508281526020810184848401111561249c5761249b6123ad565b5b6124a784828561245e565b509392505050565b600082601f8301126124c4576124c36123a8565b5b81356124d484826020860161246d565b91505092915050565b6000602082840312156124f3576124f2611ef1565b5b600082013567ffffffffffffffff81111561251157612510611ef6565b5b61251d848285016124af565b91505092915050565b60006020828403121561253c5761253b611ef1565b5b600061254a8482850161213e565b91505092915050565b61255c81611f80565b811461256757600080fd5b50565b60008135905061257981612553565b92915050565b6000806040838503121561259657612595611ef1565b5b60006125a48582860161213e565b92505060206125b58582860161256a565b9150509250929050565b600067ffffffffffffffff8211156125da576125d96123b2565b5b6125e382611ffc565b9050602081019050919050565b60006126036125fe846125bf565b612412565b90508281526020810184848401111561261f5761261e6123ad565b5b61262a84828561245e565b509392505050565b600082601f830112612647576126466123a8565b5b81356126578482602086016125f0565b91505092915050565b6000806000806080858703121561267a57612679611ef1565b5b60006126888782880161213e565b94505060206126998782880161213e565b93505060406126aa87828801612089565b925050606085013567ffffffffffffffff8111156126cb576126ca611ef6565b5b6126d787828801612632565b91505092959194509250565b600061ffff82169050919050565b6126fa816126e3565b82525050565b600060208201905061271560008301846126f1565b92915050565b6000806040838503121561273257612731611ef1565b5b60006127408582860161213e565b92505060206127518582860161213e565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806127a257607f821691505b6020821081036127b5576127b461275b565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006127f582612068565b915061280083612068565b925082820261280e81612068565b91508282048414831517612825576128246127bb565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061286682612068565b915061287183612068565b9250826128815761288061282c565b5b828204905092915050565b600081905092915050565b50565b60006128a760008361288c565b91506128b282612897565b600082019050919050565b60006128c88261289a565b9150819050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026129347fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826128f7565b61293e86836128f7565b95508019841693508086168417925050509392505050565b6000819050919050565b600061297b61297661297184612068565b612956565b612068565b9050919050565b6000819050919050565b61299583612960565b6129a96129a182612982565b848454612904565b825550505050565b600090565b6129be6129b1565b6129c981848461298c565b505050565b5b818110156129ed576129e26000826129b6565b6001810190506129cf565b5050565b601f821115612a3257612a03816128d2565b612a0c846128e7565b81016020851015612a1b578190505b612a2f612a27856128e7565b8301826129ce565b50505b505050565b600082821c905092915050565b6000612a5560001984600802612a37565b1980831691505092915050565b6000612a6e8383612a44565b9150826002028217905092915050565b612a8782611fb6565b67ffffffffffffffff811115612aa057612a9f6123b2565b5b612aaa825461278a565b612ab58282856129f1565b600060209050601f831160018114612ae85760008415612ad6578287015190505b612ae08582612a62565b865550612b48565b601f198416612af6866128d2565b60005b82811015612b1e57848901518255600182019150602085019450602081019050612af9565b86831015612b3b5784890151612b37601f891682612a44565b8355505b6001600288020188555050505b505050505050565b7f53616c65206973206e6f74206c69766500000000000000000000000000000000600082015250565b6000612b86601083611fc1565b9150612b9182612b50565b602082019050919050565b60006020820190508181036000830152612bb581612b79565b9050919050565b7f4d696e74696e67206e756d6265722063616e6e6f74206265206e65676174697660008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b6000612c18602183611fc1565b9150612c2382612bbc565b604082019050919050565b60006020820190508181036000830152612c4781612c0b565b9050919050565b7f4d696e74696e67206e756d62657220706572207472616e73616374696f6e206560008201527f7863656564656400000000000000000000000000000000000000000000000000602082015250565b6000612caa602783611fc1565b9150612cb582612c4e565b604082019050919050565b60006020820190508181036000830152612cd981612c9d565b9050919050565b6000612ceb82612068565b9150612cf683612068565b9250828201905080821115612d0e57612d0d6127bb565b5b92915050565b7f4d696e74206c657373204e4654732c206861726420636170206578636565646560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b6000612d70602183611fc1565b9150612d7b82612d14565b604082019050919050565b60006020820190508181036000830152612d9f81612d63565b9050919050565b6000612db1826121ca565b9150612dbc836121ca565b9250828202612dca816121ca565b9150808214612ddc57612ddb6127bb565b5b5092915050565b7f56616c7565206e6f7420636f7272656374000000000000000000000000000000600082015250565b6000612e19601183611fc1565b9150612e2482612de3565b602082019050919050565b60006020820190508181036000830152612e4881612e0c565b9050919050565b600081905092915050565b60008154612e678161278a565b612e718186612e4f565b94506001821660008114612e8c5760018114612ea157612ed4565b60ff1983168652811515820286019350612ed4565b612eaa856128d2565b60005b83811015612ecc57815481890152600182019150602081019050612ead565b838801955050505b50505092915050565b6000612ee882611fb6565b612ef28185612e4f565b9350612f02818560208601611fd2565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000612f44600583612e4f565b9150612f4f82612f0e565b600582019050919050565b6000612f668285612e5a565b9150612f728284612edd565b9150612f7d82612f37565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612fe5602683611fc1565b9150612ff082612f89565b604082019050919050565b6000602082019050818103600083015261301481612fd8565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613051602083611fc1565b915061305c8261301b565b602082019050919050565b6000602082019050818103600083015261308081613044565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006130ae82613087565b6130b88185613092565b93506130c8818560208601611fd2565b6130d181611ffc565b840191505092915050565b60006080820190506130f160008301876120fd565b6130fe60208301866120fd565b61310b6040830185612210565b818103606083015261311d81846130a3565b905095945050505050565b60008151905061313781611f27565b92915050565b60006020828403121561315357613152611ef1565b5b600061316184828501613128565b9150509291505056fea264697066735822122026f2f9c056d4e9415d3143672fc06cc9704d769ed6b4d47bcdbcad1b90c51dbb64736f6c63430008120033
Deployed Bytecode Sourcemap
64278:1910:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31035:773;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32071:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38562:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37995:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64476:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65802:90;;;;;;;;;;;;;:::i;:::-;;65900:91;;;;;;;;;;;;;:::i;:::-;;64415:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27688:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42201:2853;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64769:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5515:442;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;64863:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65999:186;;;;;;;;;;;;;:::i;:::-;;45150:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65510:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33464:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64958:544;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28872:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2664:103;;;;;;;;;;;;;:::i;:::-;;64369:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2016:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32247:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64529:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39120:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45941:407;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65620:174;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64323:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39511:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2922:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31035:773;31139:4;31478:26;31463:41;;;:11;:41;;;;:98;;;;31536:25;31521:40;;;:11;:40;;;;31463:98;:140;;;;31593:10;31578:25;;:11;:25;;;;31463:140;:217;;;;31670:10;31655:25;;:11;:25;;;;31463:217;:294;;;;31747:10;31732:25;;:11;:25;;;;31463:294;31443:314;;31035:773;;;:::o;32071:100::-;32125:13;32158:5;32151:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32071:100;:::o;38562:218::-;38638:7;38663:16;38671:7;38663;:16::i;:::-;38658:64;;38688:34;;;;;;;;;;;;;;38658:64;38742:15;:24;38758:7;38742:24;;;;;;;;;;;:30;;;;;;;;;;;;38735:37;;38562:218;;;:::o;37995:408::-;38084:13;38100:16;38108:7;38100;:16::i;:::-;38084:32;;38156:5;38133:28;;:19;:17;:19::i;:::-;:28;;;38129:175;;38181:44;38198:5;38205:19;:17;:19::i;:::-;38181:16;:44::i;:::-;38176:128;;38253:35;;;;;;;;;;;;;;38176:128;38129:175;38349:2;38316:15;:24;38332:7;38316:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;38387:7;38383:2;38367:28;;38376:5;38367:28;;;;;;;;;;;;38073:330;37995:408;;:::o;64476:27::-;;;;;;;;;;;;;:::o;65802:90::-;1902:13;:11;:13::i;:::-;65880:4:::1;65857:20;;:27;;;;;;;;;;;;;;;;;;65802:90::o:0;65900:91::-;1902:13;:11;:13::i;:::-;65978:5:::1;65955:20;;:28;;;;;;;;;;;;;;;;;;65900:91::o:0;64415:42::-;;;;;;;;;;;;;:::o;27688:323::-;27749:7;27977:15;:13;:15::i;:::-;27962:12;;27946:13;;:28;:46;27939:53;;27688:323;:::o;42201:2853::-;42343:17;:15;:17::i;:::-;42371:27;42401;42420:7;42401:18;:27::i;:::-;42371:57;;42486:4;42445:45;;42461:19;42445:45;;;42441:86;;42499:28;;;;;;;;;;;;;;42441:86;42541:27;42570:23;42597:35;42624:7;42597:26;:35::i;:::-;42540:92;;;;42732:68;42757:15;42774:4;42780:19;:17;:19::i;:::-;42732:24;:68::i;:::-;42727:180;;42820:43;42837:4;42843:19;:17;:19::i;:::-;42820:16;:43::i;:::-;42815:92;;42872:35;;;;;;;;;;;;;;42815:92;42727:180;42938:1;42924:16;;:2;:16;;;42920:52;;42949:23;;;;;;;;;;;;;;42920:52;42985:43;43007:4;43013:2;43017:7;43026:1;42985:21;:43::i;:::-;43121:15;43118:160;;;43261:1;43240:19;43233:30;43118:160;43658:18;:24;43677:4;43658:24;;;;;;;;;;;;;;;;43656:26;;;;;;;;;;;;43727:18;:22;43746:2;43727:22;;;;;;;;;;;;;;;;43725:24;;;;;;;;;;;44049:146;44086:2;44135:45;44150:4;44156:2;44160:19;44135:14;:45::i;:::-;24073:8;44107:73;44049:18;:146::i;:::-;44020:17;:26;44038:7;44020:26;;;;;;;;;;;:175;;;;44366:1;24073:8;44315:19;:47;:52;44311:627;;44388:19;44420:1;44410:7;:11;44388:33;;44577:1;44543:17;:30;44561:11;44543:30;;;;;;;;;;;;:35;44539:384;;44681:13;;44666:11;:28;44662:242;;44861:19;44828:17;:30;44846:11;44828:30;;;;;;;;;;;:52;;;;44662:242;44539:384;44369:569;44311:627;44985:7;44981:2;44966:27;;44975:4;44966:27;;;;;;;;;;;;45004:42;45025:4;45031:2;45035:7;45044:1;45004:20;:42::i;:::-;42332:2722;;;42201:2853;;;:::o;64769:86::-;1902:13;:11;:13::i;:::-;64843:4:::1;64831:9;;:16;;;;;;;;;;;;;;;;;;64769:86:::0;:::o;5515:442::-;5612:7;5621;5641:26;5670:17;:27;5688:8;5670:27;;;;;;;;;;;5641:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5742:1;5714:30;;:7;:16;;;:30;;;5710:92;;5771:19;5761:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5710:92;5814:21;5879:17;:15;:17::i;:::-;5838:58;;5852:7;:23;;;5839:36;;:10;:36;;;;:::i;:::-;5838:58;;;;:::i;:::-;5814:82;;5917:7;:16;;;5935:13;5909:40;;;;;;5515:442;;;;;:::o;64863:87::-;1902:13;:11;:13::i;:::-;64936:6:::1;64925:8;;:17;;;;;;;;;;;;;;;;;;64863:87:::0;:::o;65999:186::-;1902:13;:11;:13::i;:::-;66047:15:::1;66065:21;66047:39;;66098:7;66119:10;66111:24;;66143:7;66111:44;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66097:58;;;66174:2;66166:11;;;::::0;::::1;;66036:149;;65999:186::o:0;45150:193::-;45296:39;45313:4;45319:2;45323:7;45296:39;;;;;;;;;;;;:16;:39::i;:::-;45150:193;;;:::o;65510:102::-;1902:13;:11;:13::i;:::-;65597:7:::1;65581:13;:23;;;;;;:::i;:::-;;65510:102:::0;:::o;33464:152::-;33536:7;33579:27;33598:7;33579:18;:27::i;:::-;33556:52;;33464:152;;;:::o;64958:544::-;65048:4;65024:28;;:20;;;;;;;;;;;:28;;;65016:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;65105:1;65092:10;:14;;;65084:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;65177:9;;;;;;;;;;;65163:23;;:10;:23;;;;65155:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;64358:4;65249:39;;65265:10;65249:26;;:13;:11;:13::i;:::-;:26;;;;:::i;:::-;:39;;65241:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;65355:7;:5;:7::i;:::-;65341:21;;:10;:21;;;65337:118;;65413:8;;;;;;;;;;;65400:10;:21;;;;;;:::i;:::-;65387:34;;:9;:34;65379:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;65337:118;65465:29;65471:10;65483;65465:29;;:5;:29::i;:::-;64958:544;:::o;28872:233::-;28944:7;28985:1;28968:19;;:5;:19;;;28964:60;;28996:28;;;;;;;;;;;;;;28964:60;23017:13;29042:18;:25;29061:5;29042:25;;;;;;;;;;;;;;;;:55;29035:62;;28872:233;;;:::o;2664:103::-;1902:13;:11;:13::i;:::-;2729:30:::1;2756:1;2729:18;:30::i;:::-;2664:103::o:0;64369:39::-;;;;:::o;2016:87::-;2062:7;2089:6;;;;;;;;;;;2082:13;;2016:87;:::o;32247:104::-;32303:13;32336:7;32329:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32247:104;:::o;64529:40::-;;;;;;;;;;;;;:::o;39120:234::-;39267:8;39215:18;:39;39234:19;:17;:19::i;:::-;39215:39;;;;;;;;;;;;;;;:49;39255:8;39215:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;39327:8;39291:55;;39306:19;:17;:19::i;:::-;39291:55;;;39337:8;39291:55;;;;;;:::i;:::-;;;;;;;;39120:234;;:::o;45941:407::-;46116:31;46129:4;46135:2;46139:7;46116:12;:31::i;:::-;46180:1;46162:2;:14;;;:19;46158:183;;46201:56;46232:4;46238:2;46242:7;46251:5;46201:30;:56::i;:::-;46196:145;;46285:40;;;;;;;;;;;;;;46196:145;46158:183;45941:407;;;;:::o;65620:174::-;65685:13;65742;65757:18;65767:7;65757:9;:18::i;:::-;65725:60;;;;;;;;;:::i;:::-;;;;;;;;;;;;;65711:75;;65620:174;;;:::o;64323:39::-;64358:4;64323:39;:::o;39511:164::-;39608:4;39632:18;:25;39651:5;39632:25;;;;;;;;;;;;;;;:35;39658:8;39632:35;;;;;;;;;;;;;;;;;;;;;;;;;39625:42;;39511:164;;;;:::o;2922:201::-;1902:13;:11;:13::i;:::-;3031:1:::1;3011:22;;:8;:22;;::::0;3003:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;3087:28;3106:8;3087:18;:28::i;:::-;2922:201:::0;:::o;26696:172::-;26785:5;26777;:13;;;;;;:::i;:::-;;26811:7;26801;:17;;;;;;:::i;:::-;;26845:15;:13;:15::i;:::-;26829:13;:31;;;;26696:172;;:::o;39933:282::-;39998:4;40054:7;40035:15;:13;:15::i;:::-;:26;;:66;;;;;40088:13;;40078:7;:23;40035:66;:153;;;;;40187:1;23793:8;40139:17;:26;40157:7;40139:26;;;;;;;;;;;;:44;:49;40035:153;40015:173;;39933:282;;;:::o;62319:105::-;62379:7;62406:10;62399:17;;62319:105;:::o;2181:132::-;2256:12;:10;:12::i;:::-;2245:23;;:7;:5;:7::i;:::-;:23;;;2237:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2181:132::o;27204:92::-;27260:7;27287:1;27280:8;;27204:92;:::o;47177:44::-;:::o;34619:1275::-;34686:7;34706:12;34721:7;34706:22;;34789:4;34770:15;:13;:15::i;:::-;:23;34766:1061;;34823:13;;34816:4;:20;34812:1015;;;34861:14;34878:17;:23;34896:4;34878:23;;;;;;;;;;;;34861:40;;34995:1;23793:8;34967:6;:24;:29;34963:845;;35632:113;35649:1;35639:6;:11;35632:113;;35692:17;:25;35710:6;;;;;;;35692:25;;;;;;;;;;;;35683:34;;35632:113;;;35778:6;35771:13;;;;;;34963:845;34838:989;34812:1015;34766:1061;35855:31;;;;;;;;;;;;;;34619:1275;;;;:::o;41096:485::-;41198:27;41227:23;41268:38;41309:15;:24;41325:7;41309:24;;;;;;;;;;;41268:65;;41486:18;41463:41;;41543:19;41537:26;41518:45;;41448:126;41096:485;;;:::o;40324:659::-;40473:11;40638:16;40631:5;40627:28;40618:37;;40798:16;40787:9;40783:32;40770:45;;40948:15;40937:9;40934:30;40926:5;40915:9;40912:20;40909:56;40899:66;;40324:659;;;;;:::o;47010:159::-;;;;;:::o;61628:311::-;61763:7;61783:16;24197:3;61809:19;:41;;61783:68;;24197:3;61877:31;61888:4;61894:2;61898:9;61877:10;:31::i;:::-;61869:40;;:62;;61862:69;;;61628:311;;;;;:::o;36442:450::-;36522:14;36690:16;36683:5;36679:28;36670:37;;36867:5;36853:11;36828:23;36824:41;36821:52;36814:5;36811:63;36801:73;;36442:450;;;;:::o;47884:158::-;;;;;:::o;6239:96::-;6297:6;6323:4;6316:11;;6239:96;:::o;49660:2966::-;49733:20;49756:13;;49733:36;;49796:1;49784:8;:13;49780:44;;49806:18;;;;;;;;;;;;;;49780:44;49837:61;49867:1;49871:2;49875:12;49889:8;49837:21;:61::i;:::-;50381:1;23155:2;50351:1;:26;;50350:32;50338:8;:45;50312:18;:22;50331:2;50312:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;50660:139;50697:2;50751:33;50774:1;50778:2;50782:1;50751:14;:33::i;:::-;50718:30;50739:8;50718:20;:30::i;:::-;:66;50660:18;:139::i;:::-;50626:17;:31;50644:12;50626:31;;;;;;;;;;;:173;;;;50816:16;50847:11;50876:8;50861:12;:23;50847:37;;51397:16;51393:2;51389:25;51377:37;;51769:12;51729:8;51688:1;51626:25;51567:1;51506;51479:335;52140:1;52126:12;52122:20;52080:346;52181:3;52172:7;52169:16;52080:346;;52399:7;52389:8;52386:1;52359:25;52356:1;52353;52348:59;52234:1;52225:7;52221:15;52210:26;;52080:346;;;52084:77;52471:1;52459:8;:13;52455:45;;52481:19;;;;;;;;;;;;;;52455:45;52533:3;52517:13;:19;;;;50086:2462;;52558:60;52587:1;52591:2;52595:12;52609:8;52558:20;:60::i;:::-;49722:2904;49660:2966;;:::o;3283:191::-;3357:16;3376:6;;;;;;;;;;;3357:25;;3402:8;3393:6;;:17;;;;;;;;;;;;;;;;;;3457:8;3426:40;;3447:8;3426:40;;;;;;;;;;;;3346:128;3283:191;:::o;48482:716::-;48645:4;48691:2;48666:45;;;48712:19;:17;:19::i;:::-;48733:4;48739:7;48748:5;48666:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;48662:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48966:1;48949:6;:13;:18;48945:235;;48995:40;;;;;;;;;;;;;;48945:235;49138:6;49132:13;49123:6;49119:2;49115:15;49108:38;48662:529;48835:54;;;48825:64;;;:6;:64;;;;48818:71;;;48482:716;;;;;;:::o;62526:1745::-;62591:17;63025:4;63018;63012:11;63008:22;63117:1;63111:4;63104:15;63192:4;63189:1;63185:12;63178:19;;63274:1;63269:3;63262:14;63378:3;63617:5;63599:428;63625:1;63599:428;;;63665:1;63660:3;63656:11;63649:18;;63836:2;63830:4;63826:13;63822:2;63818:22;63813:3;63805:36;63930:2;63924:4;63920:13;63912:21;;63997:4;63599:428;63987:25;63599:428;63603:21;64066:3;64061;64057:13;64181:4;64176:3;64172:14;64165:21;;64246:6;64241:3;64234:19;62630:1634;;;62526:1745;;;:::o;567:98::-;620:7;647:10;640:17;;567:98;:::o;61329:147::-;61466:6;61329:147;;;;;:::o;36994:324::-;37064:14;37297:1;37287:8;37284:15;37258:24;37254:46;37244:56;;36994:324;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:86::-;4925:7;4965:4;4958:5;4954:16;4943:27;;4890:86;;;:::o;4982:112::-;5065:22;5081:5;5065:22;:::i;:::-;5060:3;5053:35;4982:112;;:::o;5100:214::-;5189:4;5227:2;5216:9;5212:18;5204:26;;5240:67;5304:1;5293:9;5289:17;5280:6;5240:67;:::i;:::-;5100:214;;;;:::o;5320:118::-;5357:7;5397:34;5390:5;5386:46;5375:57;;5320:118;;;:::o;5444:::-;5531:24;5549:5;5531:24;:::i;:::-;5526:3;5519:37;5444:118;;:::o;5568:222::-;5661:4;5699:2;5688:9;5684:18;5676:26;;5712:71;5780:1;5769:9;5765:17;5756:6;5712:71;:::i;:::-;5568:222;;;;:::o;5796:118::-;5883:24;5901:5;5883:24;:::i;:::-;5878:3;5871:37;5796:118;;:::o;5920:222::-;6013:4;6051:2;6040:9;6036:18;6028:26;;6064:71;6132:1;6121:9;6117:17;6108:6;6064:71;:::i;:::-;5920:222;;;;:::o;6148:619::-;6225:6;6233;6241;6290:2;6278:9;6269:7;6265:23;6261:32;6258:119;;;6296:79;;:::i;:::-;6258:119;6416:1;6441:53;6486:7;6477:6;6466:9;6462:22;6441:53;:::i;:::-;6431:63;;6387:117;6543:2;6569:53;6614:7;6605:6;6594:9;6590:22;6569:53;:::i;:::-;6559:63;;6514:118;6671:2;6697:53;6742:7;6733:6;6722:9;6718:22;6697:53;:::i;:::-;6687:63;;6642:118;6148:619;;;;;:::o;6773:118::-;6844:22;6860:5;6844:22;:::i;:::-;6837:5;6834:33;6824:61;;6881:1;6878;6871:12;6824:61;6773:118;:::o;6897:135::-;6941:5;6979:6;6966:20;6957:29;;6995:31;7020:5;6995:31;:::i;:::-;6897:135;;;;:::o;7038:325::-;7095:6;7144:2;7132:9;7123:7;7119:23;7115:32;7112:119;;;7150:79;;:::i;:::-;7112:119;7270:1;7295:51;7338:7;7329:6;7318:9;7314:22;7295:51;:::i;:::-;7285:61;;7241:115;7038:325;;;;:::o;7369:474::-;7437:6;7445;7494:2;7482:9;7473:7;7469:23;7465:32;7462:119;;;7500:79;;:::i;:::-;7462:119;7620:1;7645:53;7690:7;7681:6;7670:9;7666:22;7645:53;:::i;:::-;7635:63;;7591:117;7747:2;7773:53;7818:7;7809:6;7798:9;7794:22;7773:53;:::i;:::-;7763:63;;7718:118;7369:474;;;;;:::o;7849:332::-;7970:4;8008:2;7997:9;7993:18;7985:26;;8021:71;8089:1;8078:9;8074:17;8065:6;8021:71;:::i;:::-;8102:72;8170:2;8159:9;8155:18;8146:6;8102:72;:::i;:::-;7849:332;;;;;:::o;8187:122::-;8260:24;8278:5;8260:24;:::i;:::-;8253:5;8250:35;8240:63;;8299:1;8296;8289:12;8240:63;8187:122;:::o;8315:139::-;8361:5;8399:6;8386:20;8377:29;;8415:33;8442:5;8415:33;:::i;:::-;8315:139;;;;:::o;8460:329::-;8519:6;8568:2;8556:9;8547:7;8543:23;8539:32;8536:119;;;8574:79;;:::i;:::-;8536:119;8694:1;8719:53;8764:7;8755:6;8744:9;8740:22;8719:53;:::i;:::-;8709:63;;8665:117;8460:329;;;;:::o;8795:117::-;8904:1;8901;8894:12;8918:117;9027:1;9024;9017:12;9041:180;9089:77;9086:1;9079:88;9186:4;9183:1;9176:15;9210:4;9207:1;9200:15;9227:281;9310:27;9332:4;9310:27;:::i;:::-;9302:6;9298:40;9440:6;9428:10;9425:22;9404:18;9392:10;9389:34;9386:62;9383:88;;;9451:18;;:::i;:::-;9383:88;9491:10;9487:2;9480:22;9270:238;9227:281;;:::o;9514:129::-;9548:6;9575:20;;:::i;:::-;9565:30;;9604:33;9632:4;9624:6;9604:33;:::i;:::-;9514:129;;;:::o;9649:308::-;9711:4;9801:18;9793:6;9790:30;9787:56;;;9823:18;;:::i;:::-;9787:56;9861:29;9883:6;9861:29;:::i;:::-;9853:37;;9945:4;9939;9935:15;9927:23;;9649:308;;;:::o;9963:146::-;10060:6;10055:3;10050;10037:30;10101:1;10092:6;10087:3;10083:16;10076:27;9963:146;;;:::o;10115:425::-;10193:5;10218:66;10234:49;10276:6;10234:49;:::i;:::-;10218:66;:::i;:::-;10209:75;;10307:6;10300:5;10293:21;10345:4;10338:5;10334:16;10383:3;10374:6;10369:3;10365:16;10362:25;10359:112;;;10390:79;;:::i;:::-;10359:112;10480:54;10527:6;10522:3;10517;10480:54;:::i;:::-;10199:341;10115:425;;;;;:::o;10560:340::-;10616:5;10665:3;10658:4;10650:6;10646:17;10642:27;10632:122;;10673:79;;:::i;:::-;10632:122;10790:6;10777:20;10815:79;10890:3;10882:6;10875:4;10867:6;10863:17;10815:79;:::i;:::-;10806:88;;10622:278;10560:340;;;;:::o;10906:509::-;10975:6;11024:2;11012:9;11003:7;10999:23;10995:32;10992:119;;;11030:79;;:::i;:::-;10992:119;11178:1;11167:9;11163:17;11150:31;11208:18;11200:6;11197:30;11194:117;;;11230:79;;:::i;:::-;11194:117;11335:63;11390:7;11381:6;11370:9;11366:22;11335:63;:::i;:::-;11325:73;;11121:287;10906:509;;;;:::o;11421:329::-;11480:6;11529:2;11517:9;11508:7;11504:23;11500:32;11497:119;;;11535:79;;:::i;:::-;11497:119;11655:1;11680:53;11725:7;11716:6;11705:9;11701:22;11680:53;:::i;:::-;11670:63;;11626:117;11421:329;;;;:::o;11756:116::-;11826:21;11841:5;11826:21;:::i;:::-;11819:5;11816:32;11806:60;;11862:1;11859;11852:12;11806:60;11756:116;:::o;11878:133::-;11921:5;11959:6;11946:20;11937:29;;11975:30;11999:5;11975:30;:::i;:::-;11878:133;;;;:::o;12017:468::-;12082:6;12090;12139:2;12127:9;12118:7;12114:23;12110:32;12107:119;;;12145:79;;:::i;:::-;12107:119;12265:1;12290:53;12335:7;12326:6;12315:9;12311:22;12290:53;:::i;:::-;12280:63;;12236:117;12392:2;12418:50;12460:7;12451:6;12440:9;12436:22;12418:50;:::i;:::-;12408:60;;12363:115;12017:468;;;;;:::o;12491:307::-;12552:4;12642:18;12634:6;12631:30;12628:56;;;12664:18;;:::i;:::-;12628:56;12702:29;12724:6;12702:29;:::i;:::-;12694:37;;12786:4;12780;12776:15;12768:23;;12491:307;;;:::o;12804:423::-;12881:5;12906:65;12922:48;12963:6;12922:48;:::i;:::-;12906:65;:::i;:::-;12897:74;;12994:6;12987:5;12980:21;13032:4;13025:5;13021:16;13070:3;13061:6;13056:3;13052:16;13049:25;13046:112;;;13077:79;;:::i;:::-;13046:112;13167:54;13214:6;13209:3;13204;13167:54;:::i;:::-;12887:340;12804:423;;;;;:::o;13246:338::-;13301:5;13350:3;13343:4;13335:6;13331:17;13327:27;13317:122;;13358:79;;:::i;:::-;13317:122;13475:6;13462:20;13500:78;13574:3;13566:6;13559:4;13551:6;13547:17;13500:78;:::i;:::-;13491:87;;13307:277;13246:338;;;;:::o;13590:943::-;13685:6;13693;13701;13709;13758:3;13746:9;13737:7;13733:23;13729:33;13726:120;;;13765:79;;:::i;:::-;13726:120;13885:1;13910:53;13955:7;13946:6;13935:9;13931:22;13910:53;:::i;:::-;13900:63;;13856:117;14012:2;14038:53;14083:7;14074:6;14063:9;14059:22;14038:53;:::i;:::-;14028:63;;13983:118;14140:2;14166:53;14211:7;14202:6;14191:9;14187:22;14166:53;:::i;:::-;14156:63;;14111:118;14296:2;14285:9;14281:18;14268:32;14327:18;14319:6;14316:30;14313:117;;;14349:79;;:::i;:::-;14313:117;14454:62;14508:7;14499:6;14488:9;14484:22;14454:62;:::i;:::-;14444:72;;14239:287;13590:943;;;;;;;:::o;14539:89::-;14575:7;14615:6;14608:5;14604:18;14593:29;;14539:89;;;:::o;14634:115::-;14719:23;14736:5;14719:23;:::i;:::-;14714:3;14707:36;14634:115;;:::o;14755:218::-;14846:4;14884:2;14873:9;14869:18;14861:26;;14897:69;14963:1;14952:9;14948:17;14939:6;14897:69;:::i;:::-;14755:218;;;;:::o;14979:474::-;15047:6;15055;15104:2;15092:9;15083:7;15079:23;15075:32;15072:119;;;15110:79;;:::i;:::-;15072:119;15230:1;15255:53;15300:7;15291:6;15280:9;15276:22;15255:53;:::i;:::-;15245:63;;15201:117;15357:2;15383:53;15428:7;15419:6;15408:9;15404:22;15383:53;:::i;:::-;15373:63;;15328:118;14979:474;;;;;:::o;15459:180::-;15507:77;15504:1;15497:88;15604:4;15601:1;15594:15;15628:4;15625:1;15618:15;15645:320;15689:6;15726:1;15720:4;15716:12;15706:22;;15773:1;15767:4;15763:12;15794:18;15784:81;;15850:4;15842:6;15838:17;15828:27;;15784:81;15912:2;15904:6;15901:14;15881:18;15878:38;15875:84;;15931:18;;:::i;:::-;15875:84;15696:269;15645:320;;;:::o;15971:180::-;16019:77;16016:1;16009:88;16116:4;16113:1;16106:15;16140:4;16137:1;16130:15;16157:410;16197:7;16220:20;16238:1;16220:20;:::i;:::-;16215:25;;16254:20;16272:1;16254:20;:::i;:::-;16249:25;;16309:1;16306;16302:9;16331:30;16349:11;16331:30;:::i;:::-;16320:41;;16510:1;16501:7;16497:15;16494:1;16491:22;16471:1;16464:9;16444:83;16421:139;;16540:18;;:::i;:::-;16421:139;16205:362;16157:410;;;;:::o;16573:180::-;16621:77;16618:1;16611:88;16718:4;16715:1;16708:15;16742:4;16739:1;16732:15;16759:185;16799:1;16816:20;16834:1;16816:20;:::i;:::-;16811:25;;16850:20;16868:1;16850:20;:::i;:::-;16845:25;;16889:1;16879:35;;16894:18;;:::i;:::-;16879:35;16936:1;16933;16929:9;16924:14;;16759:185;;;;:::o;16950:147::-;17051:11;17088:3;17073:18;;16950:147;;;;:::o;17103:114::-;;:::o;17223:398::-;17382:3;17403:83;17484:1;17479:3;17403:83;:::i;:::-;17396:90;;17495:93;17584:3;17495:93;:::i;:::-;17613:1;17608:3;17604:11;17597:18;;17223:398;;;:::o;17627:379::-;17811:3;17833:147;17976:3;17833:147;:::i;:::-;17826:154;;17997:3;17990:10;;17627:379;;;:::o;18012:141::-;18061:4;18084:3;18076:11;;18107:3;18104:1;18097:14;18141:4;18138:1;18128:18;18120:26;;18012:141;;;:::o;18159:93::-;18196:6;18243:2;18238;18231:5;18227:14;18223:23;18213:33;;18159:93;;;:::o;18258:107::-;18302:8;18352:5;18346:4;18342:16;18321:37;;18258:107;;;;:::o;18371:393::-;18440:6;18490:1;18478:10;18474:18;18513:97;18543:66;18532:9;18513:97;:::i;:::-;18631:39;18661:8;18650:9;18631:39;:::i;:::-;18619:51;;18703:4;18699:9;18692:5;18688:21;18679:30;;18752:4;18742:8;18738:19;18731:5;18728:30;18718:40;;18447:317;;18371:393;;;;;:::o;18770:60::-;18798:3;18819:5;18812:12;;18770:60;;;:::o;18836:142::-;18886:9;18919:53;18937:34;18946:24;18964:5;18946:24;:::i;:::-;18937:34;:::i;:::-;18919:53;:::i;:::-;18906:66;;18836:142;;;:::o;18984:75::-;19027:3;19048:5;19041:12;;18984:75;;;:::o;19065:269::-;19175:39;19206:7;19175:39;:::i;:::-;19236:91;19285:41;19309:16;19285:41;:::i;:::-;19277:6;19270:4;19264:11;19236:91;:::i;:::-;19230:4;19223:105;19141:193;19065:269;;;:::o;19340:73::-;19385:3;19340:73;:::o;19419:189::-;19496:32;;:::i;:::-;19537:65;19595:6;19587;19581:4;19537:65;:::i;:::-;19472:136;19419:189;;:::o;19614:186::-;19674:120;19691:3;19684:5;19681:14;19674:120;;;19745:39;19782:1;19775:5;19745:39;:::i;:::-;19718:1;19711:5;19707:13;19698:22;;19674:120;;;19614:186;;:::o;19806:543::-;19907:2;19902:3;19899:11;19896:446;;;19941:38;19973:5;19941:38;:::i;:::-;20025:29;20043:10;20025:29;:::i;:::-;20015:8;20011:44;20208:2;20196:10;20193:18;20190:49;;;20229:8;20214:23;;20190:49;20252:80;20308:22;20326:3;20308:22;:::i;:::-;20298:8;20294:37;20281:11;20252:80;:::i;:::-;19911:431;;19896:446;19806:543;;;:::o;20355:117::-;20409:8;20459:5;20453:4;20449:16;20428:37;;20355:117;;;;:::o;20478:169::-;20522:6;20555:51;20603:1;20599:6;20591:5;20588:1;20584:13;20555:51;:::i;:::-;20551:56;20636:4;20630;20626:15;20616:25;;20529:118;20478:169;;;;:::o;20652:295::-;20728:4;20874:29;20899:3;20893:4;20874:29;:::i;:::-;20866:37;;20936:3;20933:1;20929:11;20923:4;20920:21;20912:29;;20652:295;;;;:::o;20952:1395::-;21069:37;21102:3;21069:37;:::i;:::-;21171:18;21163:6;21160:30;21157:56;;;21193:18;;:::i;:::-;21157:56;21237:38;21269:4;21263:11;21237:38;:::i;:::-;21322:67;21382:6;21374;21368:4;21322:67;:::i;:::-;21416:1;21440:4;21427:17;;21472:2;21464:6;21461:14;21489:1;21484:618;;;;22146:1;22163:6;22160:77;;;22212:9;22207:3;22203:19;22197:26;22188:35;;22160:77;22263:67;22323:6;22316:5;22263:67;:::i;:::-;22257:4;22250:81;22119:222;21454:887;;21484:618;21536:4;21532:9;21524:6;21520:22;21570:37;21602:4;21570:37;:::i;:::-;21629:1;21643:208;21657:7;21654:1;21651:14;21643:208;;;21736:9;21731:3;21727:19;21721:26;21713:6;21706:42;21787:1;21779:6;21775:14;21765:24;;21834:2;21823:9;21819:18;21806:31;;21680:4;21677:1;21673:12;21668:17;;21643:208;;;21879:6;21870:7;21867:19;21864:179;;;21937:9;21932:3;21928:19;21922:26;21980:48;22022:4;22014:6;22010:17;21999:9;21980:48;:::i;:::-;21972:6;21965:64;21887:156;21864:179;22089:1;22085;22077:6;22073:14;22069:22;22063:4;22056:36;21491:611;;;21454:887;;21044:1303;;;20952:1395;;:::o;22353:166::-;22493:18;22489:1;22481:6;22477:14;22470:42;22353:166;:::o;22525:366::-;22667:3;22688:67;22752:2;22747:3;22688:67;:::i;:::-;22681:74;;22764:93;22853:3;22764:93;:::i;:::-;22882:2;22877:3;22873:12;22866:19;;22525:366;;;:::o;22897:419::-;23063:4;23101:2;23090:9;23086:18;23078:26;;23150:9;23144:4;23140:20;23136:1;23125:9;23121:17;23114:47;23178:131;23304:4;23178:131;:::i;:::-;23170:139;;22897:419;;;:::o;23322:220::-;23462:34;23458:1;23450:6;23446:14;23439:58;23531:3;23526:2;23518:6;23514:15;23507:28;23322:220;:::o;23548:366::-;23690:3;23711:67;23775:2;23770:3;23711:67;:::i;:::-;23704:74;;23787:93;23876:3;23787:93;:::i;:::-;23905:2;23900:3;23896:12;23889:19;;23548:366;;;:::o;23920:419::-;24086:4;24124:2;24113:9;24109:18;24101:26;;24173:9;24167:4;24163:20;24159:1;24148:9;24144:17;24137:47;24201:131;24327:4;24201:131;:::i;:::-;24193:139;;23920:419;;;:::o;24345:226::-;24485:34;24481:1;24473:6;24469:14;24462:58;24554:9;24549:2;24541:6;24537:15;24530:34;24345:226;:::o;24577:366::-;24719:3;24740:67;24804:2;24799:3;24740:67;:::i;:::-;24733:74;;24816:93;24905:3;24816:93;:::i;:::-;24934:2;24929:3;24925:12;24918:19;;24577:366;;;:::o;24949:419::-;25115:4;25153:2;25142:9;25138:18;25130:26;;25202:9;25196:4;25192:20;25188:1;25177:9;25173:17;25166:47;25230:131;25356:4;25230:131;:::i;:::-;25222:139;;24949:419;;;:::o;25374:191::-;25414:3;25433:20;25451:1;25433:20;:::i;:::-;25428:25;;25467:20;25485:1;25467:20;:::i;:::-;25462:25;;25510:1;25507;25503:9;25496:16;;25531:3;25528:1;25525:10;25522:36;;;25538:18;;:::i;:::-;25522:36;25374:191;;;;:::o;25571:220::-;25711:34;25707:1;25699:6;25695:14;25688:58;25780:3;25775:2;25767:6;25763:15;25756:28;25571:220;:::o;25797:366::-;25939:3;25960:67;26024:2;26019:3;25960:67;:::i;:::-;25953:74;;26036:93;26125:3;26036:93;:::i;:::-;26154:2;26149:3;26145:12;26138:19;;25797:366;;;:::o;26169:419::-;26335:4;26373:2;26362:9;26358:18;26350:26;;26422:9;26416:4;26412:20;26408:1;26397:9;26393:17;26386:47;26450:131;26576:4;26450:131;:::i;:::-;26442:139;;26169:419;;;:::o;26594:279::-;26634:7;26657:20;26675:1;26657:20;:::i;:::-;26652:25;;26691:20;26709:1;26691:20;:::i;:::-;26686:25;;26746:1;26743;26739:9;26768:30;26786:11;26768:30;:::i;:::-;26757:41;;26830:11;26821:7;26818:24;26808:58;;26846:18;;:::i;:::-;26808:58;26642:231;26594:279;;;;:::o;26879:167::-;27019:19;27015:1;27007:6;27003:14;26996:43;26879:167;:::o;27052:366::-;27194:3;27215:67;27279:2;27274:3;27215:67;:::i;:::-;27208:74;;27291:93;27380:3;27291:93;:::i;:::-;27409:2;27404:3;27400:12;27393:19;;27052:366;;;:::o;27424:419::-;27590:4;27628:2;27617:9;27613:18;27605:26;;27677:9;27671:4;27667:20;27663:1;27652:9;27648:17;27641:47;27705:131;27831:4;27705:131;:::i;:::-;27697:139;;27424:419;;;:::o;27849:148::-;27951:11;27988:3;27973:18;;27849:148;;;;:::o;28027:874::-;28130:3;28167:5;28161:12;28196:36;28222:9;28196:36;:::i;:::-;28248:89;28330:6;28325:3;28248:89;:::i;:::-;28241:96;;28368:1;28357:9;28353:17;28384:1;28379:166;;;;28559:1;28554:341;;;;28346:549;;28379:166;28463:4;28459:9;28448;28444:25;28439:3;28432:38;28525:6;28518:14;28511:22;28503:6;28499:35;28494:3;28490:45;28483:52;;28379:166;;28554:341;28621:38;28653:5;28621:38;:::i;:::-;28681:1;28695:154;28709:6;28706:1;28703:13;28695:154;;;28783:7;28777:14;28773:1;28768:3;28764:11;28757:35;28833:1;28824:7;28820:15;28809:26;;28731:4;28728:1;28724:12;28719:17;;28695:154;;;28878:6;28873:3;28869:16;28862:23;;28561:334;;28346:549;;28134:767;;28027:874;;;;:::o;28907:390::-;29013:3;29041:39;29074:5;29041:39;:::i;:::-;29096:89;29178:6;29173:3;29096:89;:::i;:::-;29089:96;;29194:65;29252:6;29247:3;29240:4;29233:5;29229:16;29194:65;:::i;:::-;29284:6;29279:3;29275:16;29268:23;;29017:280;28907:390;;;;:::o;29303:155::-;29443:7;29439:1;29431:6;29427:14;29420:31;29303:155;:::o;29464:400::-;29624:3;29645:84;29727:1;29722:3;29645:84;:::i;:::-;29638:91;;29738:93;29827:3;29738:93;:::i;:::-;29856:1;29851:3;29847:11;29840:18;;29464:400;;;:::o;29870:695::-;30148:3;30170:92;30258:3;30249:6;30170:92;:::i;:::-;30163:99;;30279:95;30370:3;30361:6;30279:95;:::i;:::-;30272:102;;30391:148;30535:3;30391:148;:::i;:::-;30384:155;;30556:3;30549:10;;29870:695;;;;;:::o;30571:225::-;30711:34;30707:1;30699:6;30695:14;30688:58;30780:8;30775:2;30767:6;30763:15;30756:33;30571:225;:::o;30802:366::-;30944:3;30965:67;31029:2;31024:3;30965:67;:::i;:::-;30958:74;;31041:93;31130:3;31041:93;:::i;:::-;31159:2;31154:3;31150:12;31143:19;;30802:366;;;:::o;31174:419::-;31340:4;31378:2;31367:9;31363:18;31355:26;;31427:9;31421:4;31417:20;31413:1;31402:9;31398:17;31391:47;31455:131;31581:4;31455:131;:::i;:::-;31447:139;;31174:419;;;:::o;31599:182::-;31739:34;31735:1;31727:6;31723:14;31716:58;31599:182;:::o;31787:366::-;31929:3;31950:67;32014:2;32009:3;31950:67;:::i;:::-;31943:74;;32026:93;32115:3;32026:93;:::i;:::-;32144:2;32139:3;32135:12;32128:19;;31787:366;;;:::o;32159:419::-;32325:4;32363:2;32352:9;32348:18;32340:26;;32412:9;32406:4;32402:20;32398:1;32387:9;32383:17;32376:47;32440:131;32566:4;32440:131;:::i;:::-;32432:139;;32159:419;;;:::o;32584:98::-;32635:6;32669:5;32663:12;32653:22;;32584:98;;;:::o;32688:168::-;32771:11;32805:6;32800:3;32793:19;32845:4;32840:3;32836:14;32821:29;;32688:168;;;;:::o;32862:373::-;32948:3;32976:38;33008:5;32976:38;:::i;:::-;33030:70;33093:6;33088:3;33030:70;:::i;:::-;33023:77;;33109:65;33167:6;33162:3;33155:4;33148:5;33144:16;33109:65;:::i;:::-;33199:29;33221:6;33199:29;:::i;:::-;33194:3;33190:39;33183:46;;32952:283;32862:373;;;;:::o;33241:640::-;33436:4;33474:3;33463:9;33459:19;33451:27;;33488:71;33556:1;33545:9;33541:17;33532:6;33488:71;:::i;:::-;33569:72;33637:2;33626:9;33622:18;33613:6;33569:72;:::i;:::-;33651;33719:2;33708:9;33704:18;33695:6;33651:72;:::i;:::-;33770:9;33764:4;33760:20;33755:2;33744:9;33740:18;33733:48;33798:76;33869:4;33860:6;33798:76;:::i;:::-;33790:84;;33241:640;;;;;;;:::o;33887:141::-;33943:5;33974:6;33968:13;33959:22;;33990:32;34016:5;33990:32;:::i;:::-;33887:141;;;;:::o;34034:349::-;34103:6;34152:2;34140:9;34131:7;34127:23;34123:32;34120:119;;;34158:79;;:::i;:::-;34120:119;34278:1;34303:63;34358:7;34349:6;34338:9;34334:22;34303:63;:::i;:::-;34293:73;;34249:127;34034:349;;;;:::o
Swarm Source
ipfs://26f2f9c056d4e9415d3143672fc06cc9704d769ed6b4d47bcdbcad1b90c51dbb
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.