ERC-721
Overview
Max Total Supply
15 CXO
Holders
11
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 CXOLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
CryptoOtters
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-08-24 */ // SPDX-License-Identifier: MIT // Sources flattened with hardhat v2.10.1 https://hardhat.org // File @openzeppelin/contracts-upgradeable/utils/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require( address(this).balance >= amount, "Address: insufficient balance" ); (bool success, ) = recipient.call{value: amount}(""); require( success, "Address: unable to send value, recipient may have reverted" ); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue( target, data, value, "Address: low-level call with value failed" ); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require( address(this).balance >= value, "Address: insufficient balance for call" ); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}( data ); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall( target, data, "Address: low-level static call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts-upgradeable/proxy/utils/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ``` * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`. */ modifier initializer() { bool isTopLevelCall = !_initializing; require( (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1), "Initializable: contract is already initialized" ); _initialized = 1; if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original * initialization step. This is essential to configure modules that are added through upgrades and that require * initialization. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. */ modifier reinitializer(uint8 version) { require( !_initializing && _initialized < version, "Initializable: contract is already initialized" ); _initialized = version; _initializing = true; _; _initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); if (_initialized < type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } } // File @openzeppelin/contracts-upgradeable/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing {} function __Context_init_unchained() internal onlyInitializing {} function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/access/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal onlyInitializing { __Ownable_init_unchained(); } function __Ownable_init_unchained() internal onlyInitializing { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require( newOwner != address(0), "Ownable: new owner is the zero address" ); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; } // File contracts/ERC721-upgradeable/IERC721AUpgradeable.sol // ERC721A Contracts v4.2.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721A. */ interface IERC721AUpgradeable { /** * The quantity of tokens by transaction or wallet exceeds the maximum batch size. */ error ExceedsMaximumBatchSize(); /** * The maximum number of tokens by transaction or wallet cannot be zero. */ error MaximumBatchSizeZero(); /** * The total quantity of the collection cannot be zero. */ error CollectionSizeZero(); /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an uninitialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================================================= // IERC721 // ============================================================= /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer( address indexed from, address indexed to, uint256 indexed tokenId ); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval( address indexed owner, address indexed approved, uint256 indexed tokenId ); /** * @dev Emitted when `owner` enables or disables * (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll( address indexed owner, address indexed operator, bool approved ); /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, * checking first that contract recipients are aware of the ERC721 protocol * to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move * this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} * whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer( uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to ); } // File contracts/ERC721-upgradeable/ERC721AStorage.sol pragma solidity ^0.8.0; library ERC721AStorage { // Reference type for token approval. struct TokenApprovalRef { address value; } struct Layout { // ============================================================= // STORAGE // ============================================================= // The next token ID to be minted. uint256 _currentIndex; // The number of tokens burned. uint256 _burnCounter; // Token name string _name; // Token symbol string _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See {_packedOwnershipOf} implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => ERC721AStorage.TokenApprovalRef) _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) _operatorApprovals; // Maximum number of mints allowed by transaction or wallet in presale uint256 _maxBatchSizePreSale; // Maximum number of mints allowed by transaction or wallet in publicSale uint256 _maxBatchSizePublicSale; // Maximum number of nfts that can be minted uint256 _collectionSize; // Maximum number of ntfs that can be minted in presale. uint256 _amountForPreSale; // Maximum number of ntfs that can be minted in public sale. uint256 _amountForPublicSale; // Maximum number of ntfs that can be minted in free. uint256 _amountForFreeSale; // Price by nft in public sale. uint256 _pricePublicSale; // Price by nft in presale. uint256 _pricePreSale; // Items sold in presale uint256 _preSaleCurrentIndex; // Items sold in public sale uint256 _publicSaleCurrentIndex; uint256 _freeSaleCurrentIndex; // Determine if public sale is active bool _publicSaleActive; // Determine if pre-sale is active bool _preSaleActive; // false if base uri is hidden bool _reveled; // Save base URI string _baseUri; // Save hidden base URI string _hiddenBaseUri; // Sabe sufix base uri string _uriSuffix; mapping(address => uint) _tokensBoughtPreSale; mapping(address => uint) _tokensBoughtPublicSale; } bytes32 internal constant STORAGE_SLOT = keccak256("ERC721A.contracts.storage.ERC721A"); function layout() internal pure returns (Layout storage l) { bytes32 slot = STORAGE_SLOT; assembly { l.slot := slot } } } // File contracts/ERC721-upgradeable/ERC721A__InitializableStorage.sol pragma solidity ^0.8.0; /** * @dev This is a base storage for the initialization function for upgradeable diamond facet contracts **/ library ERC721A__InitializableStorage { struct Layout { /* * Indicates that the contract has been initialized. */ bool _initialized; /* * Indicates that the contract is in the process of being initialized. */ bool _initializing; } bytes32 internal constant STORAGE_SLOT = keccak256("ERC721A.contracts.storage.initializable.facet"); function layout() internal pure returns (Layout storage l) { bytes32 slot = STORAGE_SLOT; assembly { l.slot := slot } } } // File contracts/ERC721-upgradeable/ERC721A__Initializable.sol pragma solidity ^0.8.0; /** * @dev This is a base contract to aid in writing upgradeable diamond facet contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. */ abstract contract ERC721A__Initializable { using ERC721A__InitializableStorage for ERC721A__InitializableStorage.Layout; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializerERC721A() { // If the contract is initializing we ignore whether _initialized is set in order to support multiple // inheritance patterns, but we only do this in the context of a constructor, because in other contexts the // contract may have been reentered. require( ERC721A__InitializableStorage.layout()._initializing ? _isConstructor() : !ERC721A__InitializableStorage.layout()._initialized, "ERC721A__Initializable: contract is already initialized" ); bool isTopLevelCall = !ERC721A__InitializableStorage .layout() ._initializing; if (isTopLevelCall) { ERC721A__InitializableStorage.layout()._initializing = true; ERC721A__InitializableStorage.layout()._initialized = true; } _; if (isTopLevelCall) { ERC721A__InitializableStorage.layout()._initializing = false; } } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} modifier, directly or indirectly. */ modifier onlyInitializingERC721A() { require( ERC721A__InitializableStorage.layout()._initializing, "ERC721A__Initializable: contract is not initializing" ); _; } /// @dev Returns true if and only if the function is running in the constructor function _isConstructor() private view returns (bool) { // extcodesize checks the size of the code stored in an address, and // address returns the current address. Since the code is still not // deployed when running a constructor, any checks on its code size will // yield zero, making it an effective way to detect if a contract is // under construction or not. address self = address(this); uint256 cs; assembly { cs := extcodesize(self) } return cs == 0; } } // File contracts/ERC721-upgradeable/ERC721AUpgradeable.sol // ERC721A Contracts v4.2.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721 token receiver. */ interface ERC721A__IERC721ReceiverUpgradeable { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC721A * * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721) * Non-Fungible Token Standard, including the Metadata extension. * Optimized for lower gas during batch mints. * * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...) * starting from `_startTokenId()`. * * Assumptions: * * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721AUpgradeable is ERC721A__Initializable, IERC721AUpgradeable { using ERC721AStorage for ERC721AStorage.Layout; // ============================================================= // CONSTANTS // ============================================================= // Mask of an entry in packed address data. uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant _BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant _BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant _BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant _BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant _BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant _BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with {_mintERC2309}. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309} // is required to cause an overflow, which is unrealistic. uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // mapping that saves users have already recived token sales distribution mapping(address => bool) private _receiveDistribution; // ============================================================= // CONSTRUCTOR // ============================================================= function __ERC721A_init( string memory name_, string memory symbol_, uint256 pricePublicSale_, uint256 pricePreSale_, uint256 amountForPreSale_, uint256 amountForPublicSale_, uint256 amountForFreeSale_, uint256 maxBatchSizePublicSale_, uint256 maxBatchSizePreSale_ ) internal onlyInitializingERC721A { __ERC721A_init_unchained( name_, symbol_, pricePublicSale_, pricePreSale_, amountForPreSale_, amountForPublicSale_, amountForFreeSale_, maxBatchSizePublicSale_, maxBatchSizePreSale_ ); } function __ERC721A_init_unchained( string memory name_, string memory symbol_, uint256 pricePublicSale_, uint256 pricePreSale_, uint256 amountForPreSale_, uint256 amountForPublicSale_, uint256 amountForFreeSale_, uint256 maxBatchSizePublicSale_, uint256 maxBatchSizePreSale_ ) internal onlyInitializingERC721A { ERC721AStorage.layout()._name = name_; ERC721AStorage.layout()._symbol = symbol_; ERC721AStorage.layout()._pricePublicSale = pricePublicSale_; ERC721AStorage.layout()._pricePreSale = pricePreSale_; ERC721AStorage.layout()._amountForPublicSale = amountForPublicSale_; ERC721AStorage.layout()._amountForFreeSale = amountForFreeSale_; ERC721AStorage.layout()._amountForPreSale = amountForPreSale_; ERC721AStorage.layout()._maxBatchSizePreSale = maxBatchSizePreSale_; ERC721AStorage .layout() ._maxBatchSizePublicSale = maxBatchSizePublicSale_; ERC721AStorage.layout()._currentIndex = _startTokenId(); ERC721AStorage.layout()._preSaleCurrentIndex = _startTokenId(); ERC721AStorage.layout()._publicSaleCurrentIndex = _startTokenId(); ERC721AStorage.layout()._freeSaleCurrentIndex = _startTokenId(); ERC721AStorage .layout() ._baseUri = "https://ipfs.io/ipfs/QmPKWxB5fhj4XS3P3joV9EFCL8CybrKpLFaQE8n7R7vwqY/"; ERC721AStorage .layout() ._hiddenBaseUri = "https://ipfs.io/ipfs/hidden_url"; } // ============================================================= // 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 ERC721AStorage.layout()._currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() public view virtual override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return ERC721AStorage.layout()._currentIndex - ERC721AStorage.layout()._burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view virtual returns (uint256) { // Counter underflow is impossible as `_currentIndex` does not decrement, // and it is initialized to `_startTokenId()`. unchecked { return ERC721AStorage.layout()._currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view virtual returns (uint256) { return ERC721AStorage.layout()._burnCounter; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return ERC721AStorage.layout()._packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (ERC721AStorage.layout()._packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (ERC721AStorage.layout()._packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64( ERC721AStorage.layout()._packedAddressData[owner] >> _BITPOS_AUX ); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal virtual { uint256 packed = ERC721AStorage.layout()._packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); ERC721AStorage.layout()._packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes // of the XOR of all function selectors in the interface. // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165) // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`) return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return ERC721AStorage.layout()._name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return ERC721AStorage.layout()._symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); string memory uriSuffix = ERC721AStorage.layout()._uriSuffix; if (!ERC721AStorage.layout()._reveled) { return ERC721AStorage.layout()._hiddenBaseUri; } return bytes(baseURI).length != 0 ? string( abi.encodePacked(baseURI, _toString(tokenId), uriSuffix) ) : ""; } /** * @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 ERC721AStorage.layout()._baseUri; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership( ERC721AStorage.layout()._packedOwnerships[index] ); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (ERC721AStorage.layout()._packedOwnerships[index] == 0) { ERC721AStorage.layout()._packedOwnerships[ index ] = _packedOwnershipOf(index); } } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < ERC721AStorage.layout()._currentIndex) { uint256 packed = ERC721AStorage.layout()._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 = ERC721AStorage.layout()._packedOwnerships[ --curr ]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * @dev Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`. result := or( owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags) ) } } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`. result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } ERC721AStorage.layout()._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 ERC721AStorage.layout()._tokenApprovals[tokenId].value; } /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); ERC721AStorage.layout()._operatorApprovals[_msgSenderERC721A()][ operator ] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return ERC721AStorage.layout()._operatorApprovals[owner][operator]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _startTokenId() <= tokenId && tokenId < ERC721AStorage.layout()._currentIndex && // If within bounds, ERC721AStorage.layout()._packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned. } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { ERC721AStorage.TokenApprovalRef storage tokenApproval = ERC721AStorage .layout() ._tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); ( uint256 approvedAddressSlot, address approvedAddress ) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if ( !_isSenderApprovedOrOwner( approvedAddress, from, _msgSenderERC721A() ) ) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --ERC721AStorage.layout()._packedAddressData[from]; // Updates: `balance -= 1`. ++ERC721AStorage.layout()._packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. ERC721AStorage.layout()._packedOwnerships[ tokenId ] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if ( ERC721AStorage.layout()._packedOwnerships[nextTokenId] == 0 ) { // If the next slot is within bounds. if (nextTokenId != ERC721AStorage.layout()._currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. ERC721AStorage.layout()._packedOwnerships[ nextTokenId ] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Hook that is called before a set of serially-ordered token IDs * are about to be transferred. This includes minting. * And also called before burning one token. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token IDs * have been transferred. This includes minting. * And also called after one token has been burned. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns whether the call correctly returned the expected magic value. */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721ReceiverUpgradeable(to).onERC721Received( _msgSenderERC721A(), from, tokenId, _data ) returns (bytes4 retval) { return retval == ERC721A__IERC721ReceiverUpgradeable(to) .onERC721Received .selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = ERC721AStorage.layout()._currentIndex; if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. ERC721AStorage.layout()._packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. ERC721AStorage.layout()._packedOwnerships[ startTokenId ] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 toMasked; uint256 end = startTokenId + quantity; // Use assembly to loop and emit the `Transfer` event for gas savings. assembly { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(to, _BITMASK_ADDRESS) // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. startTokenId // `tokenId`. ) for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { // Emit the `Transfer` event. Similar to above. log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } if (toMasked == 0) revert MintToZeroAddress(); ERC721AStorage.layout()._currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = ERC721AStorage.layout()._currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. ERC721AStorage.layout()._packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. ERC721AStorage.layout()._packedOwnerships[ startTokenId ] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer( startTokenId, startTokenId + quantity - 1, address(0), to ); ERC721AStorage.layout()._currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = ERC721AStorage.layout()._currentIndex; uint256 index = end - quantity; do { if ( !_checkContractOnERC721Received( address(0), to, index++, _data ) ) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (ERC721AStorage.layout()._currentIndex != end) revert(); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ""); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); ( uint256 approvedAddressSlot, address approvedAddress ) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if ( !_isSenderApprovedOrOwner( approvedAddress, from, _msgSenderERC721A() ) ) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. ERC721AStorage.layout()._packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. ERC721AStorage.layout()._packedOwnerships[ tokenId ] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if ( ERC721AStorage.layout()._packedOwnerships[nextTokenId] == 0 ) { // If the next slot is within bounds. if (nextTokenId != ERC721AStorage.layout()._currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. ERC721AStorage.layout()._packedOwnerships[ nextTokenId ] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { ERC721AStorage.layout()._burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = ERC721AStorage.layout()._packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); ERC721AStorage.layout()._packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the consumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function _toString(uint256 value) internal pure virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 0x80 bytes to keep the free memory pointer 32-byte word aliged. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 0x20 + 3 * 0x20 = 0x80. str := add(mload(0x40), 0x80) // Update the free memory pointer to allocate. mstore(0x40, str) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } function _getTokensOfAddress(address address_) internal view returns (string[] memory) { uint256 currentIndex = ERC721AStorage.layout()._currentIndex; uint256 balanceAddress = balanceOf(address_); string[] memory tokensOwned = new string[](balanceAddress); uint256 counter; for (uint256 i = _startTokenId(); i < currentIndex; i++) { if (ownerOf(i) == address_) { tokensOwned[counter] = tokenURI(i); unchecked { counter += 1; } } } return tokensOwned; } } // File contracts/CryptoOtters.sol pragma solidity ^0.8.4; /** @author NFT Constructer Team **/ /** @title Omniverse */ contract CryptoOtters is ERC721AUpgradeable, OwnableUpgradeable { /** * @dev Initialize upgradeable storage (constructor). * @custom:restriction This function only can be executed one time. */ function initialize() public initializerERC721A initializer { __ERC721A_init({ name_: "CryptoOtters", symbol_: "CXO", pricePublicSale_: 0.052 ether, pricePreSale_: 0.039 ether, amountForPreSale_: 1500, amountForPublicSale_: 8500, amountForFreeSale_: 10000, maxBatchSizePublicSale_: 3, maxBatchSizePreSale_: 3 }); __Ownable_init(); } /** * @dev Mint NFT taking as reference presale values * @param quantity Quantity of nfts to mint in transaction * @custom:restriction Quantity must be less or equals to maxBatchSize */ function preSaleMint(uint256 quantity) external payable { require( ERC721AStorage.layout()._preSaleActive, "Presale is not active" ); require( ERC721AStorage.layout()._amountForPreSale >= (ERC721AStorage.layout()._preSaleCurrentIndex + quantity), "Transfer exceeds total supply." ); require( ERC721AStorage.layout()._tokensBoughtPreSale[msg.sender] + quantity <= ERC721AStorage.layout()._maxBatchSizePreSale, "Transfer exceeds max amount." ); uint256 amount = quantity * ERC721AStorage.layout()._pricePreSale; require(msg.value == amount, "Price not covered."); _mint(msg.sender, quantity); unchecked { ERC721AStorage.layout()._preSaleCurrentIndex += quantity; ERC721AStorage.layout()._tokensBoughtPreSale[ msg.sender ] += quantity; } } /** * @dev Mint NFT taking as reference public sale values * @param quantity Quantity of nfts to mint in transaction * @custom:restriction Quantity must be less or equals to maxBatchSize */ function publicSaleMint(uint256 quantity) external payable { require( ERC721AStorage.layout()._publicSaleActive, "Public sale is not active" ); require( ERC721AStorage.layout()._amountForPublicSale >= (ERC721AStorage.layout()._publicSaleCurrentIndex + quantity), "Transfer exceeds total supply." ); require( ERC721AStorage.layout()._tokensBoughtPublicSale[msg.sender] + quantity <= ERC721AStorage.layout()._maxBatchSizePublicSale, "Transfer exceeds max amount." ); uint256 amount = quantity * ERC721AStorage.layout()._pricePublicSale; require(msg.value == amount, "Price not covered."); _mint(msg.sender, quantity); unchecked { ERC721AStorage.layout()._publicSaleCurrentIndex += quantity; ERC721AStorage.layout()._tokensBoughtPublicSale[ msg.sender ] += quantity; } } /** * @dev Mint NFT taking as reference public sale values * @param quantity Quantity of nfts to mint in transaction * @custom:restriction Quantity must be less or equals to maxBatchSize */ function ownerMint(uint256 quantity) external onlyOwner { require( ERC721AStorage.layout()._amountForFreeSale >= (ERC721AStorage.layout()._freeSaleCurrentIndex + quantity), "Transfer exceeds total supply." ); _mint(msg.sender, quantity); unchecked { ERC721AStorage.layout()._freeSaleCurrentIndex += quantity; } } /** * @dev active or deactivate public sale. * @param status Use true to activate or false to deactivate. * @custom:restriction Only owner can execute this function */ function activePublicSale(bool status) external onlyOwner { ERC721AStorage.layout()._publicSaleActive = status; } /** * @dev active or deactivate pre-sale. * @param status Use true to activate or false to deactivate. * @custom:restriction Only owner can execute this function */ function activePreSale(bool status) external onlyOwner { ERC721AStorage.layout()._preSaleActive = status; } /** * @dev Set base URI. * @param baseURI_ A string used as base to generate nfts. * @custom:restriction Only owner can execute this function */ function setBaseURI(string memory baseURI_) external onlyOwner { ERC721AStorage.layout()._baseUri = baseURI_; } /** * @dev Set hidden base URI. * @param baseURI_ A string used as url when base url is hidden to generate nfts. * @custom:restriction Only owner can execute this function */ function setHiddenBaseURI(string memory baseURI_) external onlyOwner { ERC721AStorage.layout()._hiddenBaseUri = baseURI_; } /** * @dev Change quantity of tokens for public sale. * @param quantity Quantity of tokens for public sale. * @custom:restriction Only owner can execute this function */ function setPublicSaleQuantity(uint256 quantity) external onlyOwner { require(quantity >= 0, "Quantity must be greater than 0"); ERC721AStorage.layout()._amountForPublicSale = quantity; } /** * @dev Change quantity of tokens for pre sale. * @param quantity Quantity of tokens for pre sale. * @custom:restriction Only owner can execute this function */ function setPreSaleQuantity(uint256 quantity) external onlyOwner { require(quantity >= 0, "Quantity must be greater than 0"); ERC721AStorage.layout()._amountForPreSale = quantity; } /** * @dev Change quantity of tokens for free sale. * @param quantity Quantity of tokens for free sale. * @custom:restriction Only owner can execute this function */ function setFreeSaleQuantity(uint256 quantity) external onlyOwner { require(quantity >= 0, "Quantity must be greater than 0"); ERC721AStorage.layout()._amountForFreeSale = quantity; } /** * @dev Change price for tokens of public sale. * @param price Price for tokens of public sale. * @custom:restriction Only owner can execute this function */ function setPublicSalePrice(uint256 price) external onlyOwner { require(price >= 0, "Price must be greater than 0"); ERC721AStorage.layout()._pricePublicSale = price; } /** * @dev Change price for tokens of pre sale. * @param price Price for tokens of pre sale. * @custom:restriction Only owner can execute this function */ function setPreSalePrice(uint256 price) external onlyOwner { require(price >= 0, "Price must be greater than 0"); ERC721AStorage.layout()._pricePreSale = price; } /** * @dev Change limit per wallet for tokens of pre sale. * @param limit quantity of tokens allowed per wallet in pre sale. * @custom:restriction Only owner can execute this function */ function setPreSaleLimit(uint256 limit) external onlyOwner { require(limit > 0, "Limit must be greater than 0"); ERC721AStorage.layout()._maxBatchSizePreSale = limit; } /** * @dev Change limit per wallet for tokens of public sale. * @param limit quantity of tokens allowed per wallet in public sale. * @custom:restriction Only owner can execute this function */ function setPublicSaleLimit(uint256 limit) external onlyOwner { require(limit > 0, "Limit must be greater than 0"); ERC721AStorage.layout()._maxBatchSizePublicSale = limit; } /** * @dev Get all the balance of the contract (profits). * @custom:restriction Only owner can execute this function */ function getProfits() external onlyOwner { (bool sent, ) = payable(msg.sender).call{value: address(this).balance}( "" ); require(sent, "Failed to send Ether"); } /** * @dev Hidde or show baseURI. * @param status Use true to show or false to hidde. * @custom:restriction Only owner can execute this function */ function revelBaseURI(bool status) external onlyOwner { ERC721AStorage.layout()._reveled = status; } /** * @notice Called with the sale price to determine how much royalty * is owed and to whom. * @param _tokenId - the NFT asset queried for royalty information * @param _salePrice - the sale price of the NFT asset specified by _tokenId * @return receiver - address of who should be sent the royalty payment * @return royaltyAmount - the royalty payment amount for _salePrice */ function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view returns (address receiver, uint256 royaltyAmount) { uint256 amount = ((_salePrice * 10) / 100); return (owner(), amount); } function getTokensOfAddress(address address_) external view returns (string[] memory) { return _getTokensOfAddress(address_); } function preSalePrice() external view returns (uint256) { return ERC721AStorage.layout()._pricePreSale; } function publicSalePrice() external view returns (uint256) { return ERC721AStorage.layout()._pricePublicSale; } function amountForPublicSale() external view returns (uint256) { return ERC721AStorage.layout()._amountForPublicSale; } function amountForPreSale() external view returns (uint256) { return ERC721AStorage.layout()._amountForPreSale; } function uriSuffix() external view returns (string memory) { return ERC721AStorage.layout()._uriSuffix; } function setUriSuffix(string memory uriSuffix_) external onlyOwner returns (string memory) { return ERC721AStorage.layout()._uriSuffix = uriSuffix_; } function baseURI() external view returns (string memory) { return ERC721AStorage.layout()._baseUri; } function maxSupply() external view returns (uint256) { return (ERC721AStorage.layout()._amountForPublicSale + ERC721AStorage.layout()._amountForPreSale); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"CollectionSizeZero","type":"error"},{"inputs":[],"name":"ExceedsMaximumBatchSize","type":"error"},{"inputs":[],"name":"MaximumBatchSizeZero","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"activePreSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"activePublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"amountForPreSale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"amountForPublicSale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getProfits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"}],"name":"getTokensOfAddress","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"preSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"preSalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"publicSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicSalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"revelBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","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":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"setFreeSaleQuantity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setHiddenBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"setPreSaleLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setPreSalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"setPreSaleQuantity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"setPublicSaleLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setPublicSalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"setPublicSaleQuantity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uriSuffix_","type":"string"}],"name":"setUriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50614746806100206000396000f3fe6080604052600436106102675760003560e01c80636c9803f6116101445780639dc74e63116100b6578063d5abeb011161007a578063d5abeb01146108e5578063e757c17d14610910578063e985e9c51461093b578063eaa6055114610978578063f19e75d4146109a1578063f2fde38b146109ca57610267565b80639dc74e631461080f578063a22cb4651461083a578063b3ab66b014610863578063b88d4fde1461087f578063c87b56dd146108a857610267565b80637d7eee42116101085780637d7eee42146107255780638129fc1c1461074e5780638da5cb5b1461076557806395d89b411461079057806396b1fea1146107bb5780639b6860c8146107e457610267565b80636c9803f61461066357806370a082311461068c578063715018a6146106c95780637835c635146106e0578063791a2519146106fc57610267565b80632d29b9a9116101dd5780634b6a20eb116101a15780634b6a20eb146105555780635503a0e81461057e57806355f804b3146105a957806358a64492146105d25780636352211e146105fb5780636c0360eb1461063857610267565b80632d29b9a91461049857806337f83037146104c157806339d82c59146104ec5780633ad152581461051557806342842e0e1461052c57610267565b806314de39191161022f57806314de39191461036357806316ba10e0146103a057806318160ddd146103dd57806320ac68501461040857806323b872dd146104315780632a55205a1461045a57610267565b806301ffc9a71461026c57806306fdde03146102a9578063081812fc146102d4578063095ea7b3146103115780630b1f703c1461033a575b600080fd5b34801561027857600080fd5b50610293600480360381019061028e919061368b565b6109f3565b6040516102a09190613c64565b60405180910390f35b3480156102b557600080fd5b506102be610a85565b6040516102cb9190613c9a565b60405180910390f35b3480156102e057600080fd5b506102fb60048036038101906102f6919061372e565b610b20565b6040516103089190613bb2565b60405180910390f35b34801561031d57600080fd5b506103386004803603810190610333919061361e565b610ba8565b005b34801561034657600080fd5b50610361600480360381019061035c919061372e565b610cf5565b005b34801561036f57600080fd5b5061038a6004803603810190610385919061349b565b610d53565b6040516103979190613c42565b60405180910390f35b3480156103ac57600080fd5b506103c760048036038101906103c291906136e5565b610d65565b6040516103d49190613c9a565b60405180910390f35b3480156103e957600080fd5b506103f2610e1e565b6040516103ff9190613e9c565b60405180910390f35b34801561041457600080fd5b5061042f600480360381019061042a91906136e5565b610e47565b005b34801561043d57600080fd5b5061045860048036038101906104539190613508565b610e72565b005b34801561046657600080fd5b50610481600480360381019061047c919061375b565b6111cd565b60405161048f929190613c19565b60405180910390f35b3480156104a457600080fd5b506104bf60048036038101906104ba919061372e565b611202565b005b3480156104cd57600080fd5b506104d6611261565b6040516104e39190613e9c565b60405180910390f35b3480156104f857600080fd5b50610513600480360381019061050e919061372e565b611274565b005b34801561052157600080fd5b5061052a6112d2565b005b34801561053857600080fd5b50610553600480360381019061054e9190613508565b611389565b005b34801561056157600080fd5b5061057c6004803603810190610577919061372e565b6113a9565b005b34801561058a57600080fd5b50610593611408565b6040516105a09190613c9a565b60405180910390f35b3480156105b557600080fd5b506105d060048036038101906105cb91906136e5565b6114a3565b005b3480156105de57600080fd5b506105f960048036038101906105f4919061372e565b6114ce565b005b34801561060757600080fd5b50610622600480360381019061061d919061372e565b61152d565b60405161062f9190613bb2565b60405180910390f35b34801561064457600080fd5b5061064d61153f565b60405161065a9190613c9a565b60405180910390f35b34801561066f57600080fd5b5061068a6004803603810190610685919061365e565b6115da565b005b34801561069857600080fd5b506106b360048036038101906106ae919061349b565b611608565b6040516106c09190613e9c565b60405180910390f35b3480156106d557600080fd5b506106de6116ca565b005b6106fa60048036038101906106f5919061372e565b6116de565b005b34801561070857600080fd5b50610723600480360381019061071e919061372e565b611915565b005b34801561073157600080fd5b5061074c6004803603810190610747919061372e565b611974565b005b34801561075a57600080fd5b506107636119d3565b005b34801561077157600080fd5b5061077a611cbe565b6040516107879190613bb2565b60405180910390f35b34801561079c57600080fd5b506107a5611ce8565b6040516107b29190613c9a565b60405180910390f35b3480156107c757600080fd5b506107e260048036038101906107dd919061365e565b611d83565b005b3480156107f057600080fd5b506107f9611db1565b6040516108069190613e9c565b60405180910390f35b34801561081b57600080fd5b50610824611dc4565b6040516108319190613e9c565b60405180910390f35b34801561084657600080fd5b50610861600480360381019061085c91906135de565b611dd7565b005b61087d6004803603810190610878919061372e565b611f58565b005b34801561088b57600080fd5b506108a660048036038101906108a1919061355b565b61218f565b005b3480156108b457600080fd5b506108cf60048036038101906108ca919061372e565b612202565b6040516108dc9190613c9a565b60405180910390f35b3480156108f157600080fd5b506108fa6123f7565b6040516109079190613e9c565b60405180910390f35b34801561091c57600080fd5b50610925612420565b6040516109329190613e9c565b60405180910390f35b34801561094757600080fd5b50610962600480360381019061095d91906134c8565b612433565b60405161096f9190613c64565b60405180910390f35b34801561098457600080fd5b5061099f600480360381019061099a919061365e565b6124d0565b005b3480156109ad57600080fd5b506109c860048036038101906109c3919061372e565b6124fe565b005b3480156109d657600080fd5b506109f160048036038101906109ec919061349b565b612590565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a4e57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a7e5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060610a8f612614565b6002018054610a9d9061418c565b80601f0160208091040260200160405190810160405280929190818152602001828054610ac99061418c565b8015610b165780601f10610aeb57610100808354040283529160200191610b16565b820191906000526020600020905b815481529060010190602001808311610af957829003601f168201915b5050505050905090565b6000610b2b82612641565b610b61576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b69612614565b600601600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bb38261152d565b90508073ffffffffffffffffffffffffffffffffffffffff16610bd46126b2565b73ffffffffffffffffffffffffffffffffffffffff1614610c3757610c0081610bfb6126b2565b612433565b610c36576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b82610c40612614565b600601600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b610cfd6126ba565b60008111610d40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3790613d3c565b60405180910390fd5b80610d49612614565b6008018190555050565b6060610d5e82612738565b9050919050565b6060610d6f6126ba565b81610d78612614565b6016019080519060200190610d8e9291906132af565b8054610d999061418c565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc59061418c565b8015610e125780601f10610de757610100808354040283529160200191610e12565b820191906000526020600020905b815481529060010190602001808311610df557829003601f168201915b50505050509050919050565b6000610e28612849565b610e30612614565b60010154610e3c612614565b600001540303905090565b610e4f6126ba565b80610e58612614565b6015019080519060200190610e6e9291906132af565b5050565b6000610e7d82612852565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ee4576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610ef08461293b565b91509150610f068187610f016126b2565b61296b565b610f5257610f1b86610f166126b2565b612433565b610f51576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610fb9576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610fc686868660016129af565b8015610fd157600082555b610fd9612614565b60050160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550611030612614565b60050160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506110b18561108d8888876129b5565b7c0200000000000000000000000000000000000000000000000000000000176129dd565b6110b9612614565b60040160008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416141561115d576000600185019050600061110b612614565b600401600083815260200190815260200160002054141561115b5761112e612614565b60000154811461115a5783611141612614565b6004016000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46111c58686866001612a08565b505050505050565b60008060006064600a856111e1919061405d565b6111eb919061402c565b90506111f5611cbe565b8192509250509250929050565b61120a6126ba565b600081101561124e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124590613cbc565b60405180910390fd5b80611257612614565b600d018190555050565b600061126b612614565b600b0154905090565b61127c6126ba565b600081116112bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b690613d3c565b60405180910390fd5b806112c8612614565b6009018190555050565b6112da6126ba565b60003373ffffffffffffffffffffffffffffffffffffffff164760405161130090613b9d565b60006040518083038185875af1925050503d806000811461133d576040519150601f19603f3d011682016040523d82523d6000602084013e611342565b606091505b5050905080611386576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137d90613d5c565b60405180910390fd5b50565b6113a48383836040518060200160405280600081525061218f565b505050565b6113b16126ba565b60008110156113f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ec90613cbc565b60405180910390fd5b806113fe612614565b600c018190555050565b6060611412612614565b60160180546114209061418c565b80601f016020809104026020016040519081016040528092919081815260200182805461144c9061418c565b80156114995780601f1061146e57610100808354040283529160200191611499565b820191906000526020600020905b81548152906001019060200180831161147c57829003601f168201915b5050505050905090565b6114ab6126ba565b806114b4612614565b60140190805190602001906114ca9291906132af565b5050565b6114d66126ba565b600081101561151a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151190613cbc565b60405180910390fd5b80611523612614565b600b018190555050565b600061153882612852565b9050919050565b6060611549612614565b60140180546115579061418c565b80601f01602080910402602001604051908101604052809291908181526020018280546115839061418c565b80156115d05780601f106115a5576101008083540402835291602001916115d0565b820191906000526020600020905b8154815290600101906020018083116115b357829003601f168201915b5050505050905090565b6115e26126ba565b806115eb612614565b60130160016101000a81548160ff02191690831515021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611670576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff611681612614565b60050160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6116d26126ba565b6116dc6000612a0e565b565b6116e6612614565b60130160019054906101000a900460ff16611736576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172d90613e1c565b60405180910390fd5b8061173f612614565b6010015461174d9190613fd6565b611755612614565b600b0154101561179a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179190613d1c565b60405180910390fd5b6117a2612614565b60080154816117af612614565b60170160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546117fa9190613fd6565b111561183b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183290613e7c565b60405180910390fd5b6000611845612614565b600f015482611854919061405d565b9050803414611898576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188f90613d7c565b60405180910390fd5b6118a23383612ad4565b816118ab612614565b60100160008282540192505081905550816118c4612614565b60170160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050565b61191d6126ba565b6000811015611961576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195890613e5c565b60405180910390fd5b8061196a612614565b600e018190555050565b61197c6126ba565b60008110156119c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b790613e5c565b60405180910390fd5b806119c9612614565b600f018190555050565b6119db612cb6565b60000160019054906101000a900460ff16611a0f576119f8612cb6565b60000160009054906101000a900460ff1615611a18565b611a17612ce3565b5b611a57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4e90613ddc565b60405180910390fd5b6000611a61612cb6565b60000160019054906101000a900460ff161590508015611ac4576001611a85612cb6565b60000160016101000a81548160ff0219169083151502179055506001611aa9612cb6565b60000160006101000a81548160ff0219169083151502179055505b600060018054906101000a900460ff16159050808015611af5575060018060009054906101000a900460ff1660ff16105b80611b235750611b0430612cfa565b158015611b22575060018060009054906101000a900460ff1660ff16145b5b611b62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5990613dbc565b60405180910390fd5b60018060006101000a81548160ff021916908360ff1602179055508015611b9e5760018060016101000a81548160ff0219169083151502179055505b611c2e6040518060400160405280600c81526020017f43727970746f4f747465727300000000000000000000000000000000000000008152506040518060400160405280600381526020017f43584f000000000000000000000000000000000000000000000000000000000081525066b8bdb978520000668a8e4b1a3d80006105dc612134612710600380612d1d565b611c36612d91565b8015611c8f5760006001806101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024986001604051611c869190613c7f565b60405180910390a15b508015611cbb576000611ca0612cb6565b60000160016101000a81548160ff0219169083151502179055505b50565b6000603460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060611cf2612614565b6003018054611d009061418c565b80601f0160208091040260200160405190810160405280929190818152602001828054611d2c9061418c565b8015611d795780601f10611d4e57610100808354040283529160200191611d79565b820191906000526020600020905b815481529060010190602001808311611d5c57829003601f168201915b5050505050905090565b611d8b6126ba565b80611d94612614565b60130160006101000a81548160ff02191690831515021790555050565b6000611dbb612614565b600e0154905090565b6000611dce612614565b600c0154905090565b611ddf6126b2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e44576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80611e4d612614565b6007016000611e5a6126b2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611f076126b2565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f4c9190613c64565b60405180910390a35050565b611f60612614565b60130160009054906101000a900460ff16611fb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa790613d9c565b60405180910390fd5b80611fb9612614565b60110154611fc79190613fd6565b611fcf612614565b600c01541015612014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200b90613d1c565b60405180910390fd5b61201c612614565b6009015481612029612614565b60180160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546120749190613fd6565b11156120b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ac90613e7c565b60405180910390fd5b60006120bf612614565b600e0154826120ce919061405d565b9050803414612112576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210990613d7c565b60405180910390fd5b61211c3383612ad4565b81612125612614565b601101600082825401925050819055508161213e612614565b60180160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050565b61219a848484610e72565b60008373ffffffffffffffffffffffffffffffffffffffff163b146121fc576121c584848484612de8565b6121fb576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606061220d82612641565b612243576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061224d612f48565b90506000612259612614565b60160180546122679061418c565b80601f01602080910402602001604051908101604052809291908181526020018280546122939061418c565b80156122e05780601f106122b5576101008083540402835291602001916122e0565b820191906000526020600020905b8154815290600101906020018083116122c357829003601f168201915b505050505090506122ef612614565b60130160029054906101000a900460ff166123a15761230c612614565b601501805461231a9061418c565b80601f01602080910402602001604051908101604052809291908181526020018280546123469061418c565b80156123935780601f1061236857610100808354040283529160200191612393565b820191906000526020600020905b81548152906001019060200180831161237657829003601f168201915b5050505050925050506123f2565b6000825114156123c057604051806020016040528060008152506123ed565b816123ca85612fe3565b826040516020016123dd93929190613b6c565b6040516020818303038152906040525b925050505b919050565b6000612401612614565b600b015461240d612614565b600c015461241b9190613fd6565b905090565b600061242a612614565b600f0154905090565b600061243d612614565b60070160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6124d86126ba565b806124e1612614565b60130160026101000a81548160ff02191690831515021790555050565b6125066126ba565b8061250f612614565b6012015461251d9190613fd6565b612525612614565b600d0154101561256a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256190613d1c565b60405180910390fd5b6125743382612ad4565b8061257d612614565b6012016000828254019250508190555050565b6125986126ba565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612608576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ff90613cfc565b60405180910390fd5b61261181612a0e565b50565b6000807f2569078dfb4b0305704d3008e7403993ae9601b85f7ae5e742de3de8f8011c4090508091505090565b60008161264c612849565b11158015612664575061265d612614565b6000015482105b80156126ab575060007c0100000000000000000000000000000000000000000000000000000000612693612614565b60040160008581526020019081526020016000205416145b9050919050565b600033905090565b6126c2613033565b73ffffffffffffffffffffffffffffffffffffffff166126e0611cbe565b73ffffffffffffffffffffffffffffffffffffffff1614612736576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272d90613dfc565b60405180910390fd5b565b60606000612744612614565b600001549050600061275584611608565b905060008167ffffffffffffffff811115612773576127726142f4565b5b6040519080825280602002602001820160405280156127a657816020015b60608152602001906001900390816127915790505b5090506000806127b4612849565b90505b8481101561283c578673ffffffffffffffffffffffffffffffffffffffff166127df8261152d565b73ffffffffffffffffffffffffffffffffffffffff1614156128295761280481612202565b838381518110612817576128166142c5565b5b60200260200101819052506001820191505b8080612834906141ef565b9150506127b7565b5081945050505050919050565b60006001905090565b60008082905080612861612849565b116129045761286e612614565b60000154811015612903576000612883612614565b600401600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415612901575b60008114156128f7576128d4612614565b6004016000836001900393508381526020019081526020016000205490506128c3565b8092505050612936565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000612948612614565b600601600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86129cc86868461303b565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000603460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081603460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612ade612614565b6000015490506000821415612b1f576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612b2c60008483856129af565b600160406001901b178202612b3f612614565b60050160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612bac83612b9d60008660006129b5565b612ba685613044565b176129dd565b612bb4612614565b600401600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114612c5657808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612c1b565b506000821415612c92576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80612c9b612614565b600001819055505050612cb16000848385612a08565b505050565b6000807fee151c8401928dc223602bb187aff91b9a56c7cae5476ef1b3287b085a16c85f90508091505090565b6000803090506000813b9050600081149250505090565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b612d25612cb6565b60000160019054906101000a900460ff16612d75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d6c90613cdc565b60405180910390fd5b612d86898989898989898989613054565b505050505050505050565b60018054906101000a900460ff16612dde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dd590613e3c565b60405180910390fd5b612de6613250565b565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612e0e6126b2565b8786866040518563ffffffff1660e01b8152600401612e309493929190613bcd565b602060405180830381600087803b158015612e4a57600080fd5b505af1925050508015612e7b57506040513d601f19601f82011682018060405250810190612e7891906136b8565b60015b612ef5573d8060008114612eab576040519150601f19603f3d011682016040523d82523d6000602084013e612eb0565b606091505b50600081511415612eed576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060612f52612614565b6014018054612f609061418c565b80601f0160208091040260200160405190810160405280929190818152602001828054612f8c9061418c565b8015612fd95780601f10612fae57610100808354040283529160200191612fd9565b820191906000526020600020905b815481529060010190602001808311612fbc57829003601f168201915b5050505050905090565b606060806040510190508060405280825b60011561301f57600183039250600a81066030018353600a810490508061301a5761301f565b612ff4565b508181036020830392508083525050919050565b600033905090565b60009392505050565b60006001821460e11b9050919050565b61305c612cb6565b60000160019054906101000a900460ff166130ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130a390613cdc565b60405180910390fd5b886130b5612614565b60020190805190602001906130cb9291906132af565b50876130d5612614565b60030190805190602001906130eb9291906132af565b50866130f5612614565b600e018190555085613105612614565b600f018190555083613115612614565b600c018190555082613125612614565b600d018190555084613135612614565b600b018190555080613145612614565b6008018190555081613155612614565b60090181905550613164612849565b61316c612614565b6000018190555061317b612849565b613183612614565b60100181905550613192612849565b61319a612614565b601101819055506131a9612849565b6131b1612614565b601201819055506040518060800160405280604481526020016146cd604491396131d9612614565b60140190805190602001906131ef9291906132af565b506040518060400160405280601f81526020017f68747470733a2f2f697066732e696f2f697066732f68696464656e5f75726c0081525061322e612614565b60150190805190602001906132449291906132af565b50505050505050505050565b60018054906101000a900460ff1661329d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161329490613e3c565b60405180910390fd5b6132ad6132a8613033565b612a0e565b565b8280546132bb9061418c565b90600052602060002090601f0160209004810192826132dd5760008555613324565b82601f106132f657805160ff1916838001178555613324565b82800160010185558215613324579182015b82811115613323578251825591602001919060010190613308565b5b5090506133319190613335565b5090565b5b8082111561334e576000816000905550600101613336565b5090565b600061336561336084613edc565b613eb7565b90508281526020810184848401111561338157613380614328565b5b61338c84828561414a565b509392505050565b60006133a76133a284613f0d565b613eb7565b9050828152602081018484840111156133c3576133c2614328565b5b6133ce84828561414a565b509392505050565b6000813590506133e581614670565b92915050565b6000813590506133fa81614687565b92915050565b60008135905061340f8161469e565b92915050565b6000815190506134248161469e565b92915050565b600082601f83011261343f5761343e614323565b5b813561344f848260208601613352565b91505092915050565b600082601f83011261346d5761346c614323565b5b813561347d848260208601613394565b91505092915050565b600081359050613495816146b5565b92915050565b6000602082840312156134b1576134b0614332565b5b60006134bf848285016133d6565b91505092915050565b600080604083850312156134df576134de614332565b5b60006134ed858286016133d6565b92505060206134fe858286016133d6565b9150509250929050565b60008060006060848603121561352157613520614332565b5b600061352f868287016133d6565b9350506020613540868287016133d6565b925050604061355186828701613486565b9150509250925092565b6000806000806080858703121561357557613574614332565b5b6000613583878288016133d6565b9450506020613594878288016133d6565b93505060406135a587828801613486565b925050606085013567ffffffffffffffff8111156135c6576135c561432d565b5b6135d28782880161342a565b91505092959194509250565b600080604083850312156135f5576135f4614332565b5b6000613603858286016133d6565b9250506020613614858286016133eb565b9150509250929050565b6000806040838503121561363557613634614332565b5b6000613643858286016133d6565b925050602061365485828601613486565b9150509250929050565b60006020828403121561367457613673614332565b5b6000613682848285016133eb565b91505092915050565b6000602082840312156136a1576136a0614332565b5b60006136af84828501613400565b91505092915050565b6000602082840312156136ce576136cd614332565b5b60006136dc84828501613415565b91505092915050565b6000602082840312156136fb576136fa614332565b5b600082013567ffffffffffffffff8111156137195761371861432d565b5b61372584828501613458565b91505092915050565b60006020828403121561374457613743614332565b5b600061375284828501613486565b91505092915050565b6000806040838503121561377257613771614332565b5b600061378085828601613486565b925050602061379185828601613486565b9150509250929050565b60006137a7838361388a565b905092915050565b6137b8816140b7565b82525050565b60006137c982613f4e565b6137d38185613f7c565b9350836020820285016137e585613f3e565b8060005b858110156138215784840389528151613802858261379b565b945061380d83613f6f565b925060208a019950506001810190506137e9565b50829750879550505050505092915050565b61383c816140c9565b82525050565b600061384d82613f59565b6138578185613f8d565b9350613867818560208601614159565b61387081614337565b840191505092915050565b61388481614138565b82525050565b600061389582613f64565b61389f8185613fa9565b93506138af818560208601614159565b6138b881614337565b840191505092915050565b60006138ce82613f64565b6138d88185613fba565b93506138e8818560208601614159565b6138f181614337565b840191505092915050565b600061390782613f64565b6139118185613fcb565b9350613921818560208601614159565b80840191505092915050565b600061393a601f83613fba565b915061394582614348565b602082019050919050565b600061395d603483613fba565b915061396882614371565b604082019050919050565b6000613980602683613fba565b915061398b826143c0565b604082019050919050565b60006139a3601e83613fba565b91506139ae8261440f565b602082019050919050565b60006139c6601c83613fba565b91506139d182614438565b602082019050919050565b60006139e9601483613fba565b91506139f482614461565b602082019050919050565b6000613a0c601283613fba565b9150613a178261448a565b602082019050919050565b6000613a2f601983613fba565b9150613a3a826144b3565b602082019050919050565b6000613a52602e83613fba565b9150613a5d826144dc565b604082019050919050565b6000613a75603783613fba565b9150613a808261452b565b604082019050919050565b6000613a98602083613fba565b9150613aa38261457a565b602082019050919050565b6000613abb600083613f9e565b9150613ac6826145a3565b600082019050919050565b6000613ade601583613fba565b9150613ae9826145a6565b602082019050919050565b6000613b01602b83613fba565b9150613b0c826145cf565b604082019050919050565b6000613b24601c83613fba565b9150613b2f8261461e565b602082019050919050565b6000613b47601c83613fba565b9150613b5282614647565b602082019050919050565b613b6681614121565b82525050565b6000613b7882866138fc565b9150613b8482856138fc565b9150613b9082846138fc565b9150819050949350505050565b6000613ba882613aae565b9150819050919050565b6000602082019050613bc760008301846137af565b92915050565b6000608082019050613be260008301876137af565b613bef60208301866137af565b613bfc6040830185613b5d565b8181036060830152613c0e8184613842565b905095945050505050565b6000604082019050613c2e60008301856137af565b613c3b6020830184613b5d565b9392505050565b60006020820190508181036000830152613c5c81846137be565b905092915050565b6000602082019050613c796000830184613833565b92915050565b6000602082019050613c94600083018461387b565b92915050565b60006020820190508181036000830152613cb481846138c3565b905092915050565b60006020820190508181036000830152613cd58161392d565b9050919050565b60006020820190508181036000830152613cf581613950565b9050919050565b60006020820190508181036000830152613d1581613973565b9050919050565b60006020820190508181036000830152613d3581613996565b9050919050565b60006020820190508181036000830152613d55816139b9565b9050919050565b60006020820190508181036000830152613d75816139dc565b9050919050565b60006020820190508181036000830152613d95816139ff565b9050919050565b60006020820190508181036000830152613db581613a22565b9050919050565b60006020820190508181036000830152613dd581613a45565b9050919050565b60006020820190508181036000830152613df581613a68565b9050919050565b60006020820190508181036000830152613e1581613a8b565b9050919050565b60006020820190508181036000830152613e3581613ad1565b9050919050565b60006020820190508181036000830152613e5581613af4565b9050919050565b60006020820190508181036000830152613e7581613b17565b9050919050565b60006020820190508181036000830152613e9581613b3a565b9050919050565b6000602082019050613eb16000830184613b5d565b92915050565b6000613ec1613ed2565b9050613ecd82826141be565b919050565b6000604051905090565b600067ffffffffffffffff821115613ef757613ef66142f4565b5b613f0082614337565b9050602081019050919050565b600067ffffffffffffffff821115613f2857613f276142f4565b5b613f3182614337565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613fe182614121565b9150613fec83614121565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561402157614020614238565b5b828201905092915050565b600061403782614121565b915061404283614121565b92508261405257614051614267565b5b828204905092915050565b600061406882614121565b915061407383614121565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156140ac576140ab614238565b5b828202905092915050565b60006140c282614101565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006141438261412b565b9050919050565b82818337600083830152505050565b60005b8381101561417757808201518184015260208101905061415c565b83811115614186576000848401525b50505050565b600060028204905060018216806141a457607f821691505b602082108114156141b8576141b7614296565b5b50919050565b6141c782614337565b810181811067ffffffffffffffff821117156141e6576141e56142f4565b5b80604052505050565b60006141fa82614121565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561422d5761422c614238565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5175616e74697479206d7573742062652067726561746572207468616e203000600082015250565b7f455243373231415f5f496e697469616c697a61626c653a20636f6e747261637460008201527f206973206e6f7420696e697469616c697a696e67000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f5472616e73666572206578636565647320746f74616c20737570706c792e0000600082015250565b7f4c696d6974206d7573742062652067726561746572207468616e203000000000600082015250565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b7f5072696365206e6f7420636f76657265642e0000000000000000000000000000600082015250565b7f5075626c69632073616c65206973206e6f742061637469766500000000000000600082015250565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b7f455243373231415f5f496e697469616c697a61626c653a20636f6e747261637460008201527f20697320616c726561647920696e697469616c697a6564000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b50565b7f50726573616c65206973206e6f74206163746976650000000000000000000000600082015250565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960008201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b7f5072696365206d7573742062652067726561746572207468616e203000000000600082015250565b7f5472616e736665722065786365656473206d617820616d6f756e742e00000000600082015250565b614679816140b7565b811461468457600080fd5b50565b614690816140c9565b811461469b57600080fd5b50565b6146a7816140d5565b81146146b257600080fd5b50565b6146be81614121565b81146146c957600080fd5b5056fe68747470733a2f2f697066732e696f2f697066732f516d504b5778423566686a3458533350336a6f56394546434c38437962724b704c46615145386e375237767771592fa26469706673582212206dc7fdad929d9e3f2b22a474c125c9070eaf5d7f052ab91b55388799134e9f8464736f6c63430008070033
Deployed Bytecode
0x6080604052600436106102675760003560e01c80636c9803f6116101445780639dc74e63116100b6578063d5abeb011161007a578063d5abeb01146108e5578063e757c17d14610910578063e985e9c51461093b578063eaa6055114610978578063f19e75d4146109a1578063f2fde38b146109ca57610267565b80639dc74e631461080f578063a22cb4651461083a578063b3ab66b014610863578063b88d4fde1461087f578063c87b56dd146108a857610267565b80637d7eee42116101085780637d7eee42146107255780638129fc1c1461074e5780638da5cb5b1461076557806395d89b411461079057806396b1fea1146107bb5780639b6860c8146107e457610267565b80636c9803f61461066357806370a082311461068c578063715018a6146106c95780637835c635146106e0578063791a2519146106fc57610267565b80632d29b9a9116101dd5780634b6a20eb116101a15780634b6a20eb146105555780635503a0e81461057e57806355f804b3146105a957806358a64492146105d25780636352211e146105fb5780636c0360eb1461063857610267565b80632d29b9a91461049857806337f83037146104c157806339d82c59146104ec5780633ad152581461051557806342842e0e1461052c57610267565b806314de39191161022f57806314de39191461036357806316ba10e0146103a057806318160ddd146103dd57806320ac68501461040857806323b872dd146104315780632a55205a1461045a57610267565b806301ffc9a71461026c57806306fdde03146102a9578063081812fc146102d4578063095ea7b3146103115780630b1f703c1461033a575b600080fd5b34801561027857600080fd5b50610293600480360381019061028e919061368b565b6109f3565b6040516102a09190613c64565b60405180910390f35b3480156102b557600080fd5b506102be610a85565b6040516102cb9190613c9a565b60405180910390f35b3480156102e057600080fd5b506102fb60048036038101906102f6919061372e565b610b20565b6040516103089190613bb2565b60405180910390f35b34801561031d57600080fd5b506103386004803603810190610333919061361e565b610ba8565b005b34801561034657600080fd5b50610361600480360381019061035c919061372e565b610cf5565b005b34801561036f57600080fd5b5061038a6004803603810190610385919061349b565b610d53565b6040516103979190613c42565b60405180910390f35b3480156103ac57600080fd5b506103c760048036038101906103c291906136e5565b610d65565b6040516103d49190613c9a565b60405180910390f35b3480156103e957600080fd5b506103f2610e1e565b6040516103ff9190613e9c565b60405180910390f35b34801561041457600080fd5b5061042f600480360381019061042a91906136e5565b610e47565b005b34801561043d57600080fd5b5061045860048036038101906104539190613508565b610e72565b005b34801561046657600080fd5b50610481600480360381019061047c919061375b565b6111cd565b60405161048f929190613c19565b60405180910390f35b3480156104a457600080fd5b506104bf60048036038101906104ba919061372e565b611202565b005b3480156104cd57600080fd5b506104d6611261565b6040516104e39190613e9c565b60405180910390f35b3480156104f857600080fd5b50610513600480360381019061050e919061372e565b611274565b005b34801561052157600080fd5b5061052a6112d2565b005b34801561053857600080fd5b50610553600480360381019061054e9190613508565b611389565b005b34801561056157600080fd5b5061057c6004803603810190610577919061372e565b6113a9565b005b34801561058a57600080fd5b50610593611408565b6040516105a09190613c9a565b60405180910390f35b3480156105b557600080fd5b506105d060048036038101906105cb91906136e5565b6114a3565b005b3480156105de57600080fd5b506105f960048036038101906105f4919061372e565b6114ce565b005b34801561060757600080fd5b50610622600480360381019061061d919061372e565b61152d565b60405161062f9190613bb2565b60405180910390f35b34801561064457600080fd5b5061064d61153f565b60405161065a9190613c9a565b60405180910390f35b34801561066f57600080fd5b5061068a6004803603810190610685919061365e565b6115da565b005b34801561069857600080fd5b506106b360048036038101906106ae919061349b565b611608565b6040516106c09190613e9c565b60405180910390f35b3480156106d557600080fd5b506106de6116ca565b005b6106fa60048036038101906106f5919061372e565b6116de565b005b34801561070857600080fd5b50610723600480360381019061071e919061372e565b611915565b005b34801561073157600080fd5b5061074c6004803603810190610747919061372e565b611974565b005b34801561075a57600080fd5b506107636119d3565b005b34801561077157600080fd5b5061077a611cbe565b6040516107879190613bb2565b60405180910390f35b34801561079c57600080fd5b506107a5611ce8565b6040516107b29190613c9a565b60405180910390f35b3480156107c757600080fd5b506107e260048036038101906107dd919061365e565b611d83565b005b3480156107f057600080fd5b506107f9611db1565b6040516108069190613e9c565b60405180910390f35b34801561081b57600080fd5b50610824611dc4565b6040516108319190613e9c565b60405180910390f35b34801561084657600080fd5b50610861600480360381019061085c91906135de565b611dd7565b005b61087d6004803603810190610878919061372e565b611f58565b005b34801561088b57600080fd5b506108a660048036038101906108a1919061355b565b61218f565b005b3480156108b457600080fd5b506108cf60048036038101906108ca919061372e565b612202565b6040516108dc9190613c9a565b60405180910390f35b3480156108f157600080fd5b506108fa6123f7565b6040516109079190613e9c565b60405180910390f35b34801561091c57600080fd5b50610925612420565b6040516109329190613e9c565b60405180910390f35b34801561094757600080fd5b50610962600480360381019061095d91906134c8565b612433565b60405161096f9190613c64565b60405180910390f35b34801561098457600080fd5b5061099f600480360381019061099a919061365e565b6124d0565b005b3480156109ad57600080fd5b506109c860048036038101906109c3919061372e565b6124fe565b005b3480156109d657600080fd5b506109f160048036038101906109ec919061349b565b612590565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a4e57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a7e5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060610a8f612614565b6002018054610a9d9061418c565b80601f0160208091040260200160405190810160405280929190818152602001828054610ac99061418c565b8015610b165780601f10610aeb57610100808354040283529160200191610b16565b820191906000526020600020905b815481529060010190602001808311610af957829003601f168201915b5050505050905090565b6000610b2b82612641565b610b61576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b69612614565b600601600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bb38261152d565b90508073ffffffffffffffffffffffffffffffffffffffff16610bd46126b2565b73ffffffffffffffffffffffffffffffffffffffff1614610c3757610c0081610bfb6126b2565b612433565b610c36576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b82610c40612614565b600601600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b610cfd6126ba565b60008111610d40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3790613d3c565b60405180910390fd5b80610d49612614565b6008018190555050565b6060610d5e82612738565b9050919050565b6060610d6f6126ba565b81610d78612614565b6016019080519060200190610d8e9291906132af565b8054610d999061418c565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc59061418c565b8015610e125780601f10610de757610100808354040283529160200191610e12565b820191906000526020600020905b815481529060010190602001808311610df557829003601f168201915b50505050509050919050565b6000610e28612849565b610e30612614565b60010154610e3c612614565b600001540303905090565b610e4f6126ba565b80610e58612614565b6015019080519060200190610e6e9291906132af565b5050565b6000610e7d82612852565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ee4576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610ef08461293b565b91509150610f068187610f016126b2565b61296b565b610f5257610f1b86610f166126b2565b612433565b610f51576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610fb9576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610fc686868660016129af565b8015610fd157600082555b610fd9612614565b60050160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550611030612614565b60050160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506110b18561108d8888876129b5565b7c0200000000000000000000000000000000000000000000000000000000176129dd565b6110b9612614565b60040160008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416141561115d576000600185019050600061110b612614565b600401600083815260200190815260200160002054141561115b5761112e612614565b60000154811461115a5783611141612614565b6004016000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46111c58686866001612a08565b505050505050565b60008060006064600a856111e1919061405d565b6111eb919061402c565b90506111f5611cbe565b8192509250509250929050565b61120a6126ba565b600081101561124e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124590613cbc565b60405180910390fd5b80611257612614565b600d018190555050565b600061126b612614565b600b0154905090565b61127c6126ba565b600081116112bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b690613d3c565b60405180910390fd5b806112c8612614565b6009018190555050565b6112da6126ba565b60003373ffffffffffffffffffffffffffffffffffffffff164760405161130090613b9d565b60006040518083038185875af1925050503d806000811461133d576040519150601f19603f3d011682016040523d82523d6000602084013e611342565b606091505b5050905080611386576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137d90613d5c565b60405180910390fd5b50565b6113a48383836040518060200160405280600081525061218f565b505050565b6113b16126ba565b60008110156113f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ec90613cbc565b60405180910390fd5b806113fe612614565b600c018190555050565b6060611412612614565b60160180546114209061418c565b80601f016020809104026020016040519081016040528092919081815260200182805461144c9061418c565b80156114995780601f1061146e57610100808354040283529160200191611499565b820191906000526020600020905b81548152906001019060200180831161147c57829003601f168201915b5050505050905090565b6114ab6126ba565b806114b4612614565b60140190805190602001906114ca9291906132af565b5050565b6114d66126ba565b600081101561151a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151190613cbc565b60405180910390fd5b80611523612614565b600b018190555050565b600061153882612852565b9050919050565b6060611549612614565b60140180546115579061418c565b80601f01602080910402602001604051908101604052809291908181526020018280546115839061418c565b80156115d05780601f106115a5576101008083540402835291602001916115d0565b820191906000526020600020905b8154815290600101906020018083116115b357829003601f168201915b5050505050905090565b6115e26126ba565b806115eb612614565b60130160016101000a81548160ff02191690831515021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611670576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff611681612614565b60050160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6116d26126ba565b6116dc6000612a0e565b565b6116e6612614565b60130160019054906101000a900460ff16611736576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172d90613e1c565b60405180910390fd5b8061173f612614565b6010015461174d9190613fd6565b611755612614565b600b0154101561179a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179190613d1c565b60405180910390fd5b6117a2612614565b60080154816117af612614565b60170160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546117fa9190613fd6565b111561183b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183290613e7c565b60405180910390fd5b6000611845612614565b600f015482611854919061405d565b9050803414611898576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188f90613d7c565b60405180910390fd5b6118a23383612ad4565b816118ab612614565b60100160008282540192505081905550816118c4612614565b60170160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050565b61191d6126ba565b6000811015611961576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195890613e5c565b60405180910390fd5b8061196a612614565b600e018190555050565b61197c6126ba565b60008110156119c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b790613e5c565b60405180910390fd5b806119c9612614565b600f018190555050565b6119db612cb6565b60000160019054906101000a900460ff16611a0f576119f8612cb6565b60000160009054906101000a900460ff1615611a18565b611a17612ce3565b5b611a57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4e90613ddc565b60405180910390fd5b6000611a61612cb6565b60000160019054906101000a900460ff161590508015611ac4576001611a85612cb6565b60000160016101000a81548160ff0219169083151502179055506001611aa9612cb6565b60000160006101000a81548160ff0219169083151502179055505b600060018054906101000a900460ff16159050808015611af5575060018060009054906101000a900460ff1660ff16105b80611b235750611b0430612cfa565b158015611b22575060018060009054906101000a900460ff1660ff16145b5b611b62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5990613dbc565b60405180910390fd5b60018060006101000a81548160ff021916908360ff1602179055508015611b9e5760018060016101000a81548160ff0219169083151502179055505b611c2e6040518060400160405280600c81526020017f43727970746f4f747465727300000000000000000000000000000000000000008152506040518060400160405280600381526020017f43584f000000000000000000000000000000000000000000000000000000000081525066b8bdb978520000668a8e4b1a3d80006105dc612134612710600380612d1d565b611c36612d91565b8015611c8f5760006001806101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024986001604051611c869190613c7f565b60405180910390a15b508015611cbb576000611ca0612cb6565b60000160016101000a81548160ff0219169083151502179055505b50565b6000603460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060611cf2612614565b6003018054611d009061418c565b80601f0160208091040260200160405190810160405280929190818152602001828054611d2c9061418c565b8015611d795780601f10611d4e57610100808354040283529160200191611d79565b820191906000526020600020905b815481529060010190602001808311611d5c57829003601f168201915b5050505050905090565b611d8b6126ba565b80611d94612614565b60130160006101000a81548160ff02191690831515021790555050565b6000611dbb612614565b600e0154905090565b6000611dce612614565b600c0154905090565b611ddf6126b2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e44576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80611e4d612614565b6007016000611e5a6126b2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611f076126b2565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f4c9190613c64565b60405180910390a35050565b611f60612614565b60130160009054906101000a900460ff16611fb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa790613d9c565b60405180910390fd5b80611fb9612614565b60110154611fc79190613fd6565b611fcf612614565b600c01541015612014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200b90613d1c565b60405180910390fd5b61201c612614565b6009015481612029612614565b60180160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546120749190613fd6565b11156120b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ac90613e7c565b60405180910390fd5b60006120bf612614565b600e0154826120ce919061405d565b9050803414612112576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210990613d7c565b60405180910390fd5b61211c3383612ad4565b81612125612614565b601101600082825401925050819055508161213e612614565b60180160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050565b61219a848484610e72565b60008373ffffffffffffffffffffffffffffffffffffffff163b146121fc576121c584848484612de8565b6121fb576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606061220d82612641565b612243576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061224d612f48565b90506000612259612614565b60160180546122679061418c565b80601f01602080910402602001604051908101604052809291908181526020018280546122939061418c565b80156122e05780601f106122b5576101008083540402835291602001916122e0565b820191906000526020600020905b8154815290600101906020018083116122c357829003601f168201915b505050505090506122ef612614565b60130160029054906101000a900460ff166123a15761230c612614565b601501805461231a9061418c565b80601f01602080910402602001604051908101604052809291908181526020018280546123469061418c565b80156123935780601f1061236857610100808354040283529160200191612393565b820191906000526020600020905b81548152906001019060200180831161237657829003601f168201915b5050505050925050506123f2565b6000825114156123c057604051806020016040528060008152506123ed565b816123ca85612fe3565b826040516020016123dd93929190613b6c565b6040516020818303038152906040525b925050505b919050565b6000612401612614565b600b015461240d612614565b600c015461241b9190613fd6565b905090565b600061242a612614565b600f0154905090565b600061243d612614565b60070160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6124d86126ba565b806124e1612614565b60130160026101000a81548160ff02191690831515021790555050565b6125066126ba565b8061250f612614565b6012015461251d9190613fd6565b612525612614565b600d0154101561256a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256190613d1c565b60405180910390fd5b6125743382612ad4565b8061257d612614565b6012016000828254019250508190555050565b6125986126ba565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612608576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ff90613cfc565b60405180910390fd5b61261181612a0e565b50565b6000807f2569078dfb4b0305704d3008e7403993ae9601b85f7ae5e742de3de8f8011c4090508091505090565b60008161264c612849565b11158015612664575061265d612614565b6000015482105b80156126ab575060007c0100000000000000000000000000000000000000000000000000000000612693612614565b60040160008581526020019081526020016000205416145b9050919050565b600033905090565b6126c2613033565b73ffffffffffffffffffffffffffffffffffffffff166126e0611cbe565b73ffffffffffffffffffffffffffffffffffffffff1614612736576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272d90613dfc565b60405180910390fd5b565b60606000612744612614565b600001549050600061275584611608565b905060008167ffffffffffffffff811115612773576127726142f4565b5b6040519080825280602002602001820160405280156127a657816020015b60608152602001906001900390816127915790505b5090506000806127b4612849565b90505b8481101561283c578673ffffffffffffffffffffffffffffffffffffffff166127df8261152d565b73ffffffffffffffffffffffffffffffffffffffff1614156128295761280481612202565b838381518110612817576128166142c5565b5b60200260200101819052506001820191505b8080612834906141ef565b9150506127b7565b5081945050505050919050565b60006001905090565b60008082905080612861612849565b116129045761286e612614565b60000154811015612903576000612883612614565b600401600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415612901575b60008114156128f7576128d4612614565b6004016000836001900393508381526020019081526020016000205490506128c3565b8092505050612936565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000612948612614565b600601600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86129cc86868461303b565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000603460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081603460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612ade612614565b6000015490506000821415612b1f576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612b2c60008483856129af565b600160406001901b178202612b3f612614565b60050160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612bac83612b9d60008660006129b5565b612ba685613044565b176129dd565b612bb4612614565b600401600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114612c5657808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612c1b565b506000821415612c92576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80612c9b612614565b600001819055505050612cb16000848385612a08565b505050565b6000807fee151c8401928dc223602bb187aff91b9a56c7cae5476ef1b3287b085a16c85f90508091505090565b6000803090506000813b9050600081149250505090565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b612d25612cb6565b60000160019054906101000a900460ff16612d75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d6c90613cdc565b60405180910390fd5b612d86898989898989898989613054565b505050505050505050565b60018054906101000a900460ff16612dde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dd590613e3c565b60405180910390fd5b612de6613250565b565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612e0e6126b2565b8786866040518563ffffffff1660e01b8152600401612e309493929190613bcd565b602060405180830381600087803b158015612e4a57600080fd5b505af1925050508015612e7b57506040513d601f19601f82011682018060405250810190612e7891906136b8565b60015b612ef5573d8060008114612eab576040519150601f19603f3d011682016040523d82523d6000602084013e612eb0565b606091505b50600081511415612eed576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060612f52612614565b6014018054612f609061418c565b80601f0160208091040260200160405190810160405280929190818152602001828054612f8c9061418c565b8015612fd95780601f10612fae57610100808354040283529160200191612fd9565b820191906000526020600020905b815481529060010190602001808311612fbc57829003601f168201915b5050505050905090565b606060806040510190508060405280825b60011561301f57600183039250600a81066030018353600a810490508061301a5761301f565b612ff4565b508181036020830392508083525050919050565b600033905090565b60009392505050565b60006001821460e11b9050919050565b61305c612cb6565b60000160019054906101000a900460ff166130ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130a390613cdc565b60405180910390fd5b886130b5612614565b60020190805190602001906130cb9291906132af565b50876130d5612614565b60030190805190602001906130eb9291906132af565b50866130f5612614565b600e018190555085613105612614565b600f018190555083613115612614565b600c018190555082613125612614565b600d018190555084613135612614565b600b018190555080613145612614565b6008018190555081613155612614565b60090181905550613164612849565b61316c612614565b6000018190555061317b612849565b613183612614565b60100181905550613192612849565b61319a612614565b601101819055506131a9612849565b6131b1612614565b601201819055506040518060800160405280604481526020016146cd604491396131d9612614565b60140190805190602001906131ef9291906132af565b506040518060400160405280601f81526020017f68747470733a2f2f697066732e696f2f697066732f68696464656e5f75726c0081525061322e612614565b60150190805190602001906132449291906132af565b50505050505050505050565b60018054906101000a900460ff1661329d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161329490613e3c565b60405180910390fd5b6132ad6132a8613033565b612a0e565b565b8280546132bb9061418c565b90600052602060002090601f0160209004810192826132dd5760008555613324565b82601f106132f657805160ff1916838001178555613324565b82800160010185558215613324579182015b82811115613323578251825591602001919060010190613308565b5b5090506133319190613335565b5090565b5b8082111561334e576000816000905550600101613336565b5090565b600061336561336084613edc565b613eb7565b90508281526020810184848401111561338157613380614328565b5b61338c84828561414a565b509392505050565b60006133a76133a284613f0d565b613eb7565b9050828152602081018484840111156133c3576133c2614328565b5b6133ce84828561414a565b509392505050565b6000813590506133e581614670565b92915050565b6000813590506133fa81614687565b92915050565b60008135905061340f8161469e565b92915050565b6000815190506134248161469e565b92915050565b600082601f83011261343f5761343e614323565b5b813561344f848260208601613352565b91505092915050565b600082601f83011261346d5761346c614323565b5b813561347d848260208601613394565b91505092915050565b600081359050613495816146b5565b92915050565b6000602082840312156134b1576134b0614332565b5b60006134bf848285016133d6565b91505092915050565b600080604083850312156134df576134de614332565b5b60006134ed858286016133d6565b92505060206134fe858286016133d6565b9150509250929050565b60008060006060848603121561352157613520614332565b5b600061352f868287016133d6565b9350506020613540868287016133d6565b925050604061355186828701613486565b9150509250925092565b6000806000806080858703121561357557613574614332565b5b6000613583878288016133d6565b9450506020613594878288016133d6565b93505060406135a587828801613486565b925050606085013567ffffffffffffffff8111156135c6576135c561432d565b5b6135d28782880161342a565b91505092959194509250565b600080604083850312156135f5576135f4614332565b5b6000613603858286016133d6565b9250506020613614858286016133eb565b9150509250929050565b6000806040838503121561363557613634614332565b5b6000613643858286016133d6565b925050602061365485828601613486565b9150509250929050565b60006020828403121561367457613673614332565b5b6000613682848285016133eb565b91505092915050565b6000602082840312156136a1576136a0614332565b5b60006136af84828501613400565b91505092915050565b6000602082840312156136ce576136cd614332565b5b60006136dc84828501613415565b91505092915050565b6000602082840312156136fb576136fa614332565b5b600082013567ffffffffffffffff8111156137195761371861432d565b5b61372584828501613458565b91505092915050565b60006020828403121561374457613743614332565b5b600061375284828501613486565b91505092915050565b6000806040838503121561377257613771614332565b5b600061378085828601613486565b925050602061379185828601613486565b9150509250929050565b60006137a7838361388a565b905092915050565b6137b8816140b7565b82525050565b60006137c982613f4e565b6137d38185613f7c565b9350836020820285016137e585613f3e565b8060005b858110156138215784840389528151613802858261379b565b945061380d83613f6f565b925060208a019950506001810190506137e9565b50829750879550505050505092915050565b61383c816140c9565b82525050565b600061384d82613f59565b6138578185613f8d565b9350613867818560208601614159565b61387081614337565b840191505092915050565b61388481614138565b82525050565b600061389582613f64565b61389f8185613fa9565b93506138af818560208601614159565b6138b881614337565b840191505092915050565b60006138ce82613f64565b6138d88185613fba565b93506138e8818560208601614159565b6138f181614337565b840191505092915050565b600061390782613f64565b6139118185613fcb565b9350613921818560208601614159565b80840191505092915050565b600061393a601f83613fba565b915061394582614348565b602082019050919050565b600061395d603483613fba565b915061396882614371565b604082019050919050565b6000613980602683613fba565b915061398b826143c0565b604082019050919050565b60006139a3601e83613fba565b91506139ae8261440f565b602082019050919050565b60006139c6601c83613fba565b91506139d182614438565b602082019050919050565b60006139e9601483613fba565b91506139f482614461565b602082019050919050565b6000613a0c601283613fba565b9150613a178261448a565b602082019050919050565b6000613a2f601983613fba565b9150613a3a826144b3565b602082019050919050565b6000613a52602e83613fba565b9150613a5d826144dc565b604082019050919050565b6000613a75603783613fba565b9150613a808261452b565b604082019050919050565b6000613a98602083613fba565b9150613aa38261457a565b602082019050919050565b6000613abb600083613f9e565b9150613ac6826145a3565b600082019050919050565b6000613ade601583613fba565b9150613ae9826145a6565b602082019050919050565b6000613b01602b83613fba565b9150613b0c826145cf565b604082019050919050565b6000613b24601c83613fba565b9150613b2f8261461e565b602082019050919050565b6000613b47601c83613fba565b9150613b5282614647565b602082019050919050565b613b6681614121565b82525050565b6000613b7882866138fc565b9150613b8482856138fc565b9150613b9082846138fc565b9150819050949350505050565b6000613ba882613aae565b9150819050919050565b6000602082019050613bc760008301846137af565b92915050565b6000608082019050613be260008301876137af565b613bef60208301866137af565b613bfc6040830185613b5d565b8181036060830152613c0e8184613842565b905095945050505050565b6000604082019050613c2e60008301856137af565b613c3b6020830184613b5d565b9392505050565b60006020820190508181036000830152613c5c81846137be565b905092915050565b6000602082019050613c796000830184613833565b92915050565b6000602082019050613c94600083018461387b565b92915050565b60006020820190508181036000830152613cb481846138c3565b905092915050565b60006020820190508181036000830152613cd58161392d565b9050919050565b60006020820190508181036000830152613cf581613950565b9050919050565b60006020820190508181036000830152613d1581613973565b9050919050565b60006020820190508181036000830152613d3581613996565b9050919050565b60006020820190508181036000830152613d55816139b9565b9050919050565b60006020820190508181036000830152613d75816139dc565b9050919050565b60006020820190508181036000830152613d95816139ff565b9050919050565b60006020820190508181036000830152613db581613a22565b9050919050565b60006020820190508181036000830152613dd581613a45565b9050919050565b60006020820190508181036000830152613df581613a68565b9050919050565b60006020820190508181036000830152613e1581613a8b565b9050919050565b60006020820190508181036000830152613e3581613ad1565b9050919050565b60006020820190508181036000830152613e5581613af4565b9050919050565b60006020820190508181036000830152613e7581613b17565b9050919050565b60006020820190508181036000830152613e9581613b3a565b9050919050565b6000602082019050613eb16000830184613b5d565b92915050565b6000613ec1613ed2565b9050613ecd82826141be565b919050565b6000604051905090565b600067ffffffffffffffff821115613ef757613ef66142f4565b5b613f0082614337565b9050602081019050919050565b600067ffffffffffffffff821115613f2857613f276142f4565b5b613f3182614337565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613fe182614121565b9150613fec83614121565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561402157614020614238565b5b828201905092915050565b600061403782614121565b915061404283614121565b92508261405257614051614267565b5b828204905092915050565b600061406882614121565b915061407383614121565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156140ac576140ab614238565b5b828202905092915050565b60006140c282614101565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006141438261412b565b9050919050565b82818337600083830152505050565b60005b8381101561417757808201518184015260208101905061415c565b83811115614186576000848401525b50505050565b600060028204905060018216806141a457607f821691505b602082108114156141b8576141b7614296565b5b50919050565b6141c782614337565b810181811067ffffffffffffffff821117156141e6576141e56142f4565b5b80604052505050565b60006141fa82614121565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561422d5761422c614238565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5175616e74697479206d7573742062652067726561746572207468616e203000600082015250565b7f455243373231415f5f496e697469616c697a61626c653a20636f6e747261637460008201527f206973206e6f7420696e697469616c697a696e67000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f5472616e73666572206578636565647320746f74616c20737570706c792e0000600082015250565b7f4c696d6974206d7573742062652067726561746572207468616e203000000000600082015250565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b7f5072696365206e6f7420636f76657265642e0000000000000000000000000000600082015250565b7f5075626c69632073616c65206973206e6f742061637469766500000000000000600082015250565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b7f455243373231415f5f496e697469616c697a61626c653a20636f6e747261637460008201527f20697320616c726561647920696e697469616c697a6564000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b50565b7f50726573616c65206973206e6f74206163746976650000000000000000000000600082015250565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960008201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b7f5072696365206d7573742062652067726561746572207468616e203000000000600082015250565b7f5472616e736665722065786365656473206d617820616d6f756e742e00000000600082015250565b614679816140b7565b811461468457600080fd5b50565b614690816140c9565b811461469b57600080fd5b50565b6146a7816140d5565b81146146b257600080fd5b50565b6146be81614121565b81146146c957600080fd5b5056fe68747470733a2f2f697066732e696f2f697066732f516d504b5778423566686a3458533350336a6f56394546434c38437962724b704c46615145386e375237767771592fa26469706673582212206dc7fdad929d9e3f2b22a474c125c9070eaf5d7f052ab91b55388799134e9f8464736f6c63430008070033
Deployed Bytecode Sourcemap
83511:10747:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46856:689;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47808:124;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55373:292;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54790:424;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;90927:191;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;92902:173;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;93746:196;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43011:422;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;88569:137;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59461:3275;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;92643:251;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;89731:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;93484:127;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;91348:197;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;91696:206;;;;;;;;;;;;;:::i;:::-;;62832:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;88913:210;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;93619:119;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;88232:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;89324:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49617:202;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;93950:115;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;87929:121;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44342:333;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17468:103;;;;;;;;;;;;;:::i;:::-;;84436:1027;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;90135:191;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;90518:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;83732:481;;;;;;;;;;;;;:::i;:::-;;16820:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48008:128;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;87600:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;93210:125;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;93343:133;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56005:396;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;85690:1058;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63615:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48242:656;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;94073:182;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;93083:119;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56558:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;92087:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;86975:420;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17726:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46856:689;46986:4;47330:10;47315:25;;:11;:25;;;;:102;;;;47407:10;47392:25;;:11;:25;;;;47315:102;:179;;;;47484:10;47469:25;;:11;:25;;;;47315:179;47295:199;;46856:689;;;:::o;47808:124::-;47862:13;47895:23;:21;:23::i;:::-;:29;;47888:36;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47808:124;:::o;55373:292::-;55494:7;55524:16;55532:7;55524;:16::i;:::-;55519:64;;55549:34;;;;;;;;;;;;;;55519:64;55603:23;:21;:23::i;:::-;:39;;:48;55643:7;55603:48;;;;;;;;;;;:54;;;;;;;;;;;;55596:61;;55373:292;;;:::o;54790:424::-;54871:13;54887:16;54895:7;54887;:16::i;:::-;54871:32;;54943:5;54920:28;;:19;:17;:19::i;:::-;:28;;;54916:175;;54968:44;54985:5;54992:19;:17;:19::i;:::-;54968:16;:44::i;:::-;54963:128;;55040:35;;;;;;;;;;;;;;54963:128;54916:175;55160:2;55103:23;:21;:23::i;:::-;:39;;:48;55143:7;55103:48;;;;;;;;;;;:54;;;:59;;;;;;;;;;;;;;;;;;55198:7;55194:2;55178:28;;55187:5;55178:28;;;;;;;;;;;;54860:354;54790:424;;:::o;90927:191::-;16706:13;:11;:13::i;:::-;91013:1:::1;91005:5;:9;90997:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;91105:5;91058:23;:21;:23::i;:::-;:44;;:52;;;;90927:191:::0;:::o;92902:173::-;92998:15;93038:29;93058:8;93038:19;:29::i;:::-;93031:36;;92902:173;;;:::o;93746:196::-;93849:13;16706;:11;:13::i;:::-;93924:10:::1;93887:23;:21;:23::i;:::-;:34;;:47;;;;;;;;;;;;:::i;:::-;93880:54;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;93746:196:::0;;;:::o;43011:422::-;43072:7;43399:15;:13;:15::i;:::-;43343:23;:21;:23::i;:::-;:36;;;43286:23;:21;:23::i;:::-;:37;;;:93;:128;43262:152;;43011:422;:::o;88569:137::-;16706:13;:11;:13::i;:::-;88690:8:::1;88649:23;:21;:23::i;:::-;:38;;:49;;;;;;;;;;;;:::i;:::-;;88569:137:::0;:::o;59461:3275::-;59595:27;59625;59644:7;59625:18;:27::i;:::-;59595:57;;59710:4;59669:45;;59685:19;59669:45;;;59665:99;;59736:28;;;;;;;;;;;;;;59665:99;59792:27;59834:23;59871:35;59898:7;59871:26;:35::i;:::-;59777:129;;;;60020:134;60063:15;60097:4;60120:19;:17;:19::i;:::-;60020:24;:134::i;:::-;60001:287;;60184:43;60201:4;60207:19;:17;:19::i;:::-;60184:16;:43::i;:::-;60179:109;;60253:35;;;;;;;;;;;;;;60179:109;60001:287;60319:1;60305:16;;:2;:16;;;60301:52;;;60330:23;;;;;;;;;;;;;;60301:52;60366:43;60388:4;60394:2;60398:7;60407:1;60366:21;:43::i;:::-;60502:15;60499:160;;;60642:1;60621:19;60614:30;60499:160;61039:23;:21;:23::i;:::-;:42;;:48;61082:4;61039:48;;;;;;;;;;;;;;;;61037:50;;;;;;;;;;;;61132:23;:21;:23::i;:::-;:42;;:46;61175:2;61132:46;;;;;;;;;;;;;;;;61130:48;;;;;;;;;;;61534:167;61571:2;61641:45;61656:4;61662:2;61666:19;61641:14;:45::i;:::-;38487:8;61592:94;61534:18;:167::i;:::-;61449:23;:21;:23::i;:::-;:41;;:82;61509:7;61449:82;;;;;;;;;;;:252;;;;61872:1;38487:8;61821:19;:47;:52;61817:803;;;61894:19;61926:1;61916:7;:11;61894:33;;62129:1;62071:23;:21;:23::i;:::-;:41;;:54;62113:11;62071:54;;;;;;;;;;;;:59;62045:560;;;62251:23;:21;:23::i;:::-;:37;;;62236:11;:52;62232:354;;62543:19;62422:23;:21;:23::i;:::-;:41;;:118;62498:11;62422:118;;;;;;;;;;;:140;;;;62232:354;62045:560;61875:745;61817:803;62667:7;62663:2;62648:27;;62657:4;62648:27;;;;;;;;;;;;62686:42;62707:4;62713:2;62717:7;62726:1;62686:20;:42::i;:::-;59584:3152;;;59461:3275;;;:::o;92643:251::-;92752:16;92770:21;92809:14;92847:3;92841:2;92828:10;:15;;;;:::i;:::-;92827:23;;;;:::i;:::-;92809:42;;92870:7;:5;:7::i;:::-;92879:6;92862:24;;;;;92643:251;;;;;:::o;89731:206::-;16706:13;:11;:13::i;:::-;89828:1:::1;89816:8;:13;;89808:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;89921:8;89876:23;:21;:23::i;:::-;:42;;:53;;;;89731:206:::0;:::o;93484:127::-;93535:7;93562:23;:21;:23::i;:::-;:41;;;93555:48;;93484:127;:::o;91348:197::-;16706:13;:11;:13::i;:::-;91437:1:::1;91429:5;:9;91421:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;91532:5;91482:23;:21;:23::i;:::-;:47;;:55;;;;91348:197:::0;:::o;91696:206::-;16706:13;:11;:13::i;:::-;91749:9:::1;91772:10;91764:24;;91796:21;91764:82;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;91748:98;;;91865:4;91857:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;91737:165;91696:206::o:0;62832:185::-;62970:39;62987:4;62993:2;62997:7;62970:39;;;;;;;;;;;;:16;:39::i;:::-;62832:185;;;:::o;88913:210::-;16706:13;:11;:13::i;:::-;89012:1:::1;89000:8;:13;;88992:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;89107:8;89060:23;:21;:23::i;:::-;:44;;:55;;;;88913:210:::0;:::o;93619:119::-;93663:13;93696:23;:21;:23::i;:::-;:34;;93689:41;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;93619:119;:::o;88232:125::-;16706:13;:11;:13::i;:::-;88341:8:::1;88306:23;:21;:23::i;:::-;:32;;:43;;;;;;;;;;;;:::i;:::-;;88232:125:::0;:::o;89324:204::-;16706:13;:11;:13::i;:::-;89420:1:::1;89408:8;:13;;89400:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;89512:8;89468:23;:21;:23::i;:::-;:41;;:52;;;;89324:204:::0;:::o;49617:202::-;49734:7;49782:27;49801:7;49782:18;:27::i;:::-;49759:52;;49617:202;;;:::o;93950:115::-;93992:13;94025:23;:21;:23::i;:::-;:32;;94018:39;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;93950:115;:::o;87929:121::-;16706:13;:11;:13::i;:::-;88036:6:::1;87995:23;:21;:23::i;:::-;:38;;;:47;;;;;;;;;;;;;;;;;;87929:121:::0;:::o;44342:333::-;44459:7;44505:1;44488:19;;:5;:19;;;44484:60;;;44516:28;;;;;;;;;;;;;;44484:60;37431:13;44575:23;:21;:23::i;:::-;:42;;:49;44618:5;44575:49;;;;;;;;;;;;;;;;:92;44555:112;;44342:333;;;:::o;17468:103::-;16706:13;:11;:13::i;:::-;17533:30:::1;17560:1;17533:18;:30::i;:::-;17468:103::o:0;84436:1027::-;84525:23;:21;:23::i;:::-;:38;;;;;;;;;;;;84503:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;84755:8;84708:23;:21;:23::i;:::-;:44;;;:55;;;;:::i;:::-;84645:23;:21;:23::i;:::-;:41;;;:119;;84623:199;;;;;;;;;;;;:::i;:::-;;;;;;;;;84960:23;:21;:23::i;:::-;:44;;;84931:8;84855:23;:21;:23::i;:::-;:44;;:56;84900:10;84855:56;;;;;;;;;;;;;;;;:84;;;;:::i;:::-;:149;;84833:227;;;;;;;;;;;;:::i;:::-;;;;;;;;;85071:14;85099:23;:21;:23::i;:::-;:37;;;85088:8;:48;;;;:::i;:::-;85071:65;;85168:6;85155:9;:19;85147:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;85208:27;85214:10;85226:8;85208:5;:27::i;:::-;85321:8;85273:23;:21;:23::i;:::-;:44;;;:56;;;;;;;;;;;85436:8;85344:23;:21;:23::i;:::-;:44;;:88;85407:10;85344:88;;;;;;;;;;;;;;;;:100;;;;;;;;;;;84492:971;84436:1027;:::o;90135:191::-;16706:13;:11;:13::i;:::-;90225:1:::1;90216:5;:10;;90208:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;90313:5;90270:23;:21;:23::i;:::-;:40;;:48;;;;90135:191:::0;:::o;90518:185::-;16706:13;:11;:13::i;:::-;90605:1:::1;90596:5;:10;;90588:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;90690:5;90650:23;:21;:23::i;:::-;:37;;:45;;;;90518:185:::0;:::o;83732:481::-;34288:38;:36;:38::i;:::-;:52;;;;;;;;;;;;:160;;34397:38;:36;:38::i;:::-;:51;;;;;;;;;;;;34396:52;34288:160;;;34360:16;:14;:16::i;:::-;34288:160;34266:265;;;;;;;;;;;;:::i;:::-;;;;;;;;;34544:19;34567:52;:50;:52::i;:::-;:80;;;;;;;;;;;;34566:81;34544:103;;34662:14;34658:179;;;34748:4;34693:38;:36;:38::i;:::-;:52;;;:59;;;;;;;;;;;;;;;;;;34821:4;34767:38;:36;:38::i;:::-;:51;;;:58;;;;;;;;;;;;;;;;;;34658:179;11269:19:::1;11292:13;::::0;::::1;;;;;;;;11291:14;11269:36;;11339:14;:34;;;;;11372:1;11357:12:::0;::::1;;;;;;;;;;:16;;;11339:34;11338:146;;;;11397:44;11435:4;11397:29;:44::i;:::-;11396:45;:87;;;;;11482:1;11466:12:::0;::::1;;;;;;;;;;:17;;;11396:87;11338:146;11316:242;;;;;;;;;;;;:::i;:::-;;;;;;;;;11584:1;11569:12:::0;::::1;:16;;;;;;;;;;;;;;;;;;11600:14;11596:67;;;11647:4;11631:13:::0;::::1;:20;;;;;;;;;;;;;;;;;;11596:67;83803:375:::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;::::0;83916:11:::2;83957;84002:4;84043;84082:5;84127:1;84165::::0;83803:14:::2;:375::i;:::-;84189:16;:14;:16::i;:::-;11689:14:::1;11685:102;;;11736:5;11720:13;::::0;:21:::1;;;;;;;;;;;;;;;;;;11761:14;11773:1;11761:14;;;;;;:::i;:::-;;;;;;;;11685:102;11258:536;34867:14:::0;34863:107;;;34953:5;34898:38;:36;:38::i;:::-;:52;;;:60;;;;;;;;;;;;;;;;;;34863:107;33981:996;83732:481::o;16820:87::-;16866:7;16893:6;;;;;;;;;;;16886:13;;16820:87;:::o;48008:128::-;48064:13;48097:23;:21;:23::i;:::-;:31;;48090:38;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48008:128;:::o;87600:127::-;16706:13;:11;:13::i;:::-;87713:6:::1;87669:23;:21;:23::i;:::-;:41;;;:50;;;;;;;;;;;;;;;;;;87600:127:::0;:::o;93210:125::-;93260:7;93287:23;:21;:23::i;:::-;:40;;;93280:47;;93210:125;:::o;93343:133::-;93397:7;93424:23;:21;:23::i;:::-;:44;;;93417:51;;93343:133;:::o;56005:396::-;56148:19;:17;:19::i;:::-;56136:31;;:8;:31;;;56132:61;;;56176:17;;;;;;;;;;;;;;56132:61;56314:8;56206:23;:21;:23::i;:::-;:42;;:63;56249:19;:17;:19::i;:::-;56206:63;;;;;;;;;;;;;;;:105;56288:8;56206:105;;;;;;;;;;;;;;;;:116;;;;;;;;;;;;;;;;;;56374:8;56338:55;;56353:19;:17;:19::i;:::-;56338:55;;;56384:8;56338:55;;;;;;:::i;:::-;;;;;;;;56005:396;;:::o;85690:1058::-;85782:23;:21;:23::i;:::-;:41;;;;;;;;;;;;85760:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;86025:8;85975:23;:21;:23::i;:::-;:47;;;:58;;;;:::i;:::-;85909:23;:21;:23::i;:::-;:44;;;:125;;85887:205;;;;;;;;;;;;:::i;:::-;;;;;;;;;86233:23;:21;:23::i;:::-;:47;;;86204:8;86125:23;:21;:23::i;:::-;:47;;:59;86173:10;86125:59;;;;;;;;;;;;;;;;:87;;;;:::i;:::-;:155;;86103:233;;;;;;;;;;;;:::i;:::-;;;;;;;;;86347:14;86375:23;:21;:23::i;:::-;:40;;;86364:8;:51;;;;:::i;:::-;86347:68;;86447:6;86434:9;:19;86426:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;86487:27;86493:10;86505:8;86487:5;:27::i;:::-;86603:8;86552:23;:21;:23::i;:::-;:47;;;:59;;;;;;;;;;;86721:8;86626:23;:21;:23::i;:::-;:47;;:91;86692:10;86626:91;;;;;;;;;;;;;;;;:103;;;;;;;;;;;85749:999;85690:1058;:::o;63615:399::-;63782:31;63795:4;63801:2;63805:7;63782:12;:31::i;:::-;63846:1;63828:2;:14;;;:19;63824:183;;63867:56;63898:4;63904:2;63908:7;63917:5;63867:30;:56::i;:::-;63862:145;;63951:40;;;;;;;;;;;;;;63862:145;63824:183;63615:399;;;;:::o;48242:656::-;48360:13;48396:16;48404:7;48396;:16::i;:::-;48391:59;;48421:29;;;;;;;;;;;;;;48391:59;48461:21;48485:10;:8;:10::i;:::-;48461:34;;48506:23;48532;:21;:23::i;:::-;:34;;48506:60;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48582:23;:21;:23::i;:::-;:32;;;;;;;;;;;;48577:111;;48638:23;:21;:23::i;:::-;:38;;48631:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48577:111;48743:1;48724:7;48718:21;:26;;:172;;;;;;;;;;;;;;;;;48810:7;48819:18;48829:7;48819:9;:18::i;:::-;48839:9;48793:56;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48718:172;48698:192;;;;48242:656;;;;:::o;94073:182::-;94117:7;94205:23;:21;:23::i;:::-;:41;;;94145:23;:21;:23::i;:::-;:44;;;:101;;;;:::i;:::-;94137:110;;94073:182;:::o;93083:119::-;93130:7;93157:23;:21;:23::i;:::-;:37;;;93150:44;;93083:119;:::o;56558:238::-;56700:4;56729:23;:21;:23::i;:::-;:42;;:49;56772:5;56729:49;;;;;;;;;;;;;;;:59;56779:8;56729:59;;;;;;;;;;;;;;;;;;;;;;;;;56722:66;;56558:238;;;;:::o;92087:114::-;16706:13;:11;:13::i;:::-;92187:6:::1;92152:23;:21;:23::i;:::-;:32;;;:41;;;;;;;;;;;;;;;;;;92087:114:::0;:::o;86975:420::-;16706:13;:11;:13::i;:::-;87176:8:::1;87128:23;:21;:23::i;:::-;:45;;;:56;;;;:::i;:::-;87064:23;:21;:23::i;:::-;:42;;;:121;;87042:201;;;;;;;;;;;;:::i;:::-;;;;;;;;;87254:27;87260:10;87272:8;87254:5;:27::i;:::-;87368:8;87319:23;:21;:23::i;:::-;:45;;;:57;;;;;;;;;;;86975:420:::0;:::o;17726:238::-;16706:13;:11;:13::i;:::-;17849:1:::1;17829:22;;:8;:22;;;;17807:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;17928:28;17947:8;17928:18;:28::i;:::-;17726:238:::0;:::o;31651:164::-;31692:16;31721:12;31596:46;31721:27;;31793:4;31783:14;;31768:40;31651:164;:::o;57054:360::-;57119:4;57175:7;57156:15;:13;:15::i;:::-;:26;;:90;;;;;57209:23;:21;:23::i;:::-;:37;;;57199:7;:47;57156:90;:231;;;;;57386:1;38207:8;57284:23;:21;:23::i;:::-;:41;;:50;57326:7;57284:50;;;;;;;;;;;;:85;:103;57156:231;57136:251;;57054:360;;;:::o;80887:105::-;80947:7;80974:10;80967:17;;80887:105;:::o;16985:132::-;17060:12;:10;:12::i;:::-;17049:23;;:7;:5;:7::i;:::-;:23;;;17041:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;16985:132::o;82724:652::-;82821:15;82854:20;82877:23;:21;:23::i;:::-;:37;;;82854:60;;82925:22;82950:19;82960:8;82950:9;:19::i;:::-;82925:44;;82982:27;83025:14;83012:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82982:58;;83051:15;83082:9;83094:15;:13;:15::i;:::-;83082:27;;83077:263;83115:12;83111:1;:16;83077:263;;;83167:8;83153:22;;:10;83161:1;83153:7;:10::i;:::-;:22;;;83149:180;;;83219:11;83228:1;83219:8;:11::i;:::-;83196;83208:7;83196:20;;;;;;;;:::i;:::-;;;;;;;:34;;;;83293:1;83282:12;;;;83149:180;83129:3;;;;;:::i;:::-;;;;83077:263;;;;83357:11;83350:18;;;;;;82724:652;;;:::o;42503:92::-;42559:7;42586:1;42579:8;;42503:92;:::o;51053:1491::-;51147:7;51172:12;51187:7;51172:22;;51255:4;51236:15;:13;:15::i;:::-;:23;51232:1245;;51289:23;:21;:23::i;:::-;:37;;;51282:4;:44;51278:1199;;;51351:14;51368:23;:21;:23::i;:::-;:41;;:95;51436:4;51368:95;;;;;;;;;;;;51351:112;;51557:1;38207:8;51529:6;:24;:29;51525:933;;;52194:201;52211:1;52201:6;:11;52194:201;;;52254:23;:21;:23::i;:::-;:41;;:113;52330:6;;;;;;;52254:113;;;;;;;;;;;;52245:122;;52194:201;;;52428:6;52421:13;;;;;;51525:933;51328:1149;51278:1199;51232:1245;52505:31;;;;;;;;;;;;;;51053:1491;;;;:::o;58295:546::-;58397:27;58426:23;58467:53;58523:37;:35;:37::i;:::-;:67;;:76;58591:7;58523:76;;;;;;;;;;;58467:132;;58746:18;58723:41;;58803:19;58797:26;58778:45;;58708:126;58295:546;;;:::o;57523:659::-;57672:11;57837:16;57830:5;57826:28;57817:37;;57997:16;57986:9;57982:32;57969:45;;58147:15;58136:9;58133:30;58125:5;58114:9;58111:20;58108:56;58098:66;;57523:659;;;;;:::o;64676:159::-;;;;;:::o;80196:311::-;80331:7;80351:16;38611:3;80377:19;:41;;80351:68;;38611:3;80445:31;80456:4;80462:2;80466:9;80445:10;:31::i;:::-;80437:40;;:62;;80430:69;;;80196:311;;;;;:::o;53124:531::-;53231:14;53404:16;53397:5;53393:28;53384:37;;53616:5;53602:11;53577:23;53573:41;53570:52;53546:5;53525:112;53515:122;;53124:531;;;;:::o;65500:158::-;;;;;:::o;18124:191::-;18198:16;18217:6;;;;;;;;;;;18198:25;;18243:8;18234:6;;:17;;;;;;;;;;;;;;;;;;18298:8;18267:40;;18288:8;18267:40;;;;;;;;;;;;18187:128;18124:191;:::o;67457:2637::-;67530:20;67553:23;:21;:23::i;:::-;:37;;;67530:60;;67617:1;67605:8;:13;67601:44;;;67627:18;;;;;;;;;;;;;;67601:44;67658:61;67688:1;67692:2;67696:12;67710:8;67658:21;:61::i;:::-;68260:1;37569:2;68230:1;:26;;68229:32;68200:8;:62;68133:23;:21;:23::i;:::-;:42;;:46;68176:2;68133:46;;;;;;;;;;;;;;;;:129;;;;;;;;;;;68595:160;68632:2;68707:33;68730:1;68734:2;68738:1;68707:14;:33::i;:::-;68653:30;68674:8;68653:20;:30::i;:::-;:87;68595:18;:160::i;:::-;68505:23;:21;:23::i;:::-;:41;;:87;68565:12;68505:87;;;;;;;;;;;:250;;;;68772:16;68803:11;68832:8;68817:12;:23;68803:37;;69087:16;69083:2;69079:25;69067:37;;69459:12;69419:8;69378:1;69316:25;69257:1;69196;69169:335;69584:1;69570:12;69566:20;69524:346;69625:3;69616:7;69613:16;69524:346;;69843:7;69833:8;69830:1;69803:25;69800:1;69797;69792:59;69678:1;69669:7;69665:15;69654:26;;69524:346;;;69528:77;69915:1;69903:8;:13;69899:45;;;69925:19;;;;;;;;;;;;;;69899:45;70001:3;69961:23;:21;:23::i;:::-;:37;;:43;;;;67907:2109;;70026:60;70055:1;70059:2;70063:12;70077:8;70026:20;:60::i;:::-;67519:2575;67457:2637;;:::o;32482:164::-;32523:16;32552:12;32415:58;32552:27;;32624:4;32614:14;;32599:40;32482:164;:::o;35485:569::-;35533:4;35904:12;35927:4;35904:28;;35943:10;36006:4;35994:17;35988:23;;36045:1;36039:2;:7;36032:14;;;;35485:569;:::o;1369:326::-;1429:4;1686:1;1664:7;:19;;;:23;1657:30;;1369:326;;;:::o;39847:714::-;35240:38;:36;:38::i;:::-;:52;;;;;;;;;;;;35218:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;40244:309:::1;40283:5;40303:7;40325:16;40356:13;40384:17;40416:20;40451:18;40484:23;40522:20;40244:24;:309::i;:::-;39847:714:::0;;;;;;;;;:::o;16363:97::-;13185:13;;;;;;;;;;13177:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;16426:26:::1;:24;:26::i;:::-;16363:97::o:0;66098:897::-;66261:4;66331:2;66295:56;;;66370:19;:17;:19::i;:::-;66408:4;66431:7;66457:5;66295:182;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;66278:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66763:1;66746:6;:13;:18;66742:235;;;66792:40;;;;;;;;;;;;;;66742:235;66935:6;66929:13;66920:6;66916:2;66912:15;66905:38;66278:710;66577:109;;;66550:136;;;:6;:136;;;;66526:160;;;66098:897;;;;;;:::o;49150:124::-;49201:13;49234:23;:21;:23::i;:::-;:32;;49227:39;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49150:124;:::o;81094:1622::-;81195:17;81625:4;81618;81612:11;81608:22;81601:29;;81717:3;81711:4;81704:17;81823:3;82062:5;82044:428;82070:1;82044:428;;;82110:1;82105:3;82101:11;82094:18;;82281:2;82275:4;82271:13;82267:2;82263:22;82258:3;82250:36;82375:2;82369:4;82365:13;82357:21;;82442:4;82432:25;;82450:5;;82432:25;82044:428;;;82048:21;82511:3;82506;82502:13;82626:4;82621:3;82617:14;82610:21;;82691:6;82686:3;82679:19;81239:1470;;81094:1622;;;:::o;14833:98::-;14886:7;14913:10;14906:17;;14833:98;:::o;79897:147::-;80034:6;79897:147;;;;;:::o;53757:356::-;53854:14;54092:1;54082:8;54079:15;54053:24;54049:46;54039:56;;53757:356;;;:::o;40569:1598::-;35240:38;:36;:38::i;:::-;:52;;;;;;;;;;;;35218:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;41008:5:::1;40976:23;:21;:23::i;:::-;:29;;:37;;;;;;;;;;;;:::i;:::-;;41058:7;41024:23;:21;:23::i;:::-;:31;;:41;;;;;;;;;;;;:::i;:::-;;41119:16;41076:23;:21;:23::i;:::-;:40;;:59;;;;41186:13;41146:23;:21;:23::i;:::-;:37;;:53;;;;41257:20;41210:23;:21;:23::i;:::-;:44;;:67;;;;41333:18;41288:23;:21;:23::i;:::-;:42;;:63;;;;41406:17;41362:23;:21;:23::i;:::-;:41;;:61;;;;41481:20;41434:23;:21;:23::i;:::-;:44;;:67;;;;41590:23;41512:37;:35;:37::i;:::-;:75;;:101;;;;41664:15;:13;:15::i;:::-;41624:23;:21;:23::i;:::-;:37;;:55;;;;41737:15;:13;:15::i;:::-;41690:23;:21;:23::i;:::-;:44;;:62;;;;41813:15;:13;:15::i;:::-;41763:23;:21;:23::i;:::-;:47;;:65;;;;41887:15;:13;:15::i;:::-;41839:23;:21;:23::i;:::-;:45;;:63;;;;41913:133;;;;;;;;;;;;;;;;;:37;:35;:37::i;:::-;:60;;:133;;;;;;;;;;;;:::i;:::-;;42057:102;;;;;;;;;;;;;;;;::::0;:37:::1;:35;:37::i;:::-;:66;;:102;;;;;;;;;;;;:::i;:::-;;40569:1598:::0;;;;;;;;;:::o;16468:113::-;13185:13;;;;;;;;;;13177:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;16541:32:::1;16560:12;:10;:12::i;:::-;16541:18;:32::i;:::-;16468:113::o:0;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:323::-;5676:6;5725:2;5713:9;5704:7;5700:23;5696:32;5693:119;;;5731:79;;:::i;:::-;5693:119;5851:1;5876:50;5918:7;5909:6;5898:9;5894:22;5876:50;:::i;:::-;5866:60;;5822:114;5620:323;;;;:::o;5949:327::-;6007:6;6056:2;6044:9;6035:7;6031:23;6027:32;6024:119;;;6062:79;;:::i;:::-;6024:119;6182:1;6207:52;6251:7;6242:6;6231:9;6227:22;6207:52;:::i;:::-;6197:62;;6153:116;5949:327;;;;:::o;6282:349::-;6351:6;6400:2;6388:9;6379:7;6375:23;6371:32;6368:119;;;6406:79;;:::i;:::-;6368:119;6526:1;6551:63;6606:7;6597:6;6586:9;6582:22;6551:63;:::i;:::-;6541:73;;6497:127;6282:349;;;;:::o;6637:509::-;6706:6;6755:2;6743:9;6734:7;6730:23;6726:32;6723:119;;;6761:79;;:::i;:::-;6723:119;6909:1;6898:9;6894:17;6881:31;6939:18;6931:6;6928:30;6925:117;;;6961:79;;:::i;:::-;6925:117;7066:63;7121:7;7112:6;7101:9;7097:22;7066:63;:::i;:::-;7056:73;;6852:287;6637:509;;;;:::o;7152:329::-;7211:6;7260:2;7248:9;7239:7;7235:23;7231:32;7228:119;;;7266:79;;:::i;:::-;7228:119;7386:1;7411:53;7456:7;7447:6;7436:9;7432:22;7411:53;:::i;:::-;7401:63;;7357:117;7152:329;;;;:::o;7487:474::-;7555:6;7563;7612:2;7600:9;7591:7;7587:23;7583:32;7580:119;;;7618:79;;:::i;:::-;7580:119;7738:1;7763:53;7808:7;7799:6;7788:9;7784:22;7763:53;:::i;:::-;7753:63;;7709:117;7865:2;7891:53;7936:7;7927:6;7916:9;7912:22;7891:53;:::i;:::-;7881:63;;7836:118;7487:474;;;;;:::o;7967:196::-;8056:10;8091:66;8153:3;8145:6;8091:66;:::i;:::-;8077:80;;7967:196;;;;:::o;8169:118::-;8256:24;8274:5;8256:24;:::i;:::-;8251:3;8244:37;8169:118;;:::o;8321:991::-;8460:3;8489:64;8547:5;8489:64;:::i;:::-;8569:96;8658:6;8653:3;8569:96;:::i;:::-;8562:103;;8691:3;8736:4;8728:6;8724:17;8719:3;8715:27;8766:66;8826:5;8766:66;:::i;:::-;8855:7;8886:1;8871:396;8896:6;8893:1;8890:13;8871:396;;;8967:9;8961:4;8957:20;8952:3;8945:33;9018:6;9012:13;9046:84;9125:4;9110:13;9046:84;:::i;:::-;9038:92;;9153:70;9216:6;9153:70;:::i;:::-;9143:80;;9252:4;9247:3;9243:14;9236:21;;8931:336;8918:1;8915;8911:9;8906:14;;8871:396;;;8875:14;9283:4;9276:11;;9303:3;9296:10;;8465:847;;;;;8321:991;;;;:::o;9318:109::-;9399:21;9414:5;9399:21;:::i;:::-;9394:3;9387:34;9318:109;;:::o;9433:360::-;9519:3;9547:38;9579:5;9547:38;:::i;:::-;9601:70;9664:6;9659:3;9601:70;:::i;:::-;9594:77;;9680:52;9725:6;9720:3;9713:4;9706:5;9702:16;9680:52;:::i;:::-;9757:29;9779:6;9757:29;:::i;:::-;9752:3;9748:39;9741:46;;9523:270;9433:360;;;;:::o;9799:143::-;9892:43;9929:5;9892:43;:::i;:::-;9887:3;9880:56;9799:143;;:::o;9948:344::-;10026:3;10054:39;10087:5;10054:39;:::i;:::-;10109:61;10163:6;10158:3;10109:61;:::i;:::-;10102:68;;10179:52;10224:6;10219:3;10212:4;10205:5;10201:16;10179:52;:::i;:::-;10256:29;10278:6;10256:29;:::i;:::-;10251:3;10247:39;10240:46;;10030:262;9948:344;;;;:::o;10298:364::-;10386:3;10414:39;10447:5;10414:39;:::i;:::-;10469:71;10533:6;10528:3;10469:71;:::i;:::-;10462:78;;10549:52;10594:6;10589:3;10582:4;10575:5;10571:16;10549:52;:::i;:::-;10626:29;10648:6;10626:29;:::i;:::-;10621:3;10617:39;10610:46;;10390:272;10298:364;;;;:::o;10668:377::-;10774:3;10802:39;10835:5;10802:39;:::i;:::-;10857:89;10939:6;10934:3;10857:89;:::i;:::-;10850:96;;10955:52;11000:6;10995:3;10988:4;10981:5;10977:16;10955:52;:::i;:::-;11032:6;11027:3;11023:16;11016:23;;10778:267;10668:377;;;;:::o;11051:366::-;11193:3;11214:67;11278:2;11273:3;11214:67;:::i;:::-;11207:74;;11290:93;11379:3;11290:93;:::i;:::-;11408:2;11403:3;11399:12;11392:19;;11051:366;;;:::o;11423:::-;11565:3;11586:67;11650:2;11645:3;11586:67;:::i;:::-;11579:74;;11662:93;11751:3;11662:93;:::i;:::-;11780:2;11775:3;11771:12;11764:19;;11423:366;;;:::o;11795:::-;11937:3;11958:67;12022:2;12017:3;11958:67;:::i;:::-;11951:74;;12034:93;12123:3;12034:93;:::i;:::-;12152:2;12147:3;12143:12;12136:19;;11795:366;;;:::o;12167:::-;12309:3;12330:67;12394:2;12389:3;12330:67;:::i;:::-;12323:74;;12406:93;12495:3;12406:93;:::i;:::-;12524:2;12519:3;12515:12;12508:19;;12167:366;;;:::o;12539:::-;12681:3;12702:67;12766:2;12761:3;12702:67;:::i;:::-;12695:74;;12778:93;12867:3;12778:93;:::i;:::-;12896:2;12891:3;12887:12;12880:19;;12539:366;;;:::o;12911:::-;13053:3;13074:67;13138:2;13133:3;13074:67;:::i;:::-;13067:74;;13150:93;13239:3;13150:93;:::i;:::-;13268:2;13263:3;13259:12;13252:19;;12911:366;;;:::o;13283:::-;13425:3;13446:67;13510:2;13505:3;13446:67;:::i;:::-;13439:74;;13522:93;13611:3;13522:93;:::i;:::-;13640:2;13635:3;13631:12;13624:19;;13283:366;;;:::o;13655:::-;13797:3;13818:67;13882:2;13877:3;13818:67;:::i;:::-;13811:74;;13894:93;13983:3;13894:93;:::i;:::-;14012:2;14007:3;14003:12;13996:19;;13655:366;;;:::o;14027:::-;14169:3;14190:67;14254:2;14249:3;14190:67;:::i;:::-;14183:74;;14266:93;14355:3;14266:93;:::i;:::-;14384:2;14379:3;14375:12;14368:19;;14027:366;;;:::o;14399:::-;14541:3;14562:67;14626:2;14621:3;14562:67;:::i;:::-;14555:74;;14638:93;14727:3;14638:93;:::i;:::-;14756:2;14751:3;14747:12;14740:19;;14399:366;;;:::o;14771:::-;14913:3;14934:67;14998:2;14993:3;14934:67;:::i;:::-;14927:74;;15010:93;15099:3;15010:93;:::i;:::-;15128:2;15123:3;15119:12;15112:19;;14771:366;;;:::o;15143:398::-;15302:3;15323:83;15404:1;15399:3;15323:83;:::i;:::-;15316:90;;15415:93;15504:3;15415:93;:::i;:::-;15533:1;15528:3;15524:11;15517:18;;15143:398;;;:::o;15547:366::-;15689:3;15710:67;15774:2;15769:3;15710:67;:::i;:::-;15703:74;;15786:93;15875:3;15786:93;:::i;:::-;15904:2;15899:3;15895:12;15888:19;;15547:366;;;:::o;15919:::-;16061:3;16082:67;16146:2;16141:3;16082:67;:::i;:::-;16075:74;;16158:93;16247:3;16158:93;:::i;:::-;16276:2;16271:3;16267:12;16260:19;;15919:366;;;:::o;16291:::-;16433:3;16454:67;16518:2;16513:3;16454:67;:::i;:::-;16447:74;;16530:93;16619:3;16530:93;:::i;:::-;16648:2;16643:3;16639:12;16632:19;;16291:366;;;:::o;16663:::-;16805:3;16826:67;16890:2;16885:3;16826:67;:::i;:::-;16819:74;;16902:93;16991:3;16902:93;:::i;:::-;17020:2;17015:3;17011:12;17004:19;;16663:366;;;:::o;17035:118::-;17122:24;17140:5;17122:24;:::i;:::-;17117:3;17110:37;17035:118;;:::o;17159:595::-;17387:3;17409:95;17500:3;17491:6;17409:95;:::i;:::-;17402:102;;17521:95;17612:3;17603:6;17521:95;:::i;:::-;17514:102;;17633:95;17724:3;17715:6;17633:95;:::i;:::-;17626:102;;17745:3;17738:10;;17159:595;;;;;;:::o;17760:379::-;17944:3;17966:147;18109:3;17966:147;:::i;:::-;17959:154;;18130:3;18123:10;;17760:379;;;:::o;18145:222::-;18238:4;18276:2;18265:9;18261:18;18253:26;;18289:71;18357:1;18346:9;18342:17;18333:6;18289:71;:::i;:::-;18145:222;;;;:::o;18373:640::-;18568:4;18606:3;18595:9;18591:19;18583:27;;18620:71;18688:1;18677:9;18673:17;18664:6;18620:71;:::i;:::-;18701:72;18769:2;18758:9;18754:18;18745:6;18701:72;:::i;:::-;18783;18851:2;18840:9;18836:18;18827:6;18783:72;:::i;:::-;18902:9;18896:4;18892:20;18887:2;18876:9;18872:18;18865:48;18930:76;19001:4;18992:6;18930:76;:::i;:::-;18922:84;;18373:640;;;;;;;:::o;19019:332::-;19140:4;19178:2;19167:9;19163:18;19155:26;;19191:71;19259:1;19248:9;19244:17;19235:6;19191:71;:::i;:::-;19272:72;19340:2;19329:9;19325:18;19316:6;19272:72;:::i;:::-;19019:332;;;;;:::o;19357:413::-;19520:4;19558:2;19547:9;19543:18;19535:26;;19607:9;19601:4;19597:20;19593:1;19582:9;19578:17;19571:47;19635:128;19758:4;19749:6;19635:128;:::i;:::-;19627:136;;19357:413;;;;:::o;19776:210::-;19863:4;19901:2;19890:9;19886:18;19878:26;;19914:65;19976:1;19965:9;19961:17;19952:6;19914:65;:::i;:::-;19776:210;;;;:::o;19992:234::-;20091:4;20129:2;20118:9;20114:18;20106:26;;20142:77;20216:1;20205:9;20201:17;20192:6;20142:77;:::i;:::-;19992:234;;;;:::o;20232:313::-;20345:4;20383:2;20372:9;20368:18;20360:26;;20432:9;20426:4;20422:20;20418:1;20407:9;20403:17;20396:47;20460:78;20533:4;20524:6;20460:78;:::i;:::-;20452:86;;20232:313;;;;:::o;20551:419::-;20717:4;20755:2;20744:9;20740:18;20732:26;;20804:9;20798:4;20794:20;20790:1;20779:9;20775:17;20768:47;20832:131;20958:4;20832:131;:::i;:::-;20824:139;;20551:419;;;:::o;20976:::-;21142:4;21180:2;21169:9;21165:18;21157:26;;21229:9;21223:4;21219:20;21215:1;21204:9;21200:17;21193:47;21257:131;21383:4;21257:131;:::i;:::-;21249:139;;20976:419;;;:::o;21401:::-;21567:4;21605:2;21594:9;21590:18;21582:26;;21654:9;21648:4;21644:20;21640:1;21629:9;21625:17;21618:47;21682:131;21808:4;21682:131;:::i;:::-;21674:139;;21401:419;;;:::o;21826:::-;21992:4;22030:2;22019:9;22015:18;22007:26;;22079:9;22073:4;22069:20;22065:1;22054:9;22050:17;22043:47;22107:131;22233:4;22107:131;:::i;:::-;22099:139;;21826:419;;;:::o;22251:::-;22417:4;22455:2;22444:9;22440:18;22432:26;;22504:9;22498:4;22494:20;22490:1;22479:9;22475:17;22468:47;22532:131;22658:4;22532:131;:::i;:::-;22524:139;;22251:419;;;:::o;22676:::-;22842:4;22880:2;22869:9;22865:18;22857:26;;22929:9;22923:4;22919:20;22915:1;22904:9;22900:17;22893:47;22957:131;23083:4;22957:131;:::i;:::-;22949:139;;22676:419;;;:::o;23101:::-;23267:4;23305:2;23294:9;23290:18;23282:26;;23354:9;23348:4;23344:20;23340:1;23329:9;23325:17;23318:47;23382:131;23508:4;23382:131;:::i;:::-;23374:139;;23101:419;;;:::o;23526:::-;23692:4;23730:2;23719:9;23715:18;23707:26;;23779:9;23773:4;23769:20;23765:1;23754:9;23750:17;23743:47;23807:131;23933:4;23807:131;:::i;:::-;23799:139;;23526:419;;;:::o;23951:::-;24117:4;24155:2;24144:9;24140:18;24132:26;;24204:9;24198:4;24194:20;24190:1;24179:9;24175:17;24168:47;24232:131;24358:4;24232:131;:::i;:::-;24224:139;;23951:419;;;:::o;24376:::-;24542:4;24580:2;24569:9;24565:18;24557:26;;24629:9;24623:4;24619:20;24615:1;24604:9;24600:17;24593:47;24657:131;24783:4;24657:131;:::i;:::-;24649:139;;24376:419;;;:::o;24801:::-;24967:4;25005:2;24994:9;24990:18;24982:26;;25054:9;25048:4;25044:20;25040:1;25029:9;25025:17;25018:47;25082:131;25208:4;25082:131;:::i;:::-;25074:139;;24801:419;;;:::o;25226:::-;25392:4;25430:2;25419:9;25415:18;25407:26;;25479:9;25473:4;25469:20;25465:1;25454:9;25450:17;25443:47;25507:131;25633:4;25507:131;:::i;:::-;25499:139;;25226:419;;;:::o;25651:::-;25817:4;25855:2;25844:9;25840:18;25832:26;;25904:9;25898:4;25894:20;25890:1;25879:9;25875:17;25868:47;25932:131;26058:4;25932:131;:::i;:::-;25924:139;;25651:419;;;:::o;26076:::-;26242:4;26280:2;26269:9;26265:18;26257:26;;26329:9;26323:4;26319:20;26315:1;26304:9;26300:17;26293:47;26357:131;26483:4;26357:131;:::i;:::-;26349:139;;26076:419;;;:::o;26501:::-;26667:4;26705:2;26694:9;26690:18;26682:26;;26754:9;26748:4;26744:20;26740:1;26729:9;26725:17;26718:47;26782:131;26908:4;26782:131;:::i;:::-;26774:139;;26501:419;;;:::o;26926:222::-;27019:4;27057:2;27046:9;27042:18;27034:26;;27070:71;27138:1;27127:9;27123:17;27114:6;27070:71;:::i;:::-;26926:222;;;;:::o;27154:129::-;27188:6;27215:20;;:::i;:::-;27205:30;;27244:33;27272:4;27264:6;27244:33;:::i;:::-;27154:129;;;:::o;27289:75::-;27322:6;27355:2;27349:9;27339:19;;27289:75;:::o;27370:307::-;27431:4;27521:18;27513:6;27510:30;27507:56;;;27543:18;;:::i;:::-;27507:56;27581:29;27603:6;27581:29;:::i;:::-;27573:37;;27665:4;27659;27655:15;27647:23;;27370:307;;;:::o;27683:308::-;27745:4;27835:18;27827:6;27824:30;27821:56;;;27857:18;;:::i;:::-;27821:56;27895:29;27917:6;27895:29;:::i;:::-;27887:37;;27979:4;27973;27969:15;27961:23;;27683:308;;;:::o;27997:142::-;28074:4;28097:3;28089:11;;28127:4;28122:3;28118:14;28110:22;;27997:142;;;:::o;28145:124::-;28222:6;28256:5;28250:12;28240:22;;28145:124;;;:::o;28275:98::-;28326:6;28360:5;28354:12;28344:22;;28275:98;;;:::o;28379:99::-;28431:6;28465:5;28459:12;28449:22;;28379:99;;;:::o;28484:123::-;28564:4;28596;28591:3;28587:14;28579:22;;28484:123;;;:::o;28613:194::-;28722:11;28756:6;28751:3;28744:19;28796:4;28791:3;28787:14;28772:29;;28613:194;;;;:::o;28813:168::-;28896:11;28930:6;28925:3;28918:19;28970:4;28965:3;28961:14;28946:29;;28813:168;;;;:::o;28987:147::-;29088:11;29125:3;29110:18;;28987:147;;;;:::o;29140:159::-;29214:11;29248:6;29243:3;29236:19;29288:4;29283:3;29279:14;29264:29;;29140:159;;;;:::o;29305:169::-;29389:11;29423:6;29418:3;29411:19;29463:4;29458:3;29454:14;29439:29;;29305:169;;;;:::o;29480:148::-;29582:11;29619:3;29604:18;;29480:148;;;;:::o;29634:305::-;29674:3;29693:20;29711:1;29693:20;:::i;:::-;29688:25;;29727:20;29745:1;29727:20;:::i;:::-;29722:25;;29881:1;29813:66;29809:74;29806:1;29803:81;29800:107;;;29887:18;;:::i;:::-;29800:107;29931:1;29928;29924:9;29917:16;;29634:305;;;;:::o;29945:185::-;29985:1;30002:20;30020:1;30002:20;:::i;:::-;29997:25;;30036:20;30054:1;30036:20;:::i;:::-;30031:25;;30075:1;30065:35;;30080:18;;:::i;:::-;30065:35;30122:1;30119;30115:9;30110:14;;29945:185;;;;:::o;30136:348::-;30176:7;30199:20;30217:1;30199:20;:::i;:::-;30194:25;;30233:20;30251:1;30233:20;:::i;:::-;30228:25;;30421:1;30353:66;30349:74;30346:1;30343:81;30338:1;30331:9;30324:17;30320:105;30317:131;;;30428:18;;:::i;:::-;30317:131;30476:1;30473;30469:9;30458:20;;30136:348;;;;:::o;30490:96::-;30527:7;30556:24;30574:5;30556:24;:::i;:::-;30545:35;;30490:96;;;:::o;30592:90::-;30626:7;30669:5;30662:13;30655:21;30644:32;;30592:90;;;:::o;30688:149::-;30724:7;30764:66;30757:5;30753:78;30742:89;;30688:149;;;:::o;30843:126::-;30880:7;30920:42;30913:5;30909:54;30898:65;;30843:126;;;:::o;30975:77::-;31012:7;31041:5;31030:16;;30975:77;;;:::o;31058:86::-;31093:7;31133:4;31126:5;31122:16;31111:27;;31058:86;;;:::o;31150:117::-;31206:9;31239:22;31255:5;31239:22;:::i;:::-;31226:35;;31150:117;;;:::o;31273:154::-;31357:6;31352:3;31347;31334:30;31419:1;31410:6;31405:3;31401:16;31394:27;31273:154;;;:::o;31433:307::-;31501:1;31511:113;31525:6;31522:1;31519:13;31511:113;;;31610:1;31605:3;31601:11;31595:18;31591:1;31586:3;31582:11;31575:39;31547:2;31544:1;31540:10;31535:15;;31511:113;;;31642:6;31639:1;31636:13;31633:101;;;31722:1;31713:6;31708:3;31704:16;31697:27;31633:101;31482:258;31433:307;;;:::o;31746:320::-;31790:6;31827:1;31821:4;31817:12;31807:22;;31874:1;31868:4;31864:12;31895:18;31885:81;;31951:4;31943:6;31939:17;31929:27;;31885:81;32013:2;32005:6;32002:14;31982:18;31979:38;31976:84;;;32032:18;;:::i;:::-;31976:84;31797:269;31746:320;;;:::o;32072:281::-;32155:27;32177:4;32155:27;:::i;:::-;32147:6;32143:40;32285:6;32273:10;32270:22;32249:18;32237:10;32234:34;32231:62;32228:88;;;32296:18;;:::i;:::-;32228:88;32336:10;32332:2;32325:22;32115:238;32072:281;;:::o;32359:233::-;32398:3;32421:24;32439:5;32421:24;:::i;:::-;32412:33;;32467:66;32460:5;32457:77;32454:103;;;32537:18;;:::i;:::-;32454:103;32584:1;32577:5;32573:13;32566:20;;32359:233;;;:::o;32598:180::-;32646:77;32643:1;32636:88;32743:4;32740:1;32733:15;32767:4;32764:1;32757:15;32784:180;32832:77;32829:1;32822:88;32929:4;32926:1;32919:15;32953:4;32950:1;32943:15;32970:180;33018:77;33015:1;33008:88;33115:4;33112:1;33105:15;33139:4;33136:1;33129:15;33156:180;33204:77;33201:1;33194:88;33301:4;33298:1;33291:15;33325:4;33322:1;33315:15;33342:180;33390:77;33387:1;33380:88;33487:4;33484:1;33477:15;33511:4;33508:1;33501:15;33528:117;33637:1;33634;33627:12;33651:117;33760:1;33757;33750:12;33774:117;33883:1;33880;33873:12;33897:117;34006:1;34003;33996:12;34020:102;34061:6;34112:2;34108:7;34103:2;34096:5;34092:14;34088:28;34078:38;;34020:102;;;:::o;34128:181::-;34268:33;34264:1;34256:6;34252:14;34245:57;34128:181;:::o;34315:239::-;34455:34;34451:1;34443:6;34439:14;34432:58;34524:22;34519:2;34511:6;34507:15;34500:47;34315:239;:::o;34560:225::-;34700:34;34696:1;34688:6;34684:14;34677:58;34769:8;34764:2;34756:6;34752:15;34745:33;34560:225;:::o;34791:180::-;34931:32;34927:1;34919:6;34915:14;34908:56;34791:180;:::o;34977:178::-;35117:30;35113:1;35105:6;35101:14;35094:54;34977:178;:::o;35161:170::-;35301:22;35297:1;35289:6;35285:14;35278:46;35161:170;:::o;35337:168::-;35477:20;35473:1;35465:6;35461:14;35454:44;35337:168;:::o;35511:175::-;35651:27;35647:1;35639:6;35635:14;35628:51;35511:175;:::o;35692:233::-;35832:34;35828:1;35820:6;35816:14;35809:58;35901:16;35896:2;35888:6;35884:15;35877:41;35692:233;:::o;35931:242::-;36071:34;36067:1;36059:6;36055:14;36048:58;36140:25;36135:2;36127:6;36123:15;36116:50;35931:242;:::o;36179:182::-;36319:34;36315:1;36307:6;36303:14;36296:58;36179:182;:::o;36367:114::-;;:::o;36487:171::-;36627:23;36623:1;36615:6;36611:14;36604:47;36487:171;:::o;36664:230::-;36804:34;36800:1;36792:6;36788:14;36781:58;36873:13;36868:2;36860:6;36856:15;36849:38;36664:230;:::o;36900:178::-;37040:30;37036:1;37028:6;37024:14;37017:54;36900:178;:::o;37084:::-;37224:30;37220:1;37212:6;37208:14;37201:54;37084:178;:::o;37268:122::-;37341:24;37359:5;37341:24;:::i;:::-;37334:5;37331:35;37321:63;;37380:1;37377;37370:12;37321:63;37268:122;:::o;37396:116::-;37466:21;37481:5;37466:21;:::i;:::-;37459:5;37456:32;37446:60;;37502:1;37499;37492:12;37446:60;37396:116;:::o;37518:120::-;37590:23;37607:5;37590:23;:::i;:::-;37583:5;37580:34;37570:62;;37628:1;37625;37618:12;37570:62;37518:120;:::o;37644:122::-;37717:24;37735:5;37717:24;:::i;:::-;37710:5;37707:35;37697:63;;37756:1;37753;37746:12;37697:63;37644:122;:::o
Swarm Source
ipfs://6dc7fdad929d9e3f2b22a474c125c9070eaf5d7f052ab91b55388799134e9f84
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.