ERC-721
Overview
Max Total Supply
138 COOL
Holders
30
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 COOLLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
CoolClub
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-05-26 */ // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol // OpenZeppelin Contracts (last updated v4.6.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = _efficientHash(computedHash, proofElement); } else { // Hash(current element of the proof + current computed hash) computedHash = _efficientHash(proofElement, computedHash); } } return computedHash; } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: erc721a/contracts/IERC721A.sol // ERC721A Contracts v4.0.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of an ERC721A compliant contract. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * The caller cannot approve to the current owner. */ error ApprovalToCurrentOwner(); /** * 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(); struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } /** * @dev Returns the total amount of tokens stored by the contract. * * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens. */ function totalSupply() external view returns (uint256); // ============================== // IERC165 // ============================== /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================== // 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`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================== // 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); } // File: erc721a/contracts/ERC721A.sol // ERC721A Contracts v4.0.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev ERC721 token receiver interface. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // 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 tokenId of the next token to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See `_packedOwnershipOf` implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see `_totalMinted`. */ function totalSupply() public view override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to `_startTokenId()` unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view returns (uint256) { return _burnCounter; } /** * @dev See {IERC165-supportsInterface}. */ 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: 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. } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_BURNED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> BITPOS_AUX); } /** * Sets the auxillary 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 { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; assembly { // Cast aux without masking. auxCasted := aux } packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX); _packedAddressData[owner] = packed; } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & BITMASK_BURNED == 0) { // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. // // We can directly compare the packed value. // If the address is zero, packed is zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * 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; } /** * Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev Casts the address to uint256 without masking. */ function _addressToUint256(address value) private pure returns (uint256 result) { assembly { result := value } } /** * @dev Casts the boolean to uint256 without branching. */ function _boolToUint256(bool value) private pure returns (uint256 result) { assembly { result := value } } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = address(uint160(_packedOwnershipOf(tokenId))); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { _transfer(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @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 (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned. } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal { _safeMint(to, 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. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the balance and number minted. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (to.code.length != 0) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex < end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @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. */ function _mint(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the balance and number minted. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSenderERC721A() == from || isApprovedForAll(from, _msgSenderERC721A()) || getApproved(tokenId) == _msgSenderERC721A()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. delete _tokenApprovals[tokenId]; // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | BITMASK_NEXT_INITIALIZED; // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `_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)); if (approvalCheck) { bool isApprovedOrOwner = (_msgSenderERC721A() == from || isApprovedForAll(from, _msgSenderERC721A()) || getApproved(tokenId) == _msgSenderERC721A()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. delete _tokenApprovals[tokenId]; // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _addressToUint256(from) | (block.timestamp << BITPOS_START_TIMESTAMP) | BITMASK_BURNED | BITMASK_NEXT_INITIALIZED; // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @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 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 returns (string memory ptr) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128. ptr := add(mload(0x40), 128) // Update the free memory pointer to allocate. mstore(0x40, ptr) // Cache the end of the memory to calculate the length later. let end := ptr // We write the string from the rightmost digit to the leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // Costs a bit more than early returning for the zero case, // but cheaper in terms of deployment and overall runtime costs. for { // Initialize and perform the first pass without check. let temp := value // Move the pointer 1 byte leftwards to point to an empty character slot. ptr := sub(ptr, 1) // Write the character to the pointer. 48 is the ASCII index of '0'. mstore8(ptr, add(48, mod(temp, 10))) temp := div(temp, 10) } temp { // Keep dividing `temp` until zero. temp := div(temp, 10) } { // Body of the for loop. ptr := sub(ptr, 1) mstore8(ptr, add(48, mod(temp, 10))) } let length := sub(end, ptr) // Move the pointer 32 bytes leftwards to make room for the length. ptr := sub(ptr, 32) // Store the length. mstore(ptr, length) } } } // File: contracts/CoolClub.sol pragma solidity ^0.8.4; contract CoolClub is ERC721A, Ownable, ReentrancyGuard { using Strings for uint256; bool public public_sale_running = false; bool public private_sale_running = false; uint public MINT_PRICE = 0.08 ether; uint public MAX_SUPPLY = 12000; uint public MAX_PER_TX = 3; bytes32 public merkle_root; constructor () ERC721A("The Cool Club", "COOL") { _safeMint(msg.sender, 100); } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { return string(abi.encodePacked("https://mnt.thecool.club/metadata/", tokenId.toString(), ".json")); } function _startTokenId() internal view virtual override returns (uint256) { return 1; } function isWhitelisted(address _user, bytes32 [] calldata _merkleProof) public view returns(bool) { bytes32 leaf = keccak256(abi.encodePacked(_user)); return MerkleProof.verify(_merkleProof, merkle_root, leaf); } function getNumClaimed(address _user) public view returns(uint64) { return _getAux(_user); } function whitelistMint(bytes32 [] calldata _merkleProof, uint64 _quantity) external payable nonReentrant { require(tx.origin == msg.sender); require(private_sale_running, "Private sale is not running"); require(msg.value == MINT_PRICE * _quantity, "Incorrect ETH sent to mint"); require(totalSupply() + _quantity <= MAX_SUPPLY, "Not enough tokens left to mint"); require(isWhitelisted(msg.sender, _merkleProof), "Invalid proof"); uint64 num_claimed = _getAux(msg.sender); require(num_claimed + _quantity <= 5, "Can't claim more than 5 total"); _setAux(msg.sender, num_claimed + _quantity); _safeMint(msg.sender, _quantity); } function publicMint(uint64 _quantity) external payable nonReentrant { require(tx.origin == msg.sender); require(public_sale_running, "Public sale is not running"); require(msg.value == MINT_PRICE * _quantity, "Incorrect ETH sent to mint"); require(totalSupply() + _quantity <= MAX_SUPPLY, "Not enough tokens left to mint"); require(_quantity <= MAX_PER_TX, "Invalid number of tokens queries for minting"); _safeMint(msg.sender, _quantity); } function burn(uint _token_id) external { _burn(_token_id, true); } function togglePublicSale() external onlyOwner { public_sale_running = !public_sale_running; } function togglePrivateSale() external onlyOwner { private_sale_running = !private_sale_running; } function adminMint(address _destination, uint _quantity) external onlyOwner { require(totalSupply() + _quantity <= MAX_SUPPLY, "Not enough tokens left to mint"); _safeMint(_destination, _quantity); } function updateWhitelistMerkleRoot(bytes32 _new_root) external onlyOwner { merkle_root = _new_root; } function updateMaxSupply(uint _new_supply) external onlyOwner { require(_new_supply < MAX_SUPPLY, "Cannot increase supply"); MAX_SUPPLY = _new_supply; } function updateMintingPrice(uint _new_price) external onlyOwner { MINT_PRICE = _new_price; } function updateMaxPerTransaction(uint _new_amount) external onlyOwner { MAX_PER_TX = _new_amount; } function withdraw() external onlyOwner { payable(msg.sender).transfer(address(this).balance); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","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":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_PER_TX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_destination","type":"address"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"adminMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_token_id","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getNumClaimed","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkle_root","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"private_sale_running","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"_quantity","type":"uint64"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"public_sale_running","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","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":"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":[],"name":"togglePrivateSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePublicSale","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"uint256","name":"_new_amount","type":"uint256"}],"name":"updateMaxPerTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_new_supply","type":"uint256"}],"name":"updateMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_new_price","type":"uint256"}],"name":"updateMintingPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_new_root","type":"bytes32"}],"name":"updateWhitelistMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"uint64","name":"_quantity","type":"uint64"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000600a60006101000a81548160ff0219169083151502179055506000600a60016101000a81548160ff02191690831515021790555067011c37937e080000600b55612ee0600c556003600d553480156200005e57600080fd5b506040518060400160405280600d81526020017f54686520436f6f6c20436c7562000000000000000000000000000000000000008152506040518060400160405280600481526020017f434f4f4c000000000000000000000000000000000000000000000000000000008152508160029080519060200190620000e3929190620006c2565b508060039080519060200190620000fc929190620006c2565b506200010d6200015660201b60201c565b600081905550505062000135620001296200015f60201b60201c565b6200016760201b60201c565b6001600981905550620001503360646200022d60201b60201c565b620009c3565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200024f8282604051806020016040528060008152506200025360201b60201c565b5050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415620002c1576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831415620002fd576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200031260008583866200053860201b60201c565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e16200037f600185146200053e60201b60201c565b901b60a042901b62000397866200054860201b60201c565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14620004a8575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46200045460008784806001019550876200055260201b60201c565b6200048b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808210620003dd578260005414620004a257600080fd5b62000514565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210620004a9575b816000819055505050620005326000858386620006b460201b60201c565b50505050565b50505050565b6000819050919050565b6000819050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0262000580620006ba60201b60201c565b8786866040518563ffffffff1660e01b8152600401620005a4949392919062000876565b6020604051808303816000875af1925050508015620005e357506040513d601f19601f82011682018060405250810190620005e091906200092c565b60015b62000661573d806000811462000616576040519150601f19603f3d011682016040523d82523d6000602084013e6200061b565b606091505b5060008151141562000659576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b50505050565b600033905090565b828054620006d0906200098d565b90600052602060002090601f016020900481019282620006f4576000855562000740565b82601f106200070f57805160ff191683800117855562000740565b8280016001018555821562000740579182015b828111156200073f57825182559160200191906001019062000722565b5b5090506200074f919062000753565b5090565b5b808211156200076e57600081600090555060010162000754565b5090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200079f8262000772565b9050919050565b620007b18162000792565b82525050565b6000819050919050565b620007cc81620007b7565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b838110156200080e578082015181840152602081019050620007f1565b838111156200081e576000848401525b50505050565b6000601f19601f8301169050919050565b60006200084282620007d2565b6200084e8185620007dd565b935062000860818560208601620007ee565b6200086b8162000824565b840191505092915050565b60006080820190506200088d6000830187620007a6565b6200089c6020830186620007a6565b620008ab6040830185620007c1565b8181036060830152620008bf818462000835565b905095945050505050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6200090681620008cf565b81146200091257600080fd5b50565b6000815190506200092681620008fb565b92915050565b600060208284031215620009455762000944620008ca565b5b6000620009558482850162000915565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620009a657607f821691505b60208210811415620009bd57620009bc6200095e565b5b50919050565b613e4480620009d36000396000f3fe60806040526004361061020f5760003560e01c80638da5cb5b11610118578063dfe5dd68116100a0578063e985e9c51161006f578063e985e9c514610745578063f103b43314610782578063f2fde38b146107ab578063f43a22dc146107d4578063fd5e8efe146107ff5761020f565b8063dfe5dd68146106c3578063e222c7f9146106da578063e58306f9146106f1578063e6f6ef1e1461071a5761020f565b8063b88d4fde116100e7578063b88d4fde146105cc578063c002d23d146105f5578063c7381b9514610620578063c87b56dd14610649578063ca5d9cda146106865761020f565b80638da5cb5b146105225780639168e23e1461054d57806395d89b4114610578578063a22cb465146105a35761020f565b806342842e0e1161019b5780636352211e1161016a5780636352211e1461044c5780636957637b146104895780636afcb7b0146104b257806370a08231146104ce578063715018a61461050b5761020f565b806342842e0e1461039457806342966c68146103bd5780635788ff36146103e65780635a23dd991461040f5761020f565b806318160ddd116101e257806318160ddd146102e25780631b004d251461030d57806323b872dd1461032957806332cb6b0c146103525780633ccfd60b1461037d5761020f565b806301ffc9a71461021457806306fdde0314610251578063081812fc1461027c578063095ea7b3146102b9575b600080fd5b34801561022057600080fd5b5061023b60048036038101906102369190612c5b565b61082a565b6040516102489190612ca3565b60405180910390f35b34801561025d57600080fd5b506102666108bc565b6040516102739190612d57565b60405180910390f35b34801561028857600080fd5b506102a3600480360381019061029e9190612daf565b61094e565b6040516102b09190612e1d565b60405180910390f35b3480156102c557600080fd5b506102e060048036038101906102db9190612e64565b6109ca565b005b3480156102ee57600080fd5b506102f7610b71565b6040516103049190612eb3565b60405180910390f35b61032760048036038101906103229190612f73565b610b88565b005b34801561033557600080fd5b50610350600480360381019061034b9190612fd3565b610dfe565b005b34801561035e57600080fd5b50610367610e0e565b6040516103749190612eb3565b60405180910390f35b34801561038957600080fd5b50610392610e14565b005b3480156103a057600080fd5b506103bb60048036038101906103b69190612fd3565b610ed9565b005b3480156103c957600080fd5b506103e460048036038101906103df9190612daf565b610ef9565b005b3480156103f257600080fd5b5061040d60048036038101906104089190612daf565b610f07565b005b34801561041b57600080fd5b5061043660048036038101906104319190613026565b610f8d565b6040516104439190612ca3565b60405180910390f35b34801561045857600080fd5b50610473600480360381019061046e9190612daf565b611011565b6040516104809190612e1d565b60405180910390f35b34801561049557600080fd5b506104b060048036038101906104ab91906130bc565b611023565b005b6104cc60048036038101906104c791906130e9565b6110a9565b005b3480156104da57600080fd5b506104f560048036038101906104f09190613116565b6112a6565b6040516105029190612eb3565b60405180910390f35b34801561051757600080fd5b5061052061135f565b005b34801561052e57600080fd5b506105376113e7565b6040516105449190612e1d565b60405180910390f35b34801561055957600080fd5b50610562611411565b60405161056f9190612ca3565b60405180910390f35b34801561058457600080fd5b5061058d611424565b60405161059a9190612d57565b60405180910390f35b3480156105af57600080fd5b506105ca60048036038101906105c5919061316f565b6114b6565b005b3480156105d857600080fd5b506105f360048036038101906105ee91906132df565b61162e565b005b34801561060157600080fd5b5061060a6116a1565b6040516106179190612eb3565b60405180910390f35b34801561062c57600080fd5b5061064760048036038101906106429190612daf565b6116a7565b005b34801561065557600080fd5b50610670600480360381019061066b9190612daf565b61172d565b60405161067d9190612d57565b60405180910390f35b34801561069257600080fd5b506106ad60048036038101906106a89190613116565b61175e565b6040516106ba9190613371565b60405180910390f35b3480156106cf57600080fd5b506106d8611770565b005b3480156106e657600080fd5b506106ef611818565b005b3480156106fd57600080fd5b5061071860048036038101906107139190612e64565b6118c0565b005b34801561072657600080fd5b5061072f6119a1565b60405161073c9190612ca3565b60405180910390f35b34801561075157600080fd5b5061076c6004803603810190610767919061338c565b6119b4565b6040516107799190612ca3565b60405180910390f35b34801561078e57600080fd5b506107a960048036038101906107a49190612daf565b611a48565b005b3480156107b757600080fd5b506107d260048036038101906107cd9190613116565b611b12565b005b3480156107e057600080fd5b506107e9611c0a565b6040516107f69190612eb3565b60405180910390f35b34801561080b57600080fd5b50610814611c10565b60405161082191906133db565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061088557506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108b55750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546108cb90613425565b80601f01602080910402602001604051908101604052809291908181526020018280546108f790613425565b80156109445780601f1061091957610100808354040283529160200191610944565b820191906000526020600020905b81548152906001019060200180831161092757829003601f168201915b5050505050905090565b600061095982611c16565b61098f576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109d582611c75565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a3d576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a5c611d43565b73ffffffffffffffffffffffffffffffffffffffff1614610abf57610a8881610a83611d43565b6119b4565b610abe576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610b7b611d4b565b6001546000540303905090565b60026009541415610bce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc5906134a3565b60405180910390fd5b60026009819055503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610c0e57600080fd5b600a60019054906101000a900460ff16610c5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c549061350f565b60405180910390fd5b8067ffffffffffffffff16600b54610c75919061355e565b3414610cb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cad90613604565b60405180910390fd5b600c548167ffffffffffffffff16610ccc610b71565b610cd69190613624565b1115610d17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0e906136c6565b60405180910390fd5b610d22338484610f8d565b610d61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5890613732565b60405180910390fd5b6000610d6c33611d54565b905060058282610d7c9190613752565b67ffffffffffffffff161115610dc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbe906137dc565b60405180910390fd5b610ddc338383610dd79190613752565b611da1565b610df0338367ffffffffffffffff16611e57565b506001600981905550505050565b610e09838383611e75565b505050565b600c5481565b610e1c61221f565b73ffffffffffffffffffffffffffffffffffffffff16610e3a6113e7565b73ffffffffffffffffffffffffffffffffffffffff1614610e90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8790613848565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610ed6573d6000803e3d6000fd5b50565b610ef48383836040518060200160405280600081525061162e565b505050565b610f04816001612227565b50565b610f0f61221f565b73ffffffffffffffffffffffffffffffffffffffff16610f2d6113e7565b73ffffffffffffffffffffffffffffffffffffffff1614610f83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7a90613848565b60405180910390fd5b80600b8190555050565b60008084604051602001610fa191906138b0565b604051602081830303815290604052805190602001209050611007848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600e54836124ff565b9150509392505050565b600061101c82611c75565b9050919050565b61102b61221f565b73ffffffffffffffffffffffffffffffffffffffff166110496113e7565b73ffffffffffffffffffffffffffffffffffffffff161461109f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109690613848565b60405180910390fd5b80600e8190555050565b600260095414156110ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e6906134a3565b60405180910390fd5b60026009819055503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461112f57600080fd5b600a60009054906101000a900460ff1661117e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117590613917565b60405180910390fd5b8067ffffffffffffffff16600b54611196919061355e565b34146111d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ce90613604565b60405180910390fd5b600c548167ffffffffffffffff166111ed610b71565b6111f79190613624565b1115611238576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122f906136c6565b60405180910390fd5b600d548167ffffffffffffffff161115611287576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127e906139a9565b60405180910390fd5b61129b338267ffffffffffffffff16611e57565b600160098190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561130e576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61136761221f565b73ffffffffffffffffffffffffffffffffffffffff166113856113e7565b73ffffffffffffffffffffffffffffffffffffffff16146113db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d290613848565b60405180910390fd5b6113e56000612516565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600a60019054906101000a900460ff1681565b60606003805461143390613425565b80601f016020809104026020016040519081016040528092919081815260200182805461145f90613425565b80156114ac5780601f10611481576101008083540402835291602001916114ac565b820191906000526020600020905b81548152906001019060200180831161148f57829003601f168201915b5050505050905090565b6114be611d43565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611523576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611530611d43565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166115dd611d43565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116229190612ca3565b60405180910390a35050565b611639848484611e75565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461169b57611664848484846125dc565b61169a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600b5481565b6116af61221f565b73ffffffffffffffffffffffffffffffffffffffff166116cd6113e7565b73ffffffffffffffffffffffffffffffffffffffff1614611723576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171a90613848565b60405180910390fd5b80600d8190555050565b60606117388261272d565b6040516020016117489190613ac3565b6040516020818303038152906040529050919050565b600061176982611d54565b9050919050565b61177861221f565b73ffffffffffffffffffffffffffffffffffffffff166117966113e7565b73ffffffffffffffffffffffffffffffffffffffff16146117ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e390613848565b60405180910390fd5b600a60019054906101000a900460ff1615600a60016101000a81548160ff021916908315150217905550565b61182061221f565b73ffffffffffffffffffffffffffffffffffffffff1661183e6113e7565b73ffffffffffffffffffffffffffffffffffffffff1614611894576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188b90613848565b60405180910390fd5b600a60009054906101000a900460ff1615600a60006101000a81548160ff021916908315150217905550565b6118c861221f565b73ffffffffffffffffffffffffffffffffffffffff166118e66113e7565b73ffffffffffffffffffffffffffffffffffffffff161461193c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193390613848565b60405180910390fd5b600c5481611948610b71565b6119529190613624565b1115611993576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198a906136c6565b60405180910390fd5b61199d8282611e57565b5050565b600a60009054906101000a900460ff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611a5061221f565b73ffffffffffffffffffffffffffffffffffffffff16611a6e6113e7565b73ffffffffffffffffffffffffffffffffffffffff1614611ac4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abb90613848565b60405180910390fd5b600c548110611b08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aff90613b3c565b60405180910390fd5b80600c8190555050565b611b1a61221f565b73ffffffffffffffffffffffffffffffffffffffff16611b386113e7565b73ffffffffffffffffffffffffffffffffffffffff1614611b8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8590613848565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611bfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf590613bce565b60405180910390fd5b611c0781612516565b50565b600d5481565b600e5481565b600081611c21611d4b565b11158015611c30575060005482105b8015611c6e575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60008082905080611c84611d4b565b11611d0c57600054811015611d0b5760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611d09575b6000811415611cff576004600083600190039350838152602001908152602001600020549050611cd4565b8092505050611d3e565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b60006001905090565b600060c0600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600082905060c081901b77ffffffffffffffffffffffffffffffffffffffffffffffff831617915081600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050505050565b611e7182826040518060200160405280600081525061288e565b5050565b6000611e8082611c75565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611ee7576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611f08611d43565b73ffffffffffffffffffffffffffffffffffffffff161480611f375750611f3685611f31611d43565b6119b4565b5b80611f7c5750611f45611d43565b73ffffffffffffffffffffffffffffffffffffffff16611f648461094e565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611fb5576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561201c576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120298585856001612b43565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b61212686612b49565b1717600460008581526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000831614156121b05760006001840190506000600460008381526020019081526020016000205414156121ae5760005481146121ad578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46122188585856001612b53565b5050505050565b600033905090565b600061223283611c75565b90506000819050821561230f5760008173ffffffffffffffffffffffffffffffffffffffff16612260611d43565b73ffffffffffffffffffffffffffffffffffffffff16148061228f575061228e82612289611d43565b6119b4565b5b806122d4575061229d611d43565b73ffffffffffffffffffffffffffffffffffffffff166122bc8661094e565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061230d576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b61231d816000866001612b43565b6006600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600160806001901b03600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055507c02000000000000000000000000000000000000000000000000000000007c010000000000000000000000000000000000000000000000000000000060a042901b6123f284612b49565b171717600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008316141561247d57600060018501905060006004600083815260200190815260200160002054141561247b57600054811461247a578260046000838152602001908152602001600020819055505b5b505b83600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46124e7816000866001612b53565b60016000815480929190600101919050555050505050565b60008261250c8584612b59565b1490509392505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612602611d43565b8786866040518563ffffffff1660e01b81526004016126249493929190613c43565b6020604051808303816000875af192505050801561266057506040513d601f19601f8201168201806040525081019061265d9190613ca4565b60015b6126da573d8060008114612690576040519150601f19603f3d011682016040523d82523d6000602084013e612695565b606091505b506000815114156126d2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000821415612775576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612889565b600082905060005b600082146127a757808061279090613cd1565b915050600a826127a09190613d49565b915061277d565b60008167ffffffffffffffff8111156127c3576127c26131b4565b5b6040519080825280601f01601f1916602001820160405280156127f55781602001600182028036833780820191505090505b5090505b600085146128825760018261280e9190613d7a565b9150600a8561281d9190613dae565b60306128299190613624565b60f81b81838151811061283f5761283e613ddf565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561287b9190613d49565b94506127f9565b8093505050505b919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156128fb576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831415612936576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6129436000858386612b43565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e16129a860018514612bce565b901b60a042901b6129b886612b49565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14612abc575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612a6c60008784806001019550876125dc565b612aa2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106129fd578260005414612ab757600080fd5b612b27565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612abd575b816000819055505050612b3d6000858386612b53565b50505050565b50505050565b6000819050919050565b50505050565b60008082905060005b8451811015612bc3576000858281518110612b8057612b7f613ddf565b5b60200260200101519050808311612ba257612b9b8382612bd8565b9250612baf565b612bac8184612bd8565b92505b508080612bbb90613cd1565b915050612b62565b508091505092915050565b6000819050919050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612c3881612c03565b8114612c4357600080fd5b50565b600081359050612c5581612c2f565b92915050565b600060208284031215612c7157612c70612bf9565b5b6000612c7f84828501612c46565b91505092915050565b60008115159050919050565b612c9d81612c88565b82525050565b6000602082019050612cb86000830184612c94565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612cf8578082015181840152602081019050612cdd565b83811115612d07576000848401525b50505050565b6000601f19601f8301169050919050565b6000612d2982612cbe565b612d338185612cc9565b9350612d43818560208601612cda565b612d4c81612d0d565b840191505092915050565b60006020820190508181036000830152612d718184612d1e565b905092915050565b6000819050919050565b612d8c81612d79565b8114612d9757600080fd5b50565b600081359050612da981612d83565b92915050565b600060208284031215612dc557612dc4612bf9565b5b6000612dd384828501612d9a565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612e0782612ddc565b9050919050565b612e1781612dfc565b82525050565b6000602082019050612e326000830184612e0e565b92915050565b612e4181612dfc565b8114612e4c57600080fd5b50565b600081359050612e5e81612e38565b92915050565b60008060408385031215612e7b57612e7a612bf9565b5b6000612e8985828601612e4f565b9250506020612e9a85828601612d9a565b9150509250929050565b612ead81612d79565b82525050565b6000602082019050612ec86000830184612ea4565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112612ef357612ef2612ece565b5b8235905067ffffffffffffffff811115612f1057612f0f612ed3565b5b602083019150836020820283011115612f2c57612f2b612ed8565b5b9250929050565b600067ffffffffffffffff82169050919050565b612f5081612f33565b8114612f5b57600080fd5b50565b600081359050612f6d81612f47565b92915050565b600080600060408486031215612f8c57612f8b612bf9565b5b600084013567ffffffffffffffff811115612faa57612fa9612bfe565b5b612fb686828701612edd565b93509350506020612fc986828701612f5e565b9150509250925092565b600080600060608486031215612fec57612feb612bf9565b5b6000612ffa86828701612e4f565b935050602061300b86828701612e4f565b925050604061301c86828701612d9a565b9150509250925092565b60008060006040848603121561303f5761303e612bf9565b5b600061304d86828701612e4f565b935050602084013567ffffffffffffffff81111561306e5761306d612bfe565b5b61307a86828701612edd565b92509250509250925092565b6000819050919050565b61309981613086565b81146130a457600080fd5b50565b6000813590506130b681613090565b92915050565b6000602082840312156130d2576130d1612bf9565b5b60006130e0848285016130a7565b91505092915050565b6000602082840312156130ff576130fe612bf9565b5b600061310d84828501612f5e565b91505092915050565b60006020828403121561312c5761312b612bf9565b5b600061313a84828501612e4f565b91505092915050565b61314c81612c88565b811461315757600080fd5b50565b60008135905061316981613143565b92915050565b6000806040838503121561318657613185612bf9565b5b600061319485828601612e4f565b92505060206131a58582860161315a565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6131ec82612d0d565b810181811067ffffffffffffffff8211171561320b5761320a6131b4565b5b80604052505050565b600061321e612bef565b905061322a82826131e3565b919050565b600067ffffffffffffffff82111561324a576132496131b4565b5b61325382612d0d565b9050602081019050919050565b82818337600083830152505050565b600061328261327d8461322f565b613214565b90508281526020810184848401111561329e5761329d6131af565b5b6132a9848285613260565b509392505050565b600082601f8301126132c6576132c5612ece565b5b81356132d684826020860161326f565b91505092915050565b600080600080608085870312156132f9576132f8612bf9565b5b600061330787828801612e4f565b945050602061331887828801612e4f565b935050604061332987828801612d9a565b925050606085013567ffffffffffffffff81111561334a57613349612bfe565b5b613356878288016132b1565b91505092959194509250565b61336b81612f33565b82525050565b60006020820190506133866000830184613362565b92915050565b600080604083850312156133a3576133a2612bf9565b5b60006133b185828601612e4f565b92505060206133c285828601612e4f565b9150509250929050565b6133d581613086565b82525050565b60006020820190506133f060008301846133cc565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061343d57607f821691505b60208210811415613451576134506133f6565b5b50919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061348d601f83612cc9565b915061349882613457565b602082019050919050565b600060208201905081810360008301526134bc81613480565b9050919050565b7f507269766174652073616c65206973206e6f742072756e6e696e670000000000600082015250565b60006134f9601b83612cc9565b9150613504826134c3565b602082019050919050565b60006020820190508181036000830152613528816134ec565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061356982612d79565b915061357483612d79565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156135ad576135ac61352f565b5b828202905092915050565b7f496e636f7272656374204554482073656e7420746f206d696e74000000000000600082015250565b60006135ee601a83612cc9565b91506135f9826135b8565b602082019050919050565b6000602082019050818103600083015261361d816135e1565b9050919050565b600061362f82612d79565b915061363a83612d79565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561366f5761366e61352f565b5b828201905092915050565b7f4e6f7420656e6f75676820746f6b656e73206c65667420746f206d696e740000600082015250565b60006136b0601e83612cc9565b91506136bb8261367a565b602082019050919050565b600060208201905081810360008301526136df816136a3565b9050919050565b7f496e76616c69642070726f6f6600000000000000000000000000000000000000600082015250565b600061371c600d83612cc9565b9150613727826136e6565b602082019050919050565b6000602082019050818103600083015261374b8161370f565b9050919050565b600061375d82612f33565b915061376883612f33565b92508267ffffffffffffffff038211156137855761378461352f565b5b828201905092915050565b7f43616e277420636c61696d206d6f7265207468616e203520746f74616c000000600082015250565b60006137c6601d83612cc9565b91506137d182613790565b602082019050919050565b600060208201905081810360008301526137f5816137b9565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613832602083612cc9565b915061383d826137fc565b602082019050919050565b6000602082019050818103600083015261386181613825565b9050919050565b60008160601b9050919050565b600061388082613868565b9050919050565b600061389282613875565b9050919050565b6138aa6138a582612dfc565b613887565b82525050565b60006138bc8284613899565b60148201915081905092915050565b7f5075626c69632073616c65206973206e6f742072756e6e696e67000000000000600082015250565b6000613901601a83612cc9565b915061390c826138cb565b602082019050919050565b60006020820190508181036000830152613930816138f4565b9050919050565b7f496e76616c6964206e756d626572206f6620746f6b656e73207175657269657360008201527f20666f72206d696e74696e670000000000000000000000000000000000000000602082015250565b6000613993602c83612cc9565b915061399e82613937565b604082019050919050565b600060208201905081810360008301526139c281613986565b9050919050565b600081905092915050565b7f68747470733a2f2f6d6e742e746865636f6f6c2e636c75622f6d65746164617460008201527f612f000000000000000000000000000000000000000000000000000000000000602082015250565b6000613a306022836139c9565b9150613a3b826139d4565b602282019050919050565b6000613a5182612cbe565b613a5b81856139c9565b9350613a6b818560208601612cda565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000613aad6005836139c9565b9150613ab882613a77565b600582019050919050565b6000613ace82613a23565b9150613ada8284613a46565b9150613ae582613aa0565b915081905092915050565b7f43616e6e6f7420696e63726561736520737570706c7900000000000000000000600082015250565b6000613b26601683612cc9565b9150613b3182613af0565b602082019050919050565b60006020820190508181036000830152613b5581613b19565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613bb8602683612cc9565b9150613bc382613b5c565b604082019050919050565b60006020820190508181036000830152613be781613bab565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613c1582613bee565b613c1f8185613bf9565b9350613c2f818560208601612cda565b613c3881612d0d565b840191505092915050565b6000608082019050613c586000830187612e0e565b613c656020830186612e0e565b613c726040830185612ea4565b8181036060830152613c848184613c0a565b905095945050505050565b600081519050613c9e81612c2f565b92915050565b600060208284031215613cba57613cb9612bf9565b5b6000613cc884828501613c8f565b91505092915050565b6000613cdc82612d79565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613d0f57613d0e61352f565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613d5482612d79565b9150613d5f83612d79565b925082613d6f57613d6e613d1a565b5b828204905092915050565b6000613d8582612d79565b9150613d9083612d79565b925082821015613da357613da261352f565b5b828203905092915050565b6000613db982612d79565b9150613dc483612d79565b925082613dd457613dd3613d1a565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea264697066735822122097c46108921fe6ee8f76b552861979c1ab48ed9afc978c3e08c09519ef1c376a64736f6c634300080b0033
Deployed Bytecode
0x60806040526004361061020f5760003560e01c80638da5cb5b11610118578063dfe5dd68116100a0578063e985e9c51161006f578063e985e9c514610745578063f103b43314610782578063f2fde38b146107ab578063f43a22dc146107d4578063fd5e8efe146107ff5761020f565b8063dfe5dd68146106c3578063e222c7f9146106da578063e58306f9146106f1578063e6f6ef1e1461071a5761020f565b8063b88d4fde116100e7578063b88d4fde146105cc578063c002d23d146105f5578063c7381b9514610620578063c87b56dd14610649578063ca5d9cda146106865761020f565b80638da5cb5b146105225780639168e23e1461054d57806395d89b4114610578578063a22cb465146105a35761020f565b806342842e0e1161019b5780636352211e1161016a5780636352211e1461044c5780636957637b146104895780636afcb7b0146104b257806370a08231146104ce578063715018a61461050b5761020f565b806342842e0e1461039457806342966c68146103bd5780635788ff36146103e65780635a23dd991461040f5761020f565b806318160ddd116101e257806318160ddd146102e25780631b004d251461030d57806323b872dd1461032957806332cb6b0c146103525780633ccfd60b1461037d5761020f565b806301ffc9a71461021457806306fdde0314610251578063081812fc1461027c578063095ea7b3146102b9575b600080fd5b34801561022057600080fd5b5061023b60048036038101906102369190612c5b565b61082a565b6040516102489190612ca3565b60405180910390f35b34801561025d57600080fd5b506102666108bc565b6040516102739190612d57565b60405180910390f35b34801561028857600080fd5b506102a3600480360381019061029e9190612daf565b61094e565b6040516102b09190612e1d565b60405180910390f35b3480156102c557600080fd5b506102e060048036038101906102db9190612e64565b6109ca565b005b3480156102ee57600080fd5b506102f7610b71565b6040516103049190612eb3565b60405180910390f35b61032760048036038101906103229190612f73565b610b88565b005b34801561033557600080fd5b50610350600480360381019061034b9190612fd3565b610dfe565b005b34801561035e57600080fd5b50610367610e0e565b6040516103749190612eb3565b60405180910390f35b34801561038957600080fd5b50610392610e14565b005b3480156103a057600080fd5b506103bb60048036038101906103b69190612fd3565b610ed9565b005b3480156103c957600080fd5b506103e460048036038101906103df9190612daf565b610ef9565b005b3480156103f257600080fd5b5061040d60048036038101906104089190612daf565b610f07565b005b34801561041b57600080fd5b5061043660048036038101906104319190613026565b610f8d565b6040516104439190612ca3565b60405180910390f35b34801561045857600080fd5b50610473600480360381019061046e9190612daf565b611011565b6040516104809190612e1d565b60405180910390f35b34801561049557600080fd5b506104b060048036038101906104ab91906130bc565b611023565b005b6104cc60048036038101906104c791906130e9565b6110a9565b005b3480156104da57600080fd5b506104f560048036038101906104f09190613116565b6112a6565b6040516105029190612eb3565b60405180910390f35b34801561051757600080fd5b5061052061135f565b005b34801561052e57600080fd5b506105376113e7565b6040516105449190612e1d565b60405180910390f35b34801561055957600080fd5b50610562611411565b60405161056f9190612ca3565b60405180910390f35b34801561058457600080fd5b5061058d611424565b60405161059a9190612d57565b60405180910390f35b3480156105af57600080fd5b506105ca60048036038101906105c5919061316f565b6114b6565b005b3480156105d857600080fd5b506105f360048036038101906105ee91906132df565b61162e565b005b34801561060157600080fd5b5061060a6116a1565b6040516106179190612eb3565b60405180910390f35b34801561062c57600080fd5b5061064760048036038101906106429190612daf565b6116a7565b005b34801561065557600080fd5b50610670600480360381019061066b9190612daf565b61172d565b60405161067d9190612d57565b60405180910390f35b34801561069257600080fd5b506106ad60048036038101906106a89190613116565b61175e565b6040516106ba9190613371565b60405180910390f35b3480156106cf57600080fd5b506106d8611770565b005b3480156106e657600080fd5b506106ef611818565b005b3480156106fd57600080fd5b5061071860048036038101906107139190612e64565b6118c0565b005b34801561072657600080fd5b5061072f6119a1565b60405161073c9190612ca3565b60405180910390f35b34801561075157600080fd5b5061076c6004803603810190610767919061338c565b6119b4565b6040516107799190612ca3565b60405180910390f35b34801561078e57600080fd5b506107a960048036038101906107a49190612daf565b611a48565b005b3480156107b757600080fd5b506107d260048036038101906107cd9190613116565b611b12565b005b3480156107e057600080fd5b506107e9611c0a565b6040516107f69190612eb3565b60405180910390f35b34801561080b57600080fd5b50610814611c10565b60405161082191906133db565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061088557506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108b55750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546108cb90613425565b80601f01602080910402602001604051908101604052809291908181526020018280546108f790613425565b80156109445780601f1061091957610100808354040283529160200191610944565b820191906000526020600020905b81548152906001019060200180831161092757829003601f168201915b5050505050905090565b600061095982611c16565b61098f576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109d582611c75565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a3d576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a5c611d43565b73ffffffffffffffffffffffffffffffffffffffff1614610abf57610a8881610a83611d43565b6119b4565b610abe576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610b7b611d4b565b6001546000540303905090565b60026009541415610bce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc5906134a3565b60405180910390fd5b60026009819055503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610c0e57600080fd5b600a60019054906101000a900460ff16610c5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c549061350f565b60405180910390fd5b8067ffffffffffffffff16600b54610c75919061355e565b3414610cb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cad90613604565b60405180910390fd5b600c548167ffffffffffffffff16610ccc610b71565b610cd69190613624565b1115610d17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0e906136c6565b60405180910390fd5b610d22338484610f8d565b610d61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5890613732565b60405180910390fd5b6000610d6c33611d54565b905060058282610d7c9190613752565b67ffffffffffffffff161115610dc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbe906137dc565b60405180910390fd5b610ddc338383610dd79190613752565b611da1565b610df0338367ffffffffffffffff16611e57565b506001600981905550505050565b610e09838383611e75565b505050565b600c5481565b610e1c61221f565b73ffffffffffffffffffffffffffffffffffffffff16610e3a6113e7565b73ffffffffffffffffffffffffffffffffffffffff1614610e90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8790613848565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610ed6573d6000803e3d6000fd5b50565b610ef48383836040518060200160405280600081525061162e565b505050565b610f04816001612227565b50565b610f0f61221f565b73ffffffffffffffffffffffffffffffffffffffff16610f2d6113e7565b73ffffffffffffffffffffffffffffffffffffffff1614610f83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7a90613848565b60405180910390fd5b80600b8190555050565b60008084604051602001610fa191906138b0565b604051602081830303815290604052805190602001209050611007848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600e54836124ff565b9150509392505050565b600061101c82611c75565b9050919050565b61102b61221f565b73ffffffffffffffffffffffffffffffffffffffff166110496113e7565b73ffffffffffffffffffffffffffffffffffffffff161461109f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109690613848565b60405180910390fd5b80600e8190555050565b600260095414156110ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e6906134a3565b60405180910390fd5b60026009819055503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461112f57600080fd5b600a60009054906101000a900460ff1661117e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117590613917565b60405180910390fd5b8067ffffffffffffffff16600b54611196919061355e565b34146111d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ce90613604565b60405180910390fd5b600c548167ffffffffffffffff166111ed610b71565b6111f79190613624565b1115611238576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122f906136c6565b60405180910390fd5b600d548167ffffffffffffffff161115611287576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127e906139a9565b60405180910390fd5b61129b338267ffffffffffffffff16611e57565b600160098190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561130e576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61136761221f565b73ffffffffffffffffffffffffffffffffffffffff166113856113e7565b73ffffffffffffffffffffffffffffffffffffffff16146113db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d290613848565b60405180910390fd5b6113e56000612516565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600a60019054906101000a900460ff1681565b60606003805461143390613425565b80601f016020809104026020016040519081016040528092919081815260200182805461145f90613425565b80156114ac5780601f10611481576101008083540402835291602001916114ac565b820191906000526020600020905b81548152906001019060200180831161148f57829003601f168201915b5050505050905090565b6114be611d43565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611523576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611530611d43565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166115dd611d43565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116229190612ca3565b60405180910390a35050565b611639848484611e75565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461169b57611664848484846125dc565b61169a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600b5481565b6116af61221f565b73ffffffffffffffffffffffffffffffffffffffff166116cd6113e7565b73ffffffffffffffffffffffffffffffffffffffff1614611723576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171a90613848565b60405180910390fd5b80600d8190555050565b60606117388261272d565b6040516020016117489190613ac3565b6040516020818303038152906040529050919050565b600061176982611d54565b9050919050565b61177861221f565b73ffffffffffffffffffffffffffffffffffffffff166117966113e7565b73ffffffffffffffffffffffffffffffffffffffff16146117ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e390613848565b60405180910390fd5b600a60019054906101000a900460ff1615600a60016101000a81548160ff021916908315150217905550565b61182061221f565b73ffffffffffffffffffffffffffffffffffffffff1661183e6113e7565b73ffffffffffffffffffffffffffffffffffffffff1614611894576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188b90613848565b60405180910390fd5b600a60009054906101000a900460ff1615600a60006101000a81548160ff021916908315150217905550565b6118c861221f565b73ffffffffffffffffffffffffffffffffffffffff166118e66113e7565b73ffffffffffffffffffffffffffffffffffffffff161461193c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193390613848565b60405180910390fd5b600c5481611948610b71565b6119529190613624565b1115611993576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198a906136c6565b60405180910390fd5b61199d8282611e57565b5050565b600a60009054906101000a900460ff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611a5061221f565b73ffffffffffffffffffffffffffffffffffffffff16611a6e6113e7565b73ffffffffffffffffffffffffffffffffffffffff1614611ac4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abb90613848565b60405180910390fd5b600c548110611b08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aff90613b3c565b60405180910390fd5b80600c8190555050565b611b1a61221f565b73ffffffffffffffffffffffffffffffffffffffff16611b386113e7565b73ffffffffffffffffffffffffffffffffffffffff1614611b8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8590613848565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611bfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf590613bce565b60405180910390fd5b611c0781612516565b50565b600d5481565b600e5481565b600081611c21611d4b565b11158015611c30575060005482105b8015611c6e575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60008082905080611c84611d4b565b11611d0c57600054811015611d0b5760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611d09575b6000811415611cff576004600083600190039350838152602001908152602001600020549050611cd4565b8092505050611d3e565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b60006001905090565b600060c0600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600082905060c081901b77ffffffffffffffffffffffffffffffffffffffffffffffff831617915081600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050505050565b611e7182826040518060200160405280600081525061288e565b5050565b6000611e8082611c75565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611ee7576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611f08611d43565b73ffffffffffffffffffffffffffffffffffffffff161480611f375750611f3685611f31611d43565b6119b4565b5b80611f7c5750611f45611d43565b73ffffffffffffffffffffffffffffffffffffffff16611f648461094e565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611fb5576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561201c576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120298585856001612b43565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b61212686612b49565b1717600460008581526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000831614156121b05760006001840190506000600460008381526020019081526020016000205414156121ae5760005481146121ad578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46122188585856001612b53565b5050505050565b600033905090565b600061223283611c75565b90506000819050821561230f5760008173ffffffffffffffffffffffffffffffffffffffff16612260611d43565b73ffffffffffffffffffffffffffffffffffffffff16148061228f575061228e82612289611d43565b6119b4565b5b806122d4575061229d611d43565b73ffffffffffffffffffffffffffffffffffffffff166122bc8661094e565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061230d576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b61231d816000866001612b43565b6006600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600160806001901b03600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055507c02000000000000000000000000000000000000000000000000000000007c010000000000000000000000000000000000000000000000000000000060a042901b6123f284612b49565b171717600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008316141561247d57600060018501905060006004600083815260200190815260200160002054141561247b57600054811461247a578260046000838152602001908152602001600020819055505b5b505b83600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46124e7816000866001612b53565b60016000815480929190600101919050555050505050565b60008261250c8584612b59565b1490509392505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612602611d43565b8786866040518563ffffffff1660e01b81526004016126249493929190613c43565b6020604051808303816000875af192505050801561266057506040513d601f19601f8201168201806040525081019061265d9190613ca4565b60015b6126da573d8060008114612690576040519150601f19603f3d011682016040523d82523d6000602084013e612695565b606091505b506000815114156126d2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000821415612775576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612889565b600082905060005b600082146127a757808061279090613cd1565b915050600a826127a09190613d49565b915061277d565b60008167ffffffffffffffff8111156127c3576127c26131b4565b5b6040519080825280601f01601f1916602001820160405280156127f55781602001600182028036833780820191505090505b5090505b600085146128825760018261280e9190613d7a565b9150600a8561281d9190613dae565b60306128299190613624565b60f81b81838151811061283f5761283e613ddf565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561287b9190613d49565b94506127f9565b8093505050505b919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156128fb576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831415612936576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6129436000858386612b43565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e16129a860018514612bce565b901b60a042901b6129b886612b49565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14612abc575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612a6c60008784806001019550876125dc565b612aa2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106129fd578260005414612ab757600080fd5b612b27565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612abd575b816000819055505050612b3d6000858386612b53565b50505050565b50505050565b6000819050919050565b50505050565b60008082905060005b8451811015612bc3576000858281518110612b8057612b7f613ddf565b5b60200260200101519050808311612ba257612b9b8382612bd8565b9250612baf565b612bac8184612bd8565b92505b508080612bbb90613cd1565b915050612b62565b508091505092915050565b6000819050919050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612c3881612c03565b8114612c4357600080fd5b50565b600081359050612c5581612c2f565b92915050565b600060208284031215612c7157612c70612bf9565b5b6000612c7f84828501612c46565b91505092915050565b60008115159050919050565b612c9d81612c88565b82525050565b6000602082019050612cb86000830184612c94565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612cf8578082015181840152602081019050612cdd565b83811115612d07576000848401525b50505050565b6000601f19601f8301169050919050565b6000612d2982612cbe565b612d338185612cc9565b9350612d43818560208601612cda565b612d4c81612d0d565b840191505092915050565b60006020820190508181036000830152612d718184612d1e565b905092915050565b6000819050919050565b612d8c81612d79565b8114612d9757600080fd5b50565b600081359050612da981612d83565b92915050565b600060208284031215612dc557612dc4612bf9565b5b6000612dd384828501612d9a565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612e0782612ddc565b9050919050565b612e1781612dfc565b82525050565b6000602082019050612e326000830184612e0e565b92915050565b612e4181612dfc565b8114612e4c57600080fd5b50565b600081359050612e5e81612e38565b92915050565b60008060408385031215612e7b57612e7a612bf9565b5b6000612e8985828601612e4f565b9250506020612e9a85828601612d9a565b9150509250929050565b612ead81612d79565b82525050565b6000602082019050612ec86000830184612ea4565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112612ef357612ef2612ece565b5b8235905067ffffffffffffffff811115612f1057612f0f612ed3565b5b602083019150836020820283011115612f2c57612f2b612ed8565b5b9250929050565b600067ffffffffffffffff82169050919050565b612f5081612f33565b8114612f5b57600080fd5b50565b600081359050612f6d81612f47565b92915050565b600080600060408486031215612f8c57612f8b612bf9565b5b600084013567ffffffffffffffff811115612faa57612fa9612bfe565b5b612fb686828701612edd565b93509350506020612fc986828701612f5e565b9150509250925092565b600080600060608486031215612fec57612feb612bf9565b5b6000612ffa86828701612e4f565b935050602061300b86828701612e4f565b925050604061301c86828701612d9a565b9150509250925092565b60008060006040848603121561303f5761303e612bf9565b5b600061304d86828701612e4f565b935050602084013567ffffffffffffffff81111561306e5761306d612bfe565b5b61307a86828701612edd565b92509250509250925092565b6000819050919050565b61309981613086565b81146130a457600080fd5b50565b6000813590506130b681613090565b92915050565b6000602082840312156130d2576130d1612bf9565b5b60006130e0848285016130a7565b91505092915050565b6000602082840312156130ff576130fe612bf9565b5b600061310d84828501612f5e565b91505092915050565b60006020828403121561312c5761312b612bf9565b5b600061313a84828501612e4f565b91505092915050565b61314c81612c88565b811461315757600080fd5b50565b60008135905061316981613143565b92915050565b6000806040838503121561318657613185612bf9565b5b600061319485828601612e4f565b92505060206131a58582860161315a565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6131ec82612d0d565b810181811067ffffffffffffffff8211171561320b5761320a6131b4565b5b80604052505050565b600061321e612bef565b905061322a82826131e3565b919050565b600067ffffffffffffffff82111561324a576132496131b4565b5b61325382612d0d565b9050602081019050919050565b82818337600083830152505050565b600061328261327d8461322f565b613214565b90508281526020810184848401111561329e5761329d6131af565b5b6132a9848285613260565b509392505050565b600082601f8301126132c6576132c5612ece565b5b81356132d684826020860161326f565b91505092915050565b600080600080608085870312156132f9576132f8612bf9565b5b600061330787828801612e4f565b945050602061331887828801612e4f565b935050604061332987828801612d9a565b925050606085013567ffffffffffffffff81111561334a57613349612bfe565b5b613356878288016132b1565b91505092959194509250565b61336b81612f33565b82525050565b60006020820190506133866000830184613362565b92915050565b600080604083850312156133a3576133a2612bf9565b5b60006133b185828601612e4f565b92505060206133c285828601612e4f565b9150509250929050565b6133d581613086565b82525050565b60006020820190506133f060008301846133cc565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061343d57607f821691505b60208210811415613451576134506133f6565b5b50919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061348d601f83612cc9565b915061349882613457565b602082019050919050565b600060208201905081810360008301526134bc81613480565b9050919050565b7f507269766174652073616c65206973206e6f742072756e6e696e670000000000600082015250565b60006134f9601b83612cc9565b9150613504826134c3565b602082019050919050565b60006020820190508181036000830152613528816134ec565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061356982612d79565b915061357483612d79565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156135ad576135ac61352f565b5b828202905092915050565b7f496e636f7272656374204554482073656e7420746f206d696e74000000000000600082015250565b60006135ee601a83612cc9565b91506135f9826135b8565b602082019050919050565b6000602082019050818103600083015261361d816135e1565b9050919050565b600061362f82612d79565b915061363a83612d79565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561366f5761366e61352f565b5b828201905092915050565b7f4e6f7420656e6f75676820746f6b656e73206c65667420746f206d696e740000600082015250565b60006136b0601e83612cc9565b91506136bb8261367a565b602082019050919050565b600060208201905081810360008301526136df816136a3565b9050919050565b7f496e76616c69642070726f6f6600000000000000000000000000000000000000600082015250565b600061371c600d83612cc9565b9150613727826136e6565b602082019050919050565b6000602082019050818103600083015261374b8161370f565b9050919050565b600061375d82612f33565b915061376883612f33565b92508267ffffffffffffffff038211156137855761378461352f565b5b828201905092915050565b7f43616e277420636c61696d206d6f7265207468616e203520746f74616c000000600082015250565b60006137c6601d83612cc9565b91506137d182613790565b602082019050919050565b600060208201905081810360008301526137f5816137b9565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613832602083612cc9565b915061383d826137fc565b602082019050919050565b6000602082019050818103600083015261386181613825565b9050919050565b60008160601b9050919050565b600061388082613868565b9050919050565b600061389282613875565b9050919050565b6138aa6138a582612dfc565b613887565b82525050565b60006138bc8284613899565b60148201915081905092915050565b7f5075626c69632073616c65206973206e6f742072756e6e696e67000000000000600082015250565b6000613901601a83612cc9565b915061390c826138cb565b602082019050919050565b60006020820190508181036000830152613930816138f4565b9050919050565b7f496e76616c6964206e756d626572206f6620746f6b656e73207175657269657360008201527f20666f72206d696e74696e670000000000000000000000000000000000000000602082015250565b6000613993602c83612cc9565b915061399e82613937565b604082019050919050565b600060208201905081810360008301526139c281613986565b9050919050565b600081905092915050565b7f68747470733a2f2f6d6e742e746865636f6f6c2e636c75622f6d65746164617460008201527f612f000000000000000000000000000000000000000000000000000000000000602082015250565b6000613a306022836139c9565b9150613a3b826139d4565b602282019050919050565b6000613a5182612cbe565b613a5b81856139c9565b9350613a6b818560208601612cda565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000613aad6005836139c9565b9150613ab882613a77565b600582019050919050565b6000613ace82613a23565b9150613ada8284613a46565b9150613ae582613aa0565b915081905092915050565b7f43616e6e6f7420696e63726561736520737570706c7900000000000000000000600082015250565b6000613b26601683612cc9565b9150613b3182613af0565b602082019050919050565b60006020820190508181036000830152613b5581613b19565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613bb8602683612cc9565b9150613bc382613b5c565b604082019050919050565b60006020820190508181036000830152613be781613bab565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613c1582613bee565b613c1f8185613bf9565b9350613c2f818560208601612cda565b613c3881612d0d565b840191505092915050565b6000608082019050613c586000830187612e0e565b613c656020830186612e0e565b613c726040830185612ea4565b8181036060830152613c848184613c0a565b905095945050505050565b600081519050613c9e81612c2f565b92915050565b600060208284031215613cba57613cb9612bf9565b5b6000613cc884828501613c8f565b91505092915050565b6000613cdc82612d79565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613d0f57613d0e61352f565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613d5482612d79565b9150613d5f83612d79565b925082613d6f57613d6e613d1a565b5b828204905092915050565b6000613d8582612d79565b9150613d9083612d79565b925082821015613da357613da261352f565b5b828203905092915050565b6000613db982612d79565b9150613dc483612d79565b925082613dd457613dd3613d1a565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea264697066735822122097c46108921fe6ee8f76b552861979c1ab48ed9afc978c3e08c09519ef1c376a64736f6c634300080b0033
Deployed Bytecode Sourcemap
49414:3594:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24064:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29077:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31145:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30605:474;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23118:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50549:717;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32031:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49651:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52896:109;;;;;;;;;;;;;:::i;:::-;;32272:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51794:80;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52657:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50188:235;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28866:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52351:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51274:512;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24743:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5365:103;;;;;;;;;;;;;:::i;:::-;;4714:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49560:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29246:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31421:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32528:396;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49609:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52771:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49863:205;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50431:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52002:111;;;;;;;;;;;;;:::i;:::-;;51886:108;;;;;;;;;;;;;:::i;:::-;;52121:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49514:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31800:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52474:175;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5623:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49688:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49723;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24064:615;24149:4;24464:10;24449:25;;:11;:25;;;;:102;;;;24541:10;24526:25;;:11;:25;;;;24449:102;:179;;;;24618:10;24603:25;;:11;:25;;;;24449:179;24429:199;;24064:615;;;:::o;29077:100::-;29131:13;29164:5;29157:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29077:100;:::o;31145:204::-;31213:7;31238:16;31246:7;31238;:16::i;:::-;31233:64;;31263:34;;;;;;;;;;;;;;31233:64;31317:15;:24;31333:7;31317:24;;;;;;;;;;;;;;;;;;;;;31310:31;;31145:204;;;:::o;30605:474::-;30678:13;30710:27;30729:7;30710:18;:27::i;:::-;30678:61;;30760:5;30754:11;;:2;:11;;;30750:48;;;30774:24;;;;;;;;;;;;;;30750:48;30838:5;30815:28;;:19;:17;:19::i;:::-;:28;;;30811:175;;30863:44;30880:5;30887:19;:17;:19::i;:::-;30863:16;:44::i;:::-;30858:128;;30935:35;;;;;;;;;;;;;;30858:128;30811:175;31025:2;30998:15;:24;31014:7;30998:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;31063:7;31059:2;31043:28;;31052:5;31043:28;;;;;;;;;;;;30667:412;30605:474;;:::o;23118:315::-;23171:7;23399:15;:13;:15::i;:::-;23384:12;;23368:13;;:28;:46;23361:53;;23118:315;:::o;50549:717::-;1812:1;2410:7;;:19;;2402:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1812:1;2543:7;:18;;;;50686:10:::1;50673:23;;:9;:23;;;50665:32;;;::::0;::::1;;50716:20;;;;;;;;;;;50708:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;50813:9;50800:22;;:10;;:22;;;;:::i;:::-;50787:9;:35;50779:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;50901:10;;50888:9;50872:25;;:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:39;;50864:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;50967:39;50981:10;50993:12;;50967:13;:39::i;:::-;50959:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;51037:18;51058:19;51066:10;51058:7;:19::i;:::-;51037:40;;51123:1;51110:9;51096:11;:23;;;;:::i;:::-;:28;;;;51088:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;51171:44;51179:10;51205:9;51191:11;:23;;;;:::i;:::-;51171:7;:44::i;:::-;51226:32;51236:10;51248:9;51226:32;;:9;:32::i;:::-;50654:612;1768:1:::0;2722:7;:22;;;;50549:717;;;:::o;32031:170::-;32165:28;32175:4;32181:2;32185:7;32165:9;:28::i;:::-;32031:170;;;:::o;49651:30::-;;;;:::o;52896:109::-;4945:12;:10;:12::i;:::-;4934:23;;:7;:5;:7::i;:::-;:23;;;4926:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52954:10:::1;52946:28;;:51;52975:21;52946:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;52896:109::o:0;32272:185::-;32410:39;32427:4;32433:2;32437:7;32410:39;;;;;;;;;;;;:16;:39::i;:::-;32272:185;;;:::o;51794:80::-;51844:22;51850:9;51861:4;51844:5;:22::i;:::-;51794:80;:::o;52657:106::-;4945:12;:10;:12::i;:::-;4934:23;;:7;:5;:7::i;:::-;:23;;;4926:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52745:10:::1;52732;:23;;;;52657:106:::0;:::o;50188:235::-;50280:4;50297:12;50339:5;50322:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;50312:34;;;;;;50297:49;;50364:51;50383:12;;50364:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50397:11;;50410:4;50364:18;:51::i;:::-;50357:58;;;50188:235;;;;;:::o;28866:144::-;28930:7;28973:27;28992:7;28973:18;:27::i;:::-;28950:52;;28866:144;;;:::o;52351:115::-;4945:12;:10;:12::i;:::-;4934:23;;:7;:5;:7::i;:::-;:23;;;4926:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52449:9:::1;52435:11;:23;;;;52351:115:::0;:::o;51274:512::-;1812:1;2410:7;;:19;;2402:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1812:1;2543:7;:18;;;;51374:10:::1;51361:23;;:9;:23;;;51353:32;;;::::0;::::1;;51404:19;;;;;;;;;;;51396:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;51499:9;51486:22;;:10;;:22;;;;:::i;:::-;51473:9;:35;51465:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;51587:10;;51574:9;51558:25;;:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:39;;51550:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;51674:10;;51661:9;:23;;;;51653:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;51746:32;51756:10;51768:9;51746:32;;:9;:32::i;:::-;1768:1:::0;2722:7;:22;;;;51274:512;:::o;24743:224::-;24807:7;24848:1;24831:19;;:5;:19;;;24827:60;;;24859:28;;;;;;;;;;;;;;24827:60;20082:13;24905:18;:25;24924:5;24905:25;;;;;;;;;;;;;;;;:54;24898:61;;24743:224;;;:::o;5365:103::-;4945:12;:10;:12::i;:::-;4934:23;;:7;:5;:7::i;:::-;:23;;;4926:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5430:30:::1;5457:1;5430:18;:30::i;:::-;5365:103::o:0;4714:87::-;4760:7;4787:6;;;;;;;;;;;4780:13;;4714:87;:::o;49560:40::-;;;;;;;;;;;;;:::o;29246:104::-;29302:13;29335:7;29328:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29246:104;:::o;31421:308::-;31532:19;:17;:19::i;:::-;31520:31;;:8;:31;;;31516:61;;;31560:17;;;;;;;;;;;;;;31516:61;31642:8;31590:18;:39;31609:19;:17;:19::i;:::-;31590:39;;;;;;;;;;;;;;;:49;31630:8;31590:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;31702:8;31666:55;;31681:19;:17;:19::i;:::-;31666:55;;;31712:8;31666:55;;;;;;:::i;:::-;;;;;;;;31421:308;;:::o;32528:396::-;32695:28;32705:4;32711:2;32715:7;32695:9;:28::i;:::-;32756:1;32738:2;:14;;;:19;32734:183;;32777:56;32808:4;32814:2;32818:7;32827:5;32777:30;:56::i;:::-;32772:145;;32861:40;;;;;;;;;;;;;;32772:145;32734:183;32528:396;;;;:::o;49609:35::-;;;;:::o;52771:113::-;4945:12;:10;:12::i;:::-;4934:23;;:7;:5;:7::i;:::-;:23;;;4926:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52865:11:::1;52852:10;:24;;;;52771:113:::0;:::o;49863:205::-;49936:13;50031:18;:7;:16;:18::i;:::-;49976:83;;;;;;;;:::i;:::-;;;;;;;;;;;;;49962:98;;49863:205;;;:::o;50431:106::-;50489:6;50515:14;50523:5;50515:7;:14::i;:::-;50508:21;;50431:106;;;:::o;52002:111::-;4945:12;:10;:12::i;:::-;4934:23;;:7;:5;:7::i;:::-;:23;;;4926:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52085:20:::1;;;;;;;;;;;52084:21;52061:20;;:44;;;;;;;;;;;;;;;;;;52002:111::o:0;51886:108::-;4945:12;:10;:12::i;:::-;4934:23;;:7;:5;:7::i;:::-;:23;;;4926:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51967:19:::1;;;;;;;;;;;51966:20;51944:19;;:42;;;;;;;;;;;;;;;;;;51886:108::o:0;52121:222::-;4945:12;:10;:12::i;:::-;4934:23;;:7;:5;:7::i;:::-;:23;;;4926:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52245:10:::1;;52232:9;52216:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:39;;52208:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;52301:34;52311:12;52325:9;52301;:34::i;:::-;52121:222:::0;;:::o;49514:39::-;;;;;;;;;;;;;:::o;31800:164::-;31897:4;31921:18;:25;31940:5;31921:25;;;;;;;;;;;;;;;:35;31947:8;31921:35;;;;;;;;;;;;;;;;;;;;;;;;;31914:42;;31800:164;;;;:::o;52474:175::-;4945:12;:10;:12::i;:::-;4934:23;;:7;:5;:7::i;:::-;:23;;;4926:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52569:10:::1;;52555:11;:24;52547:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;52630:11;52617:10;:24;;;;52474:175:::0;:::o;5623:201::-;4945:12;:10;:12::i;:::-;4934:23;;:7;:5;:7::i;:::-;:23;;;4926:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5732:1:::1;5712:22;;:8;:22;;;;5704:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5788:28;5807:8;5788:18;:28::i;:::-;5623:201:::0;:::o;49688:26::-;;;;:::o;49723:::-;;;;:::o;33179:273::-;33236:4;33292:7;33273:15;:13;:15::i;:::-;:26;;:66;;;;;33326:13;;33316:7;:23;33273:66;:152;;;;;33424:1;20852:8;33377:17;:26;33395:7;33377:26;;;;;;;;;;;;:43;:48;33273:152;33253:172;;33179:273;;;:::o;26381:1129::-;26448:7;26468:12;26483:7;26468:22;;26551:4;26532:15;:13;:15::i;:::-;:23;26528:915;;26585:13;;26578:4;:20;26574:869;;;26623:14;26640:17;:23;26658:4;26640:23;;;;;;;;;;;;26623:40;;26756:1;20852:8;26729:6;:23;:28;26725:699;;;27248:113;27265:1;27255:6;:11;27248:113;;;27308:17;:25;27326:6;;;;;;;27308:25;;;;;;;;;;;;27299:34;;27248:113;;;27394:6;27387:13;;;;;;26725:699;26600:843;26574:869;26528:915;27471:31;;;;;;;;;;;;;;26381:1129;;;;:::o;47161:105::-;47221:7;47248:10;47241:17;;47161:105;:::o;50079:101::-;50144:7;50171:1;50164:8;;50079:101;:::o;25617:136::-;25672:6;20453:3;25705:18;:25;25724:5;25705:25;;;;;;;;;;;;;;;;:39;;25691:54;;25617:136;;;:::o;25941:358::-;26005:14;26022:18;:25;26041:5;26022:25;;;;;;;;;;;;;;;;26005:42;;26058:17;26152:3;26139:16;;20453:3;26222:9;:23;;20597:14;26186:6;:31;26185:61;26176:70;;26285:6;26257:18;:25;26276:5;26257:25;;;;;;;;;;;;;;;:34;;;;25994:305;;25941:358;;:::o;33536:104::-;33605:27;33615:2;33619:8;33605:27;;;;;;;;;;;;:9;:27::i;:::-;33536:104;;:::o;38418:2515::-;38533:27;38563;38582:7;38563:18;:27::i;:::-;38533:57;;38648:4;38607:45;;38623:19;38607:45;;;38603:86;;38661:28;;;;;;;;;;;;;;38603:86;38702:22;38751:4;38728:27;;:19;:17;:19::i;:::-;:27;;;:87;;;;38772:43;38789:4;38795:19;:17;:19::i;:::-;38772:16;:43::i;:::-;38728:87;:147;;;;38856:19;:17;:19::i;:::-;38832:43;;:20;38844:7;38832:11;:20::i;:::-;:43;;;38728:147;38702:174;;38894:17;38889:66;;38920:35;;;;;;;;;;;;;;38889:66;38984:1;38970:16;;:2;:16;;;38966:52;;;38995:23;;;;;;;;;;;;;;38966:52;39031:43;39053:4;39059:2;39063:7;39072:1;39031:21;:43::i;:::-;39147:15;:24;39163:7;39147:24;;;;;;;;;;;;39140:31;;;;;;;;;;;39539:18;:24;39558:4;39539:24;;;;;;;;;;;;;;;;39537:26;;;;;;;;;;;;39608:18;:22;39627:2;39608:22;;;;;;;;;;;;;;;;39606:24;;;;;;;;;;;21134:8;20736:3;39989:15;:41;;39947:21;39965:2;39947:17;:21::i;:::-;:84;:128;39901:17;:26;39919:7;39901:26;;;;;;;;;;;:174;;;;40245:1;21134:8;40195:19;:46;:51;40191:626;;;40267:19;40299:1;40289:7;:11;40267:33;;40456:1;40422:17;:30;40440:11;40422:30;;;;;;;;;;;;:35;40418:384;;;40560:13;;40545:11;:28;40541:242;;40740:19;40707:17;:30;40725:11;40707:30;;;;;;;;;;;:52;;;;40541:242;40418:384;40248:569;40191:626;40864:7;40860:2;40845:27;;40854:4;40845:27;;;;;;;;;;;;40883:42;40904:4;40910:2;40914:7;40923:1;40883:20;:42::i;:::-;38522:2411;;38418:2515;;;:::o;3438:98::-;3491:7;3518:10;3511:17;;3438:98;:::o;41329:2809::-;41409:27;41439;41458:7;41439:18;:27::i;:::-;41409:57;;41479:12;41510:19;41479:52;;41548:13;41544:311;;;41578:22;41627:4;41604:27;;:19;:17;:19::i;:::-;:27;;;:91;;;;41652:43;41669:4;41675:19;:17;:19::i;:::-;41652:16;:43::i;:::-;41604:91;:155;;;;41740:19;:17;:19::i;:::-;41716:43;;:20;41728:7;41716:11;:20::i;:::-;:43;;;41604:155;41578:182;;41782:17;41777:66;;41808:35;;;;;;;;;;;;;;41777:66;41563:292;41544:311;41867:51;41889:4;41903:1;41907:7;41916:1;41867:21;:51::i;:::-;41991:15;:24;42007:7;41991:24;;;;;;;;;;;;41984:31;;;;;;;;;;;42662:1;20345:3;42633:1;:25;;42632:31;42604:18;:24;42623:4;42604:24;;;;;;;;;;;;;;;;:59;;;;;;;;;;;21134:8;20852;20736:3;42991:15;:41;;42947:23;42965:4;42947:17;:23::i;:::-;:86;:120;:165;42901:17;:26;42919:7;42901:26;;;;;;;;;;;:211;;;;43282:1;21134:8;43232:19;:46;:51;43228:626;;;43304:19;43336:1;43326:7;:11;43304:33;;43493:1;43459:17;:30;43477:11;43459:30;;;;;;;;;;;;:35;43455:384;;;43597:13;;43582:11;:28;43578:242;;43777:19;43744:17;:30;43762:11;43744:30;;;;;;;;;;;:52;;;;43578:242;43455:384;43285:569;43228:626;43909:7;43905:1;43882:35;;43891:4;43882:35;;;;;;;;;;;;43928:50;43949:4;43963:1;43967:7;43976:1;43928:20;:50::i;:::-;44105:12;;:14;;;;;;;;;;;;;41398:2740;;41329:2809;;:::o;7402:190::-;7527:4;7580;7551:25;7564:5;7571:4;7551:12;:25::i;:::-;:33;7544:40;;7402:190;;;;;:::o;5984:191::-;6058:16;6077:6;;;;;;;;;;;6058:25;;6103:8;6094:6;;:17;;;;;;;;;;;;;;;;;;6158:8;6127:40;;6148:8;6127:40;;;;;;;;;;;;6047:128;5984:191;:::o;44630:716::-;44793:4;44839:2;44814:45;;;44860:19;:17;:19::i;:::-;44881:4;44887:7;44896:5;44814:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;44810:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45114:1;45097:6;:13;:18;45093:235;;;45143:40;;;;;;;;;;;;;;45093:235;45286:6;45280:13;45271:6;45267:2;45263:15;45256:38;44810:529;44983:54;;;44973:64;;;:6;:64;;;;44966:71;;;44630:716;;;;;;:::o;9232:723::-;9288:13;9518:1;9509:5;:10;9505:53;;;9536:10;;;;;;;;;;;;;;;;;;;;;9505:53;9568:12;9583:5;9568:20;;9599:14;9624:78;9639:1;9631:4;:9;9624:78;;9657:8;;;;;:::i;:::-;;;;9688:2;9680:10;;;;;:::i;:::-;;;9624:78;;;9712:19;9744:6;9734:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9712:39;;9762:154;9778:1;9769:5;:10;9762:154;;9806:1;9796:11;;;;;:::i;:::-;;;9873:2;9865:5;:10;;;;:::i;:::-;9852:2;:24;;;;:::i;:::-;9839:39;;9822:6;9829;9822:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;9902:2;9893:11;;;;;:::i;:::-;;;9762:154;;;9940:6;9926:21;;;;;9232:723;;;;:::o;34013:2236::-;34136:20;34159:13;;34136:36;;34201:1;34187:16;;:2;:16;;;34183:48;;;34212:19;;;;;;;;;;;;;;34183:48;34258:1;34246:8;:13;34242:44;;;34268:18;;;;;;;;;;;;;;34242:44;34299:61;34329:1;34333:2;34337:12;34351:8;34299:21;:61::i;:::-;34903:1;20219:2;34874:1;:25;;34873:31;34861:8;:44;34835:18;:22;34854:2;34835:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;20999:3;35304:29;35331:1;35319:8;:13;35304:14;:29::i;:::-;:56;;20736:3;35241:15;:41;;35199:21;35217:2;35199:17;:21::i;:::-;:84;:162;35148:17;:31;35166:12;35148:31;;;;;;;;;;;:213;;;;35378:20;35401:12;35378:35;;35428:11;35457:8;35442:12;:23;35428:37;;35504:1;35486:2;:14;;;:19;35482:635;;35526:313;35582:12;35578:2;35557:38;;35574:1;35557:38;;;;;;;;;;;;35623:69;35662:1;35666:2;35670:14;;;;;;35686:5;35623:30;:69::i;:::-;35618:174;;35728:40;;;;;;;;;;;;;;35618:174;35834:3;35819:12;:18;35526:313;;35920:12;35903:13;;:29;35899:43;;35934:8;;;35899:43;35482:635;;;35983:119;36039:14;;;;;;36035:2;36014:40;;36031:1;36014:40;;;;;;;;;;;;36097:3;36082:12;:18;35983:119;;35482:635;36147:12;36131:13;:28;;;;34612:1559;;36181:60;36210:1;36214:2;36218:12;36232:8;36181:20;:60::i;:::-;34125:2124;34013:2236;;;:::o;45994:159::-;;;;;:::o;30166:148::-;30230:14;30291:5;30281:15;;30166:148;;;:::o;46812:158::-;;;;;:::o;7953:675::-;8036:7;8056:20;8079:4;8056:27;;8099:9;8094:497;8118:5;:12;8114:1;:16;8094:497;;;8152:20;8175:5;8181:1;8175:8;;;;;;;;:::i;:::-;;;;;;;;8152:31;;8218:12;8202;:28;8198:382;;8345:42;8360:12;8374;8345:14;:42::i;:::-;8330:57;;8198:382;;;8522:42;8537:12;8551;8522:14;:42::i;:::-;8507:57;;8198:382;8137:454;8132:3;;;;;:::i;:::-;;;;8094:497;;;;8608:12;8601:19;;;7953:675;;;;:::o;30401:142::-;30459:14;30520:5;30510:15;;30401:142;;;:::o;8636:224::-;8704:13;8767:1;8761:4;8754:15;8796:1;8790:4;8783:15;8837:4;8831;8821:21;8812:30;;8636:224;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:117::-;5399:1;5396;5389:12;5413:117;5522:1;5519;5512:12;5536:117;5645:1;5642;5635:12;5676:568;5749:8;5759:6;5809:3;5802:4;5794:6;5790:17;5786:27;5776:122;;5817:79;;:::i;:::-;5776:122;5930:6;5917:20;5907:30;;5960:18;5952:6;5949:30;5946:117;;;5982:79;;:::i;:::-;5946:117;6096:4;6088:6;6084:17;6072:29;;6150:3;6142:4;6134:6;6130:17;6120:8;6116:32;6113:41;6110:128;;;6157:79;;:::i;:::-;6110:128;5676:568;;;;;:::o;6250:101::-;6286:7;6326:18;6319:5;6315:30;6304:41;;6250:101;;;:::o;6357:120::-;6429:23;6446:5;6429:23;:::i;:::-;6422:5;6419:34;6409:62;;6467:1;6464;6457:12;6409:62;6357:120;:::o;6483:137::-;6528:5;6566:6;6553:20;6544:29;;6582:32;6608:5;6582:32;:::i;:::-;6483:137;;;;:::o;6626:702::-;6720:6;6728;6736;6785:2;6773:9;6764:7;6760:23;6756:32;6753:119;;;6791:79;;:::i;:::-;6753:119;6939:1;6928:9;6924:17;6911:31;6969:18;6961:6;6958:30;6955:117;;;6991:79;;:::i;:::-;6955:117;7104:80;7176:7;7167:6;7156:9;7152:22;7104:80;:::i;:::-;7086:98;;;;6882:312;7233:2;7259:52;7303:7;7294:6;7283:9;7279:22;7259:52;:::i;:::-;7249:62;;7204:117;6626:702;;;;;:::o;7334:619::-;7411:6;7419;7427;7476:2;7464:9;7455:7;7451:23;7447:32;7444:119;;;7482:79;;:::i;:::-;7444:119;7602:1;7627:53;7672:7;7663:6;7652:9;7648:22;7627:53;:::i;:::-;7617:63;;7573:117;7729:2;7755:53;7800:7;7791:6;7780:9;7776:22;7755:53;:::i;:::-;7745:63;;7700:118;7857:2;7883:53;7928:7;7919:6;7908:9;7904:22;7883:53;:::i;:::-;7873:63;;7828:118;7334:619;;;;;:::o;7959:704::-;8054:6;8062;8070;8119:2;8107:9;8098:7;8094:23;8090:32;8087:119;;;8125:79;;:::i;:::-;8087:119;8245:1;8270:53;8315:7;8306:6;8295:9;8291:22;8270:53;:::i;:::-;8260:63;;8216:117;8400:2;8389:9;8385:18;8372:32;8431:18;8423:6;8420:30;8417:117;;;8453:79;;:::i;:::-;8417:117;8566:80;8638:7;8629:6;8618:9;8614:22;8566:80;:::i;:::-;8548:98;;;;8343:313;7959:704;;;;;:::o;8669:77::-;8706:7;8735:5;8724:16;;8669:77;;;:::o;8752:122::-;8825:24;8843:5;8825:24;:::i;:::-;8818:5;8815:35;8805:63;;8864:1;8861;8854:12;8805:63;8752:122;:::o;8880:139::-;8926:5;8964:6;8951:20;8942:29;;8980:33;9007:5;8980:33;:::i;:::-;8880:139;;;;:::o;9025:329::-;9084:6;9133:2;9121:9;9112:7;9108:23;9104:32;9101:119;;;9139:79;;:::i;:::-;9101:119;9259:1;9284:53;9329:7;9320:6;9309:9;9305:22;9284:53;:::i;:::-;9274:63;;9230:117;9025:329;;;;:::o;9360:327::-;9418:6;9467:2;9455:9;9446:7;9442:23;9438:32;9435:119;;;9473:79;;:::i;:::-;9435:119;9593:1;9618:52;9662:7;9653:6;9642:9;9638:22;9618:52;:::i;:::-;9608:62;;9564:116;9360:327;;;;:::o;9693:329::-;9752:6;9801:2;9789:9;9780:7;9776:23;9772:32;9769:119;;;9807:79;;:::i;:::-;9769:119;9927:1;9952:53;9997:7;9988:6;9977:9;9973:22;9952:53;:::i;:::-;9942:63;;9898:117;9693:329;;;;:::o;10028:116::-;10098:21;10113:5;10098:21;:::i;:::-;10091:5;10088:32;10078:60;;10134:1;10131;10124:12;10078:60;10028:116;:::o;10150:133::-;10193:5;10231:6;10218:20;10209:29;;10247:30;10271:5;10247:30;:::i;:::-;10150:133;;;;:::o;10289:468::-;10354:6;10362;10411:2;10399:9;10390:7;10386:23;10382:32;10379:119;;;10417:79;;:::i;:::-;10379:119;10537:1;10562:53;10607:7;10598:6;10587:9;10583:22;10562:53;:::i;:::-;10552:63;;10508:117;10664:2;10690:50;10732:7;10723:6;10712:9;10708:22;10690:50;:::i;:::-;10680:60;;10635:115;10289:468;;;;;:::o;10763:117::-;10872:1;10869;10862:12;10886:180;10934:77;10931:1;10924:88;11031:4;11028:1;11021:15;11055:4;11052:1;11045:15;11072:281;11155:27;11177:4;11155:27;:::i;:::-;11147:6;11143:40;11285:6;11273:10;11270:22;11249:18;11237:10;11234:34;11231:62;11228:88;;;11296:18;;:::i;:::-;11228:88;11336:10;11332:2;11325:22;11115:238;11072:281;;:::o;11359:129::-;11393:6;11420:20;;:::i;:::-;11410:30;;11449:33;11477:4;11469:6;11449:33;:::i;:::-;11359:129;;;:::o;11494:307::-;11555:4;11645:18;11637:6;11634:30;11631:56;;;11667:18;;:::i;:::-;11631:56;11705:29;11727:6;11705:29;:::i;:::-;11697:37;;11789:4;11783;11779:15;11771:23;;11494:307;;;:::o;11807:154::-;11891:6;11886:3;11881;11868:30;11953:1;11944:6;11939:3;11935:16;11928:27;11807:154;;;:::o;11967:410::-;12044:5;12069:65;12085:48;12126:6;12085:48;:::i;:::-;12069:65;:::i;:::-;12060:74;;12157:6;12150:5;12143:21;12195:4;12188:5;12184:16;12233:3;12224:6;12219:3;12215:16;12212:25;12209:112;;;12240:79;;:::i;:::-;12209:112;12330:41;12364:6;12359:3;12354;12330:41;:::i;:::-;12050:327;11967:410;;;;;:::o;12396:338::-;12451:5;12500:3;12493:4;12485:6;12481:17;12477:27;12467:122;;12508:79;;:::i;:::-;12467:122;12625:6;12612:20;12650:78;12724:3;12716:6;12709:4;12701:6;12697:17;12650:78;:::i;:::-;12641:87;;12457:277;12396:338;;;;:::o;12740:943::-;12835:6;12843;12851;12859;12908:3;12896:9;12887:7;12883:23;12879:33;12876:120;;;12915:79;;:::i;:::-;12876:120;13035:1;13060:53;13105:7;13096:6;13085:9;13081:22;13060:53;:::i;:::-;13050:63;;13006:117;13162:2;13188:53;13233:7;13224:6;13213:9;13209:22;13188:53;:::i;:::-;13178:63;;13133:118;13290:2;13316:53;13361:7;13352:6;13341:9;13337:22;13316:53;:::i;:::-;13306:63;;13261:118;13446:2;13435:9;13431:18;13418:32;13477:18;13469:6;13466:30;13463:117;;;13499:79;;:::i;:::-;13463:117;13604:62;13658:7;13649:6;13638:9;13634:22;13604:62;:::i;:::-;13594:72;;13389:287;12740:943;;;;;;;:::o;13689:115::-;13774:23;13791:5;13774:23;:::i;:::-;13769:3;13762:36;13689:115;;:::o;13810:218::-;13901:4;13939:2;13928:9;13924:18;13916:26;;13952:69;14018:1;14007:9;14003:17;13994:6;13952:69;:::i;:::-;13810:218;;;;:::o;14034:474::-;14102:6;14110;14159:2;14147:9;14138:7;14134:23;14130:32;14127:119;;;14165:79;;:::i;:::-;14127:119;14285:1;14310:53;14355:7;14346:6;14335:9;14331:22;14310:53;:::i;:::-;14300:63;;14256:117;14412:2;14438:53;14483:7;14474:6;14463:9;14459:22;14438:53;:::i;:::-;14428:63;;14383:118;14034:474;;;;;:::o;14514:118::-;14601:24;14619:5;14601:24;:::i;:::-;14596:3;14589:37;14514:118;;:::o;14638:222::-;14731:4;14769:2;14758:9;14754:18;14746:26;;14782:71;14850:1;14839:9;14835:17;14826:6;14782:71;:::i;:::-;14638:222;;;;:::o;14866:180::-;14914:77;14911:1;14904:88;15011:4;15008:1;15001:15;15035:4;15032:1;15025:15;15052:320;15096:6;15133:1;15127:4;15123:12;15113:22;;15180:1;15174:4;15170:12;15201:18;15191:81;;15257:4;15249:6;15245:17;15235:27;;15191:81;15319:2;15311:6;15308:14;15288:18;15285:38;15282:84;;;15338:18;;:::i;:::-;15282:84;15103:269;15052:320;;;:::o;15378:181::-;15518:33;15514:1;15506:6;15502:14;15495:57;15378:181;:::o;15565:366::-;15707:3;15728:67;15792:2;15787:3;15728:67;:::i;:::-;15721:74;;15804:93;15893:3;15804:93;:::i;:::-;15922:2;15917:3;15913:12;15906:19;;15565:366;;;:::o;15937:419::-;16103:4;16141:2;16130:9;16126:18;16118:26;;16190:9;16184:4;16180:20;16176:1;16165:9;16161:17;16154:47;16218:131;16344:4;16218:131;:::i;:::-;16210:139;;15937:419;;;:::o;16362:177::-;16502:29;16498:1;16490:6;16486:14;16479:53;16362:177;:::o;16545:366::-;16687:3;16708:67;16772:2;16767:3;16708:67;:::i;:::-;16701:74;;16784:93;16873:3;16784:93;:::i;:::-;16902:2;16897:3;16893:12;16886:19;;16545:366;;;:::o;16917:419::-;17083:4;17121:2;17110:9;17106:18;17098:26;;17170:9;17164:4;17160:20;17156:1;17145:9;17141:17;17134:47;17198:131;17324:4;17198:131;:::i;:::-;17190:139;;16917:419;;;:::o;17342:180::-;17390:77;17387:1;17380:88;17487:4;17484:1;17477:15;17511:4;17508:1;17501:15;17528:348;17568:7;17591:20;17609:1;17591:20;:::i;:::-;17586:25;;17625:20;17643:1;17625:20;:::i;:::-;17620:25;;17813:1;17745:66;17741:74;17738:1;17735:81;17730:1;17723:9;17716:17;17712:105;17709:131;;;17820:18;;:::i;:::-;17709:131;17868:1;17865;17861:9;17850:20;;17528:348;;;;:::o;17882:176::-;18022:28;18018:1;18010:6;18006:14;17999:52;17882:176;:::o;18064:366::-;18206:3;18227:67;18291:2;18286:3;18227:67;:::i;:::-;18220:74;;18303:93;18392:3;18303:93;:::i;:::-;18421:2;18416:3;18412:12;18405:19;;18064:366;;;:::o;18436:419::-;18602:4;18640:2;18629:9;18625:18;18617:26;;18689:9;18683:4;18679:20;18675:1;18664:9;18660:17;18653:47;18717:131;18843:4;18717:131;:::i;:::-;18709:139;;18436:419;;;:::o;18861:305::-;18901:3;18920:20;18938:1;18920:20;:::i;:::-;18915:25;;18954:20;18972:1;18954:20;:::i;:::-;18949:25;;19108:1;19040:66;19036:74;19033:1;19030:81;19027:107;;;19114:18;;:::i;:::-;19027:107;19158:1;19155;19151:9;19144:16;;18861:305;;;;:::o;19172:180::-;19312:32;19308:1;19300:6;19296:14;19289:56;19172:180;:::o;19358:366::-;19500:3;19521:67;19585:2;19580:3;19521:67;:::i;:::-;19514:74;;19597:93;19686:3;19597:93;:::i;:::-;19715:2;19710:3;19706:12;19699:19;;19358:366;;;:::o;19730:419::-;19896:4;19934:2;19923:9;19919:18;19911:26;;19983:9;19977:4;19973:20;19969:1;19958:9;19954:17;19947:47;20011:131;20137:4;20011:131;:::i;:::-;20003:139;;19730:419;;;:::o;20155:163::-;20295:15;20291:1;20283:6;20279:14;20272:39;20155:163;:::o;20324:366::-;20466:3;20487:67;20551:2;20546:3;20487:67;:::i;:::-;20480:74;;20563:93;20652:3;20563:93;:::i;:::-;20681:2;20676:3;20672:12;20665:19;;20324:366;;;:::o;20696:419::-;20862:4;20900:2;20889:9;20885:18;20877:26;;20949:9;20943:4;20939:20;20935:1;20924:9;20920:17;20913:47;20977:131;21103:4;20977:131;:::i;:::-;20969:139;;20696:419;;;:::o;21121:254::-;21160:3;21179:19;21196:1;21179:19;:::i;:::-;21174:24;;21212:19;21229:1;21212:19;:::i;:::-;21207:24;;21317:1;21297:18;21293:26;21290:1;21287:33;21284:59;;;21323:18;;:::i;:::-;21284:59;21367:1;21364;21360:9;21353:16;;21121:254;;;;:::o;21381:179::-;21521:31;21517:1;21509:6;21505:14;21498:55;21381:179;:::o;21566:366::-;21708:3;21729:67;21793:2;21788:3;21729:67;:::i;:::-;21722:74;;21805:93;21894:3;21805:93;:::i;:::-;21923:2;21918:3;21914:12;21907:19;;21566:366;;;:::o;21938:419::-;22104:4;22142:2;22131:9;22127:18;22119:26;;22191:9;22185:4;22181:20;22177:1;22166:9;22162:17;22155:47;22219:131;22345:4;22219:131;:::i;:::-;22211:139;;21938:419;;;:::o;22363:182::-;22503:34;22499:1;22491:6;22487:14;22480:58;22363:182;:::o;22551:366::-;22693:3;22714:67;22778:2;22773:3;22714:67;:::i;:::-;22707:74;;22790:93;22879:3;22790:93;:::i;:::-;22908:2;22903:3;22899:12;22892:19;;22551:366;;;:::o;22923:419::-;23089:4;23127:2;23116:9;23112:18;23104:26;;23176:9;23170:4;23166:20;23162:1;23151:9;23147:17;23140:47;23204:131;23330:4;23204:131;:::i;:::-;23196:139;;22923:419;;;:::o;23348:94::-;23381:8;23429:5;23425:2;23421:14;23400:35;;23348:94;;;:::o;23448:::-;23487:7;23516:20;23530:5;23516:20;:::i;:::-;23505:31;;23448:94;;;:::o;23548:100::-;23587:7;23616:26;23636:5;23616:26;:::i;:::-;23605:37;;23548:100;;;:::o;23654:157::-;23759:45;23779:24;23797:5;23779:24;:::i;:::-;23759:45;:::i;:::-;23754:3;23747:58;23654:157;;:::o;23817:256::-;23929:3;23944:75;24015:3;24006:6;23944:75;:::i;:::-;24044:2;24039:3;24035:12;24028:19;;24064:3;24057:10;;23817:256;;;;:::o;24079:176::-;24219:28;24215:1;24207:6;24203:14;24196:52;24079:176;:::o;24261:366::-;24403:3;24424:67;24488:2;24483:3;24424:67;:::i;:::-;24417:74;;24500:93;24589:3;24500:93;:::i;:::-;24618:2;24613:3;24609:12;24602:19;;24261:366;;;:::o;24633:419::-;24799:4;24837:2;24826:9;24822:18;24814:26;;24886:9;24880:4;24876:20;24872:1;24861:9;24857:17;24850:47;24914:131;25040:4;24914:131;:::i;:::-;24906:139;;24633:419;;;:::o;25058:231::-;25198:34;25194:1;25186:6;25182:14;25175:58;25267:14;25262:2;25254:6;25250:15;25243:39;25058:231;:::o;25295:366::-;25437:3;25458:67;25522:2;25517:3;25458:67;:::i;:::-;25451:74;;25534:93;25623:3;25534:93;:::i;:::-;25652:2;25647:3;25643:12;25636:19;;25295:366;;;:::o;25667:419::-;25833:4;25871:2;25860:9;25856:18;25848:26;;25920:9;25914:4;25910:20;25906:1;25895:9;25891:17;25884:47;25948:131;26074:4;25948:131;:::i;:::-;25940:139;;25667:419;;;:::o;26092:148::-;26194:11;26231:3;26216:18;;26092:148;;;;:::o;26246:229::-;26386:34;26382:1;26374:6;26370:14;26363:58;26459:4;26454:2;26446:6;26442:15;26435:29;26246:229;:::o;26485:418::-;26645:3;26670:85;26752:2;26747:3;26670:85;:::i;:::-;26663:92;;26768:93;26857:3;26768:93;:::i;:::-;26890:2;26885:3;26881:12;26874:19;;26485:418;;;:::o;26913:397::-;27019:3;27051:39;27084:5;27051:39;:::i;:::-;27110:89;27192:6;27187:3;27110:89;:::i;:::-;27103:96;;27212:52;27257:6;27252:3;27245:4;27238:5;27234:16;27212:52;:::i;:::-;27293:6;27288:3;27284:16;27277:23;;27023:287;26913:397;;;;:::o;27320:163::-;27464:7;27460:1;27452:6;27448:14;27441:31;27320:163;:::o;27493:416::-;27653:3;27678:84;27760:1;27755:3;27678:84;:::i;:::-;27671:91;;27775:93;27864:3;27775:93;:::i;:::-;27897:1;27892:3;27888:11;27881:18;;27493:416;;;:::o;27919:827::-;28253:3;28279:148;28423:3;28279:148;:::i;:::-;28272:155;;28448:95;28539:3;28530:6;28448:95;:::i;:::-;28441:102;;28564:148;28708:3;28564:148;:::i;:::-;28557:155;;28733:3;28726:10;;27919:827;;;;:::o;28756:180::-;28900:24;28896:1;28888:6;28884:14;28877:48;28756:180;:::o;28946:382::-;29088:3;29113:67;29177:2;29172:3;29113:67;:::i;:::-;29106:74;;29193:93;29282:3;29193:93;:::i;:::-;29315:2;29310:3;29306:12;29299:19;;28946:382;;;:::o;29338:435::-;29504:4;29546:2;29535:9;29531:18;29523:26;;29599:9;29593:4;29589:20;29585:1;29574:9;29570:17;29563:47;29631:131;29757:4;29631:131;:::i;:::-;29623:139;;29338:435;;;:::o;29783:237::-;29927:34;29923:1;29915:6;29911:14;29904:58;30000:8;29995:2;29987:6;29983:15;29976:33;29783:237;:::o;30030:382::-;30172:3;30197:67;30261:2;30256:3;30197:67;:::i;:::-;30190:74;;30277:93;30366:3;30277:93;:::i;:::-;30399:2;30394:3;30390:12;30383:19;;30030:382;;;:::o;30422:435::-;30588:4;30630:2;30619:9;30615:18;30607:26;;30683:9;30677:4;30673:20;30669:1;30658:9;30654:17;30647:47;30715:131;30841:4;30715:131;:::i;:::-;30707:139;;30422:435;;;:::o;30867:106::-;30918:6;30956:5;30950:12;30940:22;;30867:106;;;:::o;30983:180::-;31066:11;31104:6;31099:3;31092:19;31148:4;31143:3;31139:14;31124:29;;30983:180;;;;:::o;31173:380::-;31259:3;31291:38;31323:5;31291:38;:::i;:::-;31349:70;31412:6;31407:3;31349:70;:::i;:::-;31342:77;;31432:52;31477:6;31472:3;31465:4;31458:5;31454:16;31432:52;:::i;:::-;31513:29;31535:6;31513:29;:::i;:::-;31508:3;31504:39;31497:46;;31263:290;31173:380;;;;:::o;31563:668::-;31758:4;31800:3;31789:9;31785:19;31777:27;;31818:71;31886:1;31875:9;31871:17;31862:6;31818:71;:::i;:::-;31903:72;31971:2;31960:9;31956:18;31947:6;31903:72;:::i;:::-;31989;32057:2;32046:9;32042:18;32033:6;31989:72;:::i;:::-;32112:9;32106:4;32102:20;32097:2;32086:9;32082:18;32075:48;32144:76;32215:4;32206:6;32144:76;:::i;:::-;32136:84;;31563:668;;;;;;;:::o;32241:153::-;32297:5;32332:6;32326:13;32317:22;;32352:32;32378:5;32352:32;:::i;:::-;32241:153;;;;:::o;32404:373::-;32473:6;32526:2;32514:9;32505:7;32501:23;32497:32;32494:119;;;32532:79;;:::i;:::-;32494:119;32660:1;32689:63;32744:7;32735:6;32724:9;32720:22;32689:63;:::i;:::-;32679:73;;32627:139;32404:373;;;;:::o;32787:249::-;32826:3;32853:24;32871:5;32853:24;:::i;:::-;32844:33;;32903:66;32896:5;32893:77;32890:103;;;32973:18;;:::i;:::-;32890:103;33024:1;33017:5;33013:13;33006:20;;32787:249;;;:::o;33046:196::-;33098:77;33095:1;33088:88;33199:4;33196:1;33189:15;33227:4;33224:1;33217:15;33252:205;33292:1;33313:20;33331:1;33313:20;:::i;:::-;33308:25;;33351:20;33369:1;33351:20;:::i;:::-;33346:25;;33394:1;33384:35;;33399:18;;:::i;:::-;33384:35;33445:1;33442;33438:9;33433:14;;33252:205;;;;:::o;33467:211::-;33507:4;33531:20;33549:1;33531:20;:::i;:::-;33526:25;;33569:20;33587:1;33569:20;:::i;:::-;33564:25;;33612:1;33609;33606:8;33603:34;;;33617:18;;:::i;:::-;33603:34;33666:1;33663;33659:9;33651:17;;33467:211;;;;:::o;33688:196::-;33720:1;33741:20;33759:1;33741:20;:::i;:::-;33736:25;;33779:20;33797:1;33779:20;:::i;:::-;33774:25;;33822:1;33812:35;;33827:18;;:::i;:::-;33812:35;33872:1;33869;33865:9;33860:14;;33688:196;;;;:::o;33894:::-;33946:77;33943:1;33936:88;34047:4;34044:1;34037:15;34075:4;34072:1;34065:15
Swarm Source
ipfs://97c46108921fe6ee8f76b552861979c1ab48ed9afc978c3e08c09519ef1c376a
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.