ERC-721
Overview
Max Total Supply
2,715 TrippinPixelApe
Holders
392
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
6 TrippinPixelApeLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
TrippinPixelApe
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-05-25 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @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: @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: contracts/ERC721A.sol // Creator: Chiru Labs pragma solidity ^0.8.13; error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error ApproveToCaller(); error ApprovalToCurrentOwner(); error BalanceQueryForZeroAddress(); error MintToZeroAddress(); error MintZeroQuantity(); error OwnerQueryForNonexistentToken(); error TransferCallerNotOwnerNorApproved(); error TransferFromIncorrectOwner(); error TransferToNonERC721ReceiverImplementer(); error TransferToZeroAddress(); error URIQueryForNonexistentToken(); /** * @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 Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Compiler will pack this into a single 256bit word. 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; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; // For miscellaneous variable(s) pertaining to the address // (e.g. number of whitelist mint slots used). // If there are multiple variables, please pack them into a uint64. uint64 aux; } // The tokenId of the next token to be minted. uint256 internal _currentIndex; // The number of tokens burned. uint256 internal _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 _ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // 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(); } /** * To change the starting tokenId, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens. */ function totalSupply() public view returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex - _startTokenId() times unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * 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 See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return uint256(_addressData[owner].balance); } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberMinted); } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberBurned); } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return _addressData[owner].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 { _addressData[owner].aux = aux; } /** * 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) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr && curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { if (ownership.addr != address(0)) { return ownership; } // 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. while (true) { curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } } } revert OwnerQueryForNonexistentToken(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return _ownershipOf(tokenId).addr; } /** * @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, tokenId.toString())) : ''; } /** * @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 See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) { revert ApprovalCallerNotOwnerNorApproved(); } _approve(to, tokenId, owner); } /** * @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 == _msgSender()) revert ApproveToCaller(); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), 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.isContract() && !_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 && !_ownerships[tokenId].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 { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (to.isContract()) { 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 { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); 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 { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // 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 { _addressData[from].balance -= 1; _addressData[to].balance += 1; TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = to; currSlot.startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } 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 { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); address from = prevOwnership.addr; if (approvalCheck) { bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // 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 { AddressData storage addressData = _addressData[from]; addressData.balance -= 1; addressData.numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = from; currSlot.startTimestamp = uint64(block.timestamp); currSlot.burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } 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 Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @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 IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == 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 {} } // 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: contracts/TrippinPixelApe.sol pragma solidity ^0.8.13; contract TrippinPixelApe is ERC721A, Ownable { string public baseURI = "https://trippinpixelape.com/metadata/"; uint256 public constant MAX_SUPPLY = 5555; uint256 public MINT_PRICE = 0.004 ether; uint256 public constant MAX_PER_TX = 7; uint256 public constant FREE_AMOUNT = 1000; constructor() ERC721A("TrippinPixelApe", "TrippinPixelApe") { } function tokenURI(uint256 _tokenId) public view override returns (string memory) { require(_exists(_tokenId), "Token does not exist."); return string(abi.encodePacked(baseURI, Strings.toString(_tokenId))); } function setBaseURI(string memory _baseURI) external onlyOwner { baseURI = _baseURI; } function setMintPrice(uint256 _price) external onlyOwner { MINT_PRICE = _price; } function publicMint(uint256 count) external payable { require(totalSupply() + count <= MAX_SUPPLY, "Excedes max supply."); require(count <= MAX_PER_TX, "Exceeds max per transaction."); if (msg.sender != owner() && (totalSupply() > FREE_AMOUNT)) { require(msg.value >= count * MINT_PRICE, "Amount sent less than the cost of minting NFT(s)"); } _safeMint(_msgSender(), count); } function withdrawMoney() external onlyOwner { (bool success, ) = _msgSender().call{value: address(this).balance}(""); require(success, "Transfer failed."); } }
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"},{"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":"FREE_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"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":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","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":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawMoney","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052604051806060016040528060258152602001620036b0602591396009908051906020019062000035929190620001fe565b50660e35fa931a0000600a553480156200004e57600080fd5b506040518060400160405280600f81526020017f5472697070696e506978656c41706500000000000000000000000000000000008152506040518060400160405280600f81526020017f5472697070696e506978656c41706500000000000000000000000000000000008152508160029080519060200190620000d3929190620001fe565b508060039080519060200190620000ec929190620001fe565b50620000fd6200012b60201b60201c565b600081905550505062000125620001196200013060201b60201c565b6200013860201b60201c565b62000312565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200020c90620002dd565b90600052602060002090601f0160209004810192826200023057600085556200027c565b82601f106200024b57805160ff19168380011785556200027c565b828001600101855582156200027c579182015b828111156200027b5782518255916020019190600101906200025e565b5b5090506200028b91906200028f565b5090565b5b80821115620002aa57600081600090555060010162000290565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002f657607f821691505b6020821081036200030c576200030b620002ae565b5b50919050565b61338e80620003226000396000f3fe6080604052600436106101815760003560e01c806370a08231116100d1578063b88d4fde1161008a578063e985e9c511610064578063e985e9c51461054f578063f2fde38b1461058c578063f43a22dc146105b5578063f4a0a528146105e057610181565b8063b88d4fde146104be578063c002d23d146104e7578063c87b56dd1461051257610181565b806370a08231146103d4578063715018a6146104115780638da5cb5b1461042857806395d89b4114610453578063a22cb4651461047e578063ac446002146104a757610181565b806323b872dd1161013e57806342842e0e1161011857806342842e0e1461031a57806355f804b3146103435780636352211e1461036c5780636c0360eb146103a957610181565b806323b872dd146102aa5780632db11544146102d357806332cb6b0c146102ef57610181565b8063017184d91461018657806301ffc9a7146101b157806306fdde03146101ee578063081812fc14610219578063095ea7b31461025657806318160ddd1461027f575b600080fd5b34801561019257600080fd5b5061019b610609565b6040516101a891906124ec565b60405180910390f35b3480156101bd57600080fd5b506101d860048036038101906101d39190612573565b61060f565b6040516101e591906125bb565b60405180910390f35b3480156101fa57600080fd5b506102036106f1565b604051610210919061266f565b60405180910390f35b34801561022557600080fd5b50610240600480360381019061023b91906126bd565b610783565b60405161024d919061272b565b60405180910390f35b34801561026257600080fd5b5061027d60048036038101906102789190612772565b6107ff565b005b34801561028b57600080fd5b50610294610909565b6040516102a191906124ec565b60405180910390f35b3480156102b657600080fd5b506102d160048036038101906102cc91906127b2565b610920565b005b6102ed60048036038101906102e891906126bd565b610930565b005b3480156102fb57600080fd5b50610304610a80565b60405161031191906124ec565b60405180910390f35b34801561032657600080fd5b50610341600480360381019061033c91906127b2565b610a86565b005b34801561034f57600080fd5b5061036a6004803603810190610365919061293a565b610aa6565b005b34801561037857600080fd5b50610393600480360381019061038e91906126bd565b610b3c565b6040516103a0919061272b565b60405180910390f35b3480156103b557600080fd5b506103be610b52565b6040516103cb919061266f565b60405180910390f35b3480156103e057600080fd5b506103fb60048036038101906103f69190612983565b610be0565b60405161040891906124ec565b60405180910390f35b34801561041d57600080fd5b50610426610caf565b005b34801561043457600080fd5b5061043d610d37565b60405161044a919061272b565b60405180910390f35b34801561045f57600080fd5b50610468610d61565b604051610475919061266f565b60405180910390f35b34801561048a57600080fd5b506104a560048036038101906104a091906129dc565b610df3565b005b3480156104b357600080fd5b506104bc610f6a565b005b3480156104ca57600080fd5b506104e560048036038101906104e09190612abd565b61109c565b005b3480156104f357600080fd5b506104fc611118565b60405161050991906124ec565b60405180910390f35b34801561051e57600080fd5b50610539600480360381019061053491906126bd565b61111e565b604051610546919061266f565b60405180910390f35b34801561055b57600080fd5b5061057660048036038101906105719190612b40565b61119a565b60405161058391906125bb565b60405180910390f35b34801561059857600080fd5b506105b360048036038101906105ae9190612983565b61122e565b005b3480156105c157600080fd5b506105ca611325565b6040516105d791906124ec565b60405180910390f35b3480156105ec57600080fd5b50610607600480360381019061060291906126bd565b61132a565b005b6103e881565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106da57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106ea57506106e9826113b0565b5b9050919050565b60606002805461070090612baf565b80601f016020809104026020016040519081016040528092919081815260200182805461072c90612baf565b80156107795780601f1061074e57610100808354040283529160200191610779565b820191906000526020600020905b81548152906001019060200180831161075c57829003601f168201915b5050505050905090565b600061078e8261141a565b6107c4576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061080a82610b3c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610871576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610890611468565b73ffffffffffffffffffffffffffffffffffffffff16141580156108c257506108c0816108bb611468565b61119a565b155b156108f9576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610904838383611470565b505050565b6000610913611522565b6001546000540303905090565b61092b838383611527565b505050565b6115b38161093c610909565b6109469190612c0f565b1115610987576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097e90612cb1565b60405180910390fd5b60078111156109cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c290612d1d565b60405180910390fd5b6109d3610d37565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015610a1657506103e8610a14610909565b115b15610a6c57600a5481610a299190612d3d565b341015610a6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6290612e09565b60405180910390fd5b5b610a7d610a77611468565b826119db565b50565b6115b381565b610aa18383836040518060200160405280600081525061109c565b505050565b610aae611468565b73ffffffffffffffffffffffffffffffffffffffff16610acc610d37565b73ffffffffffffffffffffffffffffffffffffffff1614610b22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1990612e75565b60405180910390fd5b8060099080519060200190610b389291906123ed565b5050565b6000610b47826119f9565b600001519050919050565b60098054610b5f90612baf565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8b90612baf565b8015610bd85780601f10610bad57610100808354040283529160200191610bd8565b820191906000526020600020905b815481529060010190602001808311610bbb57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c47576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610cb7611468565b73ffffffffffffffffffffffffffffffffffffffff16610cd5610d37565b73ffffffffffffffffffffffffffffffffffffffff1614610d2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2290612e75565b60405180910390fd5b610d356000611c88565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610d7090612baf565b80601f0160208091040260200160405190810160405280929190818152602001828054610d9c90612baf565b8015610de95780601f10610dbe57610100808354040283529160200191610de9565b820191906000526020600020905b815481529060010190602001808311610dcc57829003601f168201915b5050505050905090565b610dfb611468565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e5f576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000610e6c611468565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610f19611468565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610f5e91906125bb565b60405180910390a35050565b610f72611468565b73ffffffffffffffffffffffffffffffffffffffff16610f90610d37565b73ffffffffffffffffffffffffffffffffffffffff1614610fe6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fdd90612e75565b60405180910390fd5b6000610ff0611468565b73ffffffffffffffffffffffffffffffffffffffff164760405161101390612ec6565b60006040518083038185875af1925050503d8060008114611050576040519150601f19603f3d011682016040523d82523d6000602084013e611055565b606091505b5050905080611099576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109090612f27565b60405180910390fd5b50565b6110a7848484611527565b6110c68373ffffffffffffffffffffffffffffffffffffffff16611d4e565b80156110db57506110d984848484611d71565b155b15611112576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b600a5481565b60606111298261141a565b611168576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115f90612f93565b60405180910390fd5b600961117383611ec1565b604051602001611184929190613083565b6040516020818303038152906040529050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611236611468565b73ffffffffffffffffffffffffffffffffffffffff16611254610d37565b73ffffffffffffffffffffffffffffffffffffffff16146112aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a190612e75565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611319576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131090613119565b60405180910390fd5b61132281611c88565b50565b600781565b611332611468565b73ffffffffffffffffffffffffffffffffffffffff16611350610d37565b73ffffffffffffffffffffffffffffffffffffffff16146113a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139d90612e75565b60405180910390fd5b80600a8190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081611425611522565b11158015611434575060005482105b8015611461575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b6000611532826119f9565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461159d576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166115be611468565b73ffffffffffffffffffffffffffffffffffffffff1614806115ed57506115ec856115e7611468565b61119a565b5b8061163257506115fb611468565b73ffffffffffffffffffffffffffffffffffffffff1661161a84610783565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061166b576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036116d1576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116de8585856001612021565b6116ea60008487611470565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361196957600054821461196857878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46119d48585856001612027565b5050505050565b6119f582826040518060200160405280600081525061202d565b5050565b611a01612473565b600082905080611a0f611522565b11158015611a1e575060005481105b15611c51576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611c4f57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611b33578092505050611c83565b5b600115611c4e57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611c49578092505050611c83565b611b34565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611d97611468565b8786866040518563ffffffff1660e01b8152600401611db9949392919061318e565b6020604051808303816000875af1925050508015611df557506040513d601f19601f82011682018060405250810190611df291906131ef565b60015b611e6e573d8060008114611e25576040519150601f19603f3d011682016040523d82523d6000602084013e611e2a565b606091505b506000815103611e66576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060008203611f08576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061201c565b600082905060005b60008214611f3a578080611f239061321c565b915050600a82611f339190613293565b9150611f10565b60008167ffffffffffffffff811115611f5657611f5561280f565b5b6040519080825280601f01601f191660200182016040528015611f885781602001600182028036833780820191505090505b5090505b6000851461201557600182611fa191906132c4565b9150600a85611fb091906132f8565b6030611fbc9190612c0f565b60f81b818381518110611fd257611fd1613329565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561200e9190613293565b9450611f8c565b8093505050505b919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612099576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083036120d3576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120e06000858386612021565b82600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600084820190506122a18673ffffffffffffffffffffffffffffffffffffffff16611d4e565b15612366575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123166000878480600101955087611d71565b61234c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082036122a757826000541461236157600080fd5b6123d1565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808203612367575b8160008190555050506123e76000858386612027565b50505050565b8280546123f990612baf565b90600052602060002090601f01602090048101928261241b5760008555612462565b82601f1061243457805160ff1916838001178555612462565b82800160010185558215612462579182015b82811115612461578251825591602001919060010190612446565b5b50905061246f91906124b6565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156124cf5760008160009055506001016124b7565b5090565b6000819050919050565b6124e6816124d3565b82525050565b600060208201905061250160008301846124dd565b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6125508161251b565b811461255b57600080fd5b50565b60008135905061256d81612547565b92915050565b60006020828403121561258957612588612511565b5b60006125978482850161255e565b91505092915050565b60008115159050919050565b6125b5816125a0565b82525050565b60006020820190506125d060008301846125ac565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156126105780820151818401526020810190506125f5565b8381111561261f576000848401525b50505050565b6000601f19601f8301169050919050565b6000612641826125d6565b61264b81856125e1565b935061265b8185602086016125f2565b61266481612625565b840191505092915050565b600060208201905081810360008301526126898184612636565b905092915050565b61269a816124d3565b81146126a557600080fd5b50565b6000813590506126b781612691565b92915050565b6000602082840312156126d3576126d2612511565b5b60006126e1848285016126a8565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612715826126ea565b9050919050565b6127258161270a565b82525050565b6000602082019050612740600083018461271c565b92915050565b61274f8161270a565b811461275a57600080fd5b50565b60008135905061276c81612746565b92915050565b6000806040838503121561278957612788612511565b5b60006127978582860161275d565b92505060206127a8858286016126a8565b9150509250929050565b6000806000606084860312156127cb576127ca612511565b5b60006127d98682870161275d565b93505060206127ea8682870161275d565b92505060406127fb868287016126a8565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61284782612625565b810181811067ffffffffffffffff821117156128665761286561280f565b5b80604052505050565b6000612879612507565b9050612885828261283e565b919050565b600067ffffffffffffffff8211156128a5576128a461280f565b5b6128ae82612625565b9050602081019050919050565b82818337600083830152505050565b60006128dd6128d88461288a565b61286f565b9050828152602081018484840111156128f9576128f861280a565b5b6129048482856128bb565b509392505050565b600082601f83011261292157612920612805565b5b81356129318482602086016128ca565b91505092915050565b6000602082840312156129505761294f612511565b5b600082013567ffffffffffffffff81111561296e5761296d612516565b5b61297a8482850161290c565b91505092915050565b60006020828403121561299957612998612511565b5b60006129a78482850161275d565b91505092915050565b6129b9816125a0565b81146129c457600080fd5b50565b6000813590506129d6816129b0565b92915050565b600080604083850312156129f3576129f2612511565b5b6000612a018582860161275d565b9250506020612a12858286016129c7565b9150509250929050565b600067ffffffffffffffff821115612a3757612a3661280f565b5b612a4082612625565b9050602081019050919050565b6000612a60612a5b84612a1c565b61286f565b905082815260208101848484011115612a7c57612a7b61280a565b5b612a878482856128bb565b509392505050565b600082601f830112612aa457612aa3612805565b5b8135612ab4848260208601612a4d565b91505092915050565b60008060008060808587031215612ad757612ad6612511565b5b6000612ae58782880161275d565b9450506020612af68782880161275d565b9350506040612b07878288016126a8565b925050606085013567ffffffffffffffff811115612b2857612b27612516565b5b612b3487828801612a8f565b91505092959194509250565b60008060408385031215612b5757612b56612511565b5b6000612b658582860161275d565b9250506020612b768582860161275d565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612bc757607f821691505b602082108103612bda57612bd9612b80565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612c1a826124d3565b9150612c25836124d3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612c5a57612c59612be0565b5b828201905092915050565b7f45786365646573206d617820737570706c792e00000000000000000000000000600082015250565b6000612c9b6013836125e1565b9150612ca682612c65565b602082019050919050565b60006020820190508181036000830152612cca81612c8e565b9050919050565b7f45786365656473206d617820706572207472616e73616374696f6e2e00000000600082015250565b6000612d07601c836125e1565b9150612d1282612cd1565b602082019050919050565b60006020820190508181036000830152612d3681612cfa565b9050919050565b6000612d48826124d3565b9150612d53836124d3565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612d8c57612d8b612be0565b5b828202905092915050565b7f416d6f756e742073656e74206c657373207468616e2074686520636f7374206f60008201527f66206d696e74696e67204e465428732900000000000000000000000000000000602082015250565b6000612df36030836125e1565b9150612dfe82612d97565b604082019050919050565b60006020820190508181036000830152612e2281612de6565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612e5f6020836125e1565b9150612e6a82612e29565b602082019050919050565b60006020820190508181036000830152612e8e81612e52565b9050919050565b600081905092915050565b50565b6000612eb0600083612e95565b9150612ebb82612ea0565b600082019050919050565b6000612ed182612ea3565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b6000612f116010836125e1565b9150612f1c82612edb565b602082019050919050565b60006020820190508181036000830152612f4081612f04565b9050919050565b7f546f6b656e20646f6573206e6f742065786973742e0000000000000000000000600082015250565b6000612f7d6015836125e1565b9150612f8882612f47565b602082019050919050565b60006020820190508181036000830152612fac81612f70565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b60008154612fe081612baf565b612fea8186612fb3565b94506001821660008114613005576001811461301657613049565b60ff19831686528186019350613049565b61301f85612fbe565b60005b8381101561304157815481890152600182019150602081019050613022565b838801955050505b50505092915050565b600061305d826125d6565b6130678185612fb3565b93506130778185602086016125f2565b80840191505092915050565b600061308f8285612fd3565b915061309b8284613052565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006131036026836125e1565b915061310e826130a7565b604082019050919050565b60006020820190508181036000830152613132816130f6565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061316082613139565b61316a8185613144565b935061317a8185602086016125f2565b61318381612625565b840191505092915050565b60006080820190506131a3600083018761271c565b6131b0602083018661271c565b6131bd60408301856124dd565b81810360608301526131cf8184613155565b905095945050505050565b6000815190506131e981612547565b92915050565b60006020828403121561320557613204612511565b5b6000613213848285016131da565b91505092915050565b6000613227826124d3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361325957613258612be0565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061329e826124d3565b91506132a9836124d3565b9250826132b9576132b8613264565b5b828204905092915050565b60006132cf826124d3565b91506132da836124d3565b9250828210156132ed576132ec612be0565b5b828203905092915050565b6000613303826124d3565b915061330e836124d3565b92508261331e5761331d613264565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea264697066735822122039bbb48e059dda947ca83f8c6260cdb8aa5141f641cccf71ed2c7771290ab91164736f6c634300080d003368747470733a2f2f7472697070696e706978656c6170652e636f6d2f6d657461646174612f
Deployed Bytecode
0x6080604052600436106101815760003560e01c806370a08231116100d1578063b88d4fde1161008a578063e985e9c511610064578063e985e9c51461054f578063f2fde38b1461058c578063f43a22dc146105b5578063f4a0a528146105e057610181565b8063b88d4fde146104be578063c002d23d146104e7578063c87b56dd1461051257610181565b806370a08231146103d4578063715018a6146104115780638da5cb5b1461042857806395d89b4114610453578063a22cb4651461047e578063ac446002146104a757610181565b806323b872dd1161013e57806342842e0e1161011857806342842e0e1461031a57806355f804b3146103435780636352211e1461036c5780636c0360eb146103a957610181565b806323b872dd146102aa5780632db11544146102d357806332cb6b0c146102ef57610181565b8063017184d91461018657806301ffc9a7146101b157806306fdde03146101ee578063081812fc14610219578063095ea7b31461025657806318160ddd1461027f575b600080fd5b34801561019257600080fd5b5061019b610609565b6040516101a891906124ec565b60405180910390f35b3480156101bd57600080fd5b506101d860048036038101906101d39190612573565b61060f565b6040516101e591906125bb565b60405180910390f35b3480156101fa57600080fd5b506102036106f1565b604051610210919061266f565b60405180910390f35b34801561022557600080fd5b50610240600480360381019061023b91906126bd565b610783565b60405161024d919061272b565b60405180910390f35b34801561026257600080fd5b5061027d60048036038101906102789190612772565b6107ff565b005b34801561028b57600080fd5b50610294610909565b6040516102a191906124ec565b60405180910390f35b3480156102b657600080fd5b506102d160048036038101906102cc91906127b2565b610920565b005b6102ed60048036038101906102e891906126bd565b610930565b005b3480156102fb57600080fd5b50610304610a80565b60405161031191906124ec565b60405180910390f35b34801561032657600080fd5b50610341600480360381019061033c91906127b2565b610a86565b005b34801561034f57600080fd5b5061036a6004803603810190610365919061293a565b610aa6565b005b34801561037857600080fd5b50610393600480360381019061038e91906126bd565b610b3c565b6040516103a0919061272b565b60405180910390f35b3480156103b557600080fd5b506103be610b52565b6040516103cb919061266f565b60405180910390f35b3480156103e057600080fd5b506103fb60048036038101906103f69190612983565b610be0565b60405161040891906124ec565b60405180910390f35b34801561041d57600080fd5b50610426610caf565b005b34801561043457600080fd5b5061043d610d37565b60405161044a919061272b565b60405180910390f35b34801561045f57600080fd5b50610468610d61565b604051610475919061266f565b60405180910390f35b34801561048a57600080fd5b506104a560048036038101906104a091906129dc565b610df3565b005b3480156104b357600080fd5b506104bc610f6a565b005b3480156104ca57600080fd5b506104e560048036038101906104e09190612abd565b61109c565b005b3480156104f357600080fd5b506104fc611118565b60405161050991906124ec565b60405180910390f35b34801561051e57600080fd5b50610539600480360381019061053491906126bd565b61111e565b604051610546919061266f565b60405180910390f35b34801561055b57600080fd5b5061057660048036038101906105719190612b40565b61119a565b60405161058391906125bb565b60405180910390f35b34801561059857600080fd5b506105b360048036038101906105ae9190612983565b61122e565b005b3480156105c157600080fd5b506105ca611325565b6040516105d791906124ec565b60405180910390f35b3480156105ec57600080fd5b50610607600480360381019061060291906126bd565b61132a565b005b6103e881565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106da57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106ea57506106e9826113b0565b5b9050919050565b60606002805461070090612baf565b80601f016020809104026020016040519081016040528092919081815260200182805461072c90612baf565b80156107795780601f1061074e57610100808354040283529160200191610779565b820191906000526020600020905b81548152906001019060200180831161075c57829003601f168201915b5050505050905090565b600061078e8261141a565b6107c4576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061080a82610b3c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610871576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610890611468565b73ffffffffffffffffffffffffffffffffffffffff16141580156108c257506108c0816108bb611468565b61119a565b155b156108f9576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610904838383611470565b505050565b6000610913611522565b6001546000540303905090565b61092b838383611527565b505050565b6115b38161093c610909565b6109469190612c0f565b1115610987576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097e90612cb1565b60405180910390fd5b60078111156109cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c290612d1d565b60405180910390fd5b6109d3610d37565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015610a1657506103e8610a14610909565b115b15610a6c57600a5481610a299190612d3d565b341015610a6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6290612e09565b60405180910390fd5b5b610a7d610a77611468565b826119db565b50565b6115b381565b610aa18383836040518060200160405280600081525061109c565b505050565b610aae611468565b73ffffffffffffffffffffffffffffffffffffffff16610acc610d37565b73ffffffffffffffffffffffffffffffffffffffff1614610b22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1990612e75565b60405180910390fd5b8060099080519060200190610b389291906123ed565b5050565b6000610b47826119f9565b600001519050919050565b60098054610b5f90612baf565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8b90612baf565b8015610bd85780601f10610bad57610100808354040283529160200191610bd8565b820191906000526020600020905b815481529060010190602001808311610bbb57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c47576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610cb7611468565b73ffffffffffffffffffffffffffffffffffffffff16610cd5610d37565b73ffffffffffffffffffffffffffffffffffffffff1614610d2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2290612e75565b60405180910390fd5b610d356000611c88565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610d7090612baf565b80601f0160208091040260200160405190810160405280929190818152602001828054610d9c90612baf565b8015610de95780601f10610dbe57610100808354040283529160200191610de9565b820191906000526020600020905b815481529060010190602001808311610dcc57829003601f168201915b5050505050905090565b610dfb611468565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e5f576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000610e6c611468565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610f19611468565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610f5e91906125bb565b60405180910390a35050565b610f72611468565b73ffffffffffffffffffffffffffffffffffffffff16610f90610d37565b73ffffffffffffffffffffffffffffffffffffffff1614610fe6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fdd90612e75565b60405180910390fd5b6000610ff0611468565b73ffffffffffffffffffffffffffffffffffffffff164760405161101390612ec6565b60006040518083038185875af1925050503d8060008114611050576040519150601f19603f3d011682016040523d82523d6000602084013e611055565b606091505b5050905080611099576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109090612f27565b60405180910390fd5b50565b6110a7848484611527565b6110c68373ffffffffffffffffffffffffffffffffffffffff16611d4e565b80156110db57506110d984848484611d71565b155b15611112576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b600a5481565b60606111298261141a565b611168576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115f90612f93565b60405180910390fd5b600961117383611ec1565b604051602001611184929190613083565b6040516020818303038152906040529050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611236611468565b73ffffffffffffffffffffffffffffffffffffffff16611254610d37565b73ffffffffffffffffffffffffffffffffffffffff16146112aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a190612e75565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611319576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131090613119565b60405180910390fd5b61132281611c88565b50565b600781565b611332611468565b73ffffffffffffffffffffffffffffffffffffffff16611350610d37565b73ffffffffffffffffffffffffffffffffffffffff16146113a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139d90612e75565b60405180910390fd5b80600a8190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081611425611522565b11158015611434575060005482105b8015611461575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b6000611532826119f9565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461159d576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166115be611468565b73ffffffffffffffffffffffffffffffffffffffff1614806115ed57506115ec856115e7611468565b61119a565b5b8061163257506115fb611468565b73ffffffffffffffffffffffffffffffffffffffff1661161a84610783565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061166b576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036116d1576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116de8585856001612021565b6116ea60008487611470565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361196957600054821461196857878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46119d48585856001612027565b5050505050565b6119f582826040518060200160405280600081525061202d565b5050565b611a01612473565b600082905080611a0f611522565b11158015611a1e575060005481105b15611c51576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611c4f57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611b33578092505050611c83565b5b600115611c4e57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611c49578092505050611c83565b611b34565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611d97611468565b8786866040518563ffffffff1660e01b8152600401611db9949392919061318e565b6020604051808303816000875af1925050508015611df557506040513d601f19601f82011682018060405250810190611df291906131ef565b60015b611e6e573d8060008114611e25576040519150601f19603f3d011682016040523d82523d6000602084013e611e2a565b606091505b506000815103611e66576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060008203611f08576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061201c565b600082905060005b60008214611f3a578080611f239061321c565b915050600a82611f339190613293565b9150611f10565b60008167ffffffffffffffff811115611f5657611f5561280f565b5b6040519080825280601f01601f191660200182016040528015611f885781602001600182028036833780820191505090505b5090505b6000851461201557600182611fa191906132c4565b9150600a85611fb091906132f8565b6030611fbc9190612c0f565b60f81b818381518110611fd257611fd1613329565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561200e9190613293565b9450611f8c565b8093505050505b919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612099576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083036120d3576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120e06000858386612021565b82600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600084820190506122a18673ffffffffffffffffffffffffffffffffffffffff16611d4e565b15612366575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123166000878480600101955087611d71565b61234c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082036122a757826000541461236157600080fd5b6123d1565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808203612367575b8160008190555050506123e76000858386612027565b50505050565b8280546123f990612baf565b90600052602060002090601f01602090048101928261241b5760008555612462565b82601f1061243457805160ff1916838001178555612462565b82800160010185558215612462579182015b82811115612461578251825591602001919060010190612446565b5b50905061246f91906124b6565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156124cf5760008160009055506001016124b7565b5090565b6000819050919050565b6124e6816124d3565b82525050565b600060208201905061250160008301846124dd565b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6125508161251b565b811461255b57600080fd5b50565b60008135905061256d81612547565b92915050565b60006020828403121561258957612588612511565b5b60006125978482850161255e565b91505092915050565b60008115159050919050565b6125b5816125a0565b82525050565b60006020820190506125d060008301846125ac565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156126105780820151818401526020810190506125f5565b8381111561261f576000848401525b50505050565b6000601f19601f8301169050919050565b6000612641826125d6565b61264b81856125e1565b935061265b8185602086016125f2565b61266481612625565b840191505092915050565b600060208201905081810360008301526126898184612636565b905092915050565b61269a816124d3565b81146126a557600080fd5b50565b6000813590506126b781612691565b92915050565b6000602082840312156126d3576126d2612511565b5b60006126e1848285016126a8565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612715826126ea565b9050919050565b6127258161270a565b82525050565b6000602082019050612740600083018461271c565b92915050565b61274f8161270a565b811461275a57600080fd5b50565b60008135905061276c81612746565b92915050565b6000806040838503121561278957612788612511565b5b60006127978582860161275d565b92505060206127a8858286016126a8565b9150509250929050565b6000806000606084860312156127cb576127ca612511565b5b60006127d98682870161275d565b93505060206127ea8682870161275d565b92505060406127fb868287016126a8565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61284782612625565b810181811067ffffffffffffffff821117156128665761286561280f565b5b80604052505050565b6000612879612507565b9050612885828261283e565b919050565b600067ffffffffffffffff8211156128a5576128a461280f565b5b6128ae82612625565b9050602081019050919050565b82818337600083830152505050565b60006128dd6128d88461288a565b61286f565b9050828152602081018484840111156128f9576128f861280a565b5b6129048482856128bb565b509392505050565b600082601f83011261292157612920612805565b5b81356129318482602086016128ca565b91505092915050565b6000602082840312156129505761294f612511565b5b600082013567ffffffffffffffff81111561296e5761296d612516565b5b61297a8482850161290c565b91505092915050565b60006020828403121561299957612998612511565b5b60006129a78482850161275d565b91505092915050565b6129b9816125a0565b81146129c457600080fd5b50565b6000813590506129d6816129b0565b92915050565b600080604083850312156129f3576129f2612511565b5b6000612a018582860161275d565b9250506020612a12858286016129c7565b9150509250929050565b600067ffffffffffffffff821115612a3757612a3661280f565b5b612a4082612625565b9050602081019050919050565b6000612a60612a5b84612a1c565b61286f565b905082815260208101848484011115612a7c57612a7b61280a565b5b612a878482856128bb565b509392505050565b600082601f830112612aa457612aa3612805565b5b8135612ab4848260208601612a4d565b91505092915050565b60008060008060808587031215612ad757612ad6612511565b5b6000612ae58782880161275d565b9450506020612af68782880161275d565b9350506040612b07878288016126a8565b925050606085013567ffffffffffffffff811115612b2857612b27612516565b5b612b3487828801612a8f565b91505092959194509250565b60008060408385031215612b5757612b56612511565b5b6000612b658582860161275d565b9250506020612b768582860161275d565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612bc757607f821691505b602082108103612bda57612bd9612b80565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612c1a826124d3565b9150612c25836124d3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612c5a57612c59612be0565b5b828201905092915050565b7f45786365646573206d617820737570706c792e00000000000000000000000000600082015250565b6000612c9b6013836125e1565b9150612ca682612c65565b602082019050919050565b60006020820190508181036000830152612cca81612c8e565b9050919050565b7f45786365656473206d617820706572207472616e73616374696f6e2e00000000600082015250565b6000612d07601c836125e1565b9150612d1282612cd1565b602082019050919050565b60006020820190508181036000830152612d3681612cfa565b9050919050565b6000612d48826124d3565b9150612d53836124d3565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612d8c57612d8b612be0565b5b828202905092915050565b7f416d6f756e742073656e74206c657373207468616e2074686520636f7374206f60008201527f66206d696e74696e67204e465428732900000000000000000000000000000000602082015250565b6000612df36030836125e1565b9150612dfe82612d97565b604082019050919050565b60006020820190508181036000830152612e2281612de6565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612e5f6020836125e1565b9150612e6a82612e29565b602082019050919050565b60006020820190508181036000830152612e8e81612e52565b9050919050565b600081905092915050565b50565b6000612eb0600083612e95565b9150612ebb82612ea0565b600082019050919050565b6000612ed182612ea3565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b6000612f116010836125e1565b9150612f1c82612edb565b602082019050919050565b60006020820190508181036000830152612f4081612f04565b9050919050565b7f546f6b656e20646f6573206e6f742065786973742e0000000000000000000000600082015250565b6000612f7d6015836125e1565b9150612f8882612f47565b602082019050919050565b60006020820190508181036000830152612fac81612f70565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b60008154612fe081612baf565b612fea8186612fb3565b94506001821660008114613005576001811461301657613049565b60ff19831686528186019350613049565b61301f85612fbe565b60005b8381101561304157815481890152600182019150602081019050613022565b838801955050505b50505092915050565b600061305d826125d6565b6130678185612fb3565b93506130778185602086016125f2565b80840191505092915050565b600061308f8285612fd3565b915061309b8284613052565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006131036026836125e1565b915061310e826130a7565b604082019050919050565b60006020820190508181036000830152613132816130f6565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061316082613139565b61316a8185613144565b935061317a8185602086016125f2565b61318381612625565b840191505092915050565b60006080820190506131a3600083018761271c565b6131b0602083018661271c565b6131bd60408301856124dd565b81810360608301526131cf8184613155565b905095945050505050565b6000815190506131e981612547565b92915050565b60006020828403121561320557613204612511565b5b6000613213848285016131da565b91505092915050565b6000613227826124d3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361325957613258612be0565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061329e826124d3565b91506132a9836124d3565b9250826132b9576132b8613264565b5b828204905092915050565b60006132cf826124d3565b91506132da836124d3565b9250828210156132ed576132ec612be0565b5b828203905092915050565b6000613303826124d3565b915061330e836124d3565b92508261331e5761331d613264565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea264697066735822122039bbb48e059dda947ca83f8c6260cdb8aa5141f641cccf71ed2c7771290ab91164736f6c634300080d0033
Deployed Bytecode Sourcemap
45926:1473:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46193:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24506:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27619:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29122:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28685:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23755:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29987:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46769:439;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46054:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30228:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46558:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27427:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45980:63;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24875:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45031:103;;;;;;;;;;;;;:::i;:::-;;44380:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27788:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29398:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47216:180;;;;;;;;;;;;;:::i;:::-;;30484:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46102:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46320:230;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29756:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45289:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46148:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46666:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46193:42;46231:4;46193:42;:::o;24506:305::-;24608:4;24660:25;24645:40;;;:11;:40;;;;:105;;;;24717:33;24702:48;;;:11;:48;;;;24645:105;:158;;;;24767:36;24791:11;24767:23;:36::i;:::-;24645:158;24625:178;;24506:305;;;:::o;27619:100::-;27673:13;27706:5;27699:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27619:100;:::o;29122:204::-;29190:7;29215:16;29223:7;29215;:16::i;:::-;29210:64;;29240:34;;;;;;;;;;;;;;29210:64;29294:15;:24;29310:7;29294:24;;;;;;;;;;;;;;;;;;;;;29287:31;;29122:204;;;:::o;28685:371::-;28758:13;28774:24;28790:7;28774:15;:24::i;:::-;28758:40;;28819:5;28813:11;;:2;:11;;;28809:48;;28833:24;;;;;;;;;;;;;;28809:48;28890:5;28874:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;28900:37;28917:5;28924:12;:10;:12::i;:::-;28900:16;:37::i;:::-;28899:38;28874:63;28870:138;;;28961:35;;;;;;;;;;;;;;28870:138;29020:28;29029:2;29033:7;29042:5;29020:8;:28::i;:::-;28747:309;28685:371;;:::o;23755:303::-;23799:7;24024:15;:13;:15::i;:::-;24009:12;;23993:13;;:28;:46;23986:53;;23755:303;:::o;29987:170::-;30121:28;30131:4;30137:2;30141:7;30121:9;:28::i;:::-;29987:170;;;:::o;46769:439::-;46091:4;46856:5;46840:13;:11;:13::i;:::-;:21;;;;:::i;:::-;:35;;46832:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;46185:1;46918:5;:19;;46910:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;46999:7;:5;:7::i;:::-;46985:21;;:10;:21;;;;:54;;;;;46231:4;47011:13;:11;:13::i;:::-;:27;46985:54;46981:179;;;47085:10;;47077:5;:18;;;;:::i;:::-;47064:9;:31;;47056:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;46981:179;47170:30;47180:12;:10;:12::i;:::-;47194:5;47170:9;:30::i;:::-;46769:439;:::o;46054:41::-;46091:4;46054:41;:::o;30228:185::-;30366:39;30383:4;30389:2;30393:7;30366:39;;;;;;;;;;;;:16;:39::i;:::-;30228:185;;;:::o;46558:100::-;44611:12;:10;:12::i;:::-;44600:23;;:7;:5;:7::i;:::-;:23;;;44592:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46642:8:::1;46632:7;:18;;;;;;;;;;;;:::i;:::-;;46558:100:::0;:::o;27427:125::-;27491:7;27518:21;27531:7;27518:12;:21::i;:::-;:26;;;27511:33;;27427:125;;;:::o;45980:63::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24875:206::-;24939:7;24980:1;24963:19;;:5;:19;;;24959:60;;24991:28;;;;;;;;;;;;;;24959:60;25045:12;:19;25058:5;25045:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;25037:36;;25030:43;;24875:206;;;:::o;45031:103::-;44611:12;:10;:12::i;:::-;44600:23;;:7;:5;:7::i;:::-;:23;;;44592:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45096:30:::1;45123:1;45096:18;:30::i;:::-;45031:103::o:0;44380:87::-;44426:7;44453:6;;;;;;;;;;;44446:13;;44380:87;:::o;27788:104::-;27844:13;27877:7;27870:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27788:104;:::o;29398:287::-;29509:12;:10;:12::i;:::-;29497:24;;:8;:24;;;29493:54;;29530:17;;;;;;;;;;;;;;29493:54;29605:8;29560:18;:32;29579:12;:10;:12::i;:::-;29560:32;;;;;;;;;;;;;;;:42;29593:8;29560:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;29658:8;29629:48;;29644:12;:10;:12::i;:::-;29629:48;;;29668:8;29629:48;;;;;;:::i;:::-;;;;;;;;29398:287;;:::o;47216:180::-;44611:12;:10;:12::i;:::-;44600:23;;:7;:5;:7::i;:::-;:23;;;44592:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47272:12:::1;47290;:10;:12::i;:::-;:17;;47315:21;47290:51;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47271:70;;;47360:7;47352:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;47260:136;47216:180::o:0;30484:369::-;30651:28;30661:4;30667:2;30671:7;30651:9;:28::i;:::-;30694:15;:2;:13;;;:15::i;:::-;:76;;;;;30714:56;30745:4;30751:2;30755:7;30764:5;30714:30;:56::i;:::-;30713:57;30694:76;30690:156;;;30794:40;;;;;;;;;;;;;;30690:156;30484:369;;;;:::o;46102:39::-;;;;:::o;46320:230::-;46386:13;46420:17;46428:8;46420:7;:17::i;:::-;46412:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;46505:7;46514:26;46531:8;46514:16;:26::i;:::-;46488:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46474:68;;46320:230;;;:::o;29756:164::-;29853:4;29877:18;:25;29896:5;29877:25;;;;;;;;;;;;;;;:35;29903:8;29877:35;;;;;;;;;;;;;;;;;;;;;;;;;29870:42;;29756:164;;;;:::o;45289:201::-;44611:12;:10;:12::i;:::-;44600:23;;:7;:5;:7::i;:::-;:23;;;44592:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45398:1:::1;45378:22;;:8;:22;;::::0;45370:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;45454:28;45473:8;45454:18;:28::i;:::-;45289:201:::0;:::o;46148:38::-;46185:1;46148:38;:::o;46666:95::-;44611:12;:10;:12::i;:::-;44600:23;;:7;:5;:7::i;:::-;:23;;;44592:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46747:6:::1;46734:10;:19;;;;46666:95:::0;:::o;13496:157::-;13581:4;13620:25;13605:40;;;:11;:40;;;;13598:47;;13496:157;;;:::o;31108:174::-;31165:4;31208:7;31189:15;:13;:15::i;:::-;:26;;:53;;;;;31229:13;;31219:7;:23;31189:53;:85;;;;;31247:11;:20;31259:7;31247:20;;;;;;;;;;;:27;;;;;;;;;;;;31246:28;31189:85;31182:92;;31108:174;;;:::o;20029:98::-;20082:7;20109:10;20102:17;;20029:98;:::o;40334:196::-;40476:2;40449:15;:24;40465:7;40449:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;40514:7;40510:2;40494:28;;40503:5;40494:28;;;;;;;;;;;;40334:196;;;:::o;23529:92::-;23585:7;23529:92;:::o;35282:2130::-;35397:35;35435:21;35448:7;35435:12;:21::i;:::-;35397:59;;35495:4;35473:26;;:13;:18;;;:26;;;35469:67;;35508:28;;;;;;;;;;;;;;35469:67;35549:22;35591:4;35575:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;35612:36;35629:4;35635:12;:10;:12::i;:::-;35612:16;:36::i;:::-;35575:73;:126;;;;35689:12;:10;:12::i;:::-;35665:36;;:20;35677:7;35665:11;:20::i;:::-;:36;;;35575:126;35549:153;;35720:17;35715:66;;35746:35;;;;;;;;;;;;;;35715:66;35810:1;35796:16;;:2;:16;;;35792:52;;35821:23;;;;;;;;;;;;;;35792:52;35857:43;35879:4;35885:2;35889:7;35898:1;35857:21;:43::i;:::-;35965:35;35982:1;35986:7;35995:4;35965:8;:35::i;:::-;36326:1;36296:12;:18;36309:4;36296:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36370:1;36342:12;:16;36355:2;36342:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36388:31;36422:11;:20;36434:7;36422:20;;;;;;;;;;;36388:54;;36473:2;36457:8;:13;;;:18;;;;;;;;;;;;;;;;;;36523:15;36490:8;:23;;;:49;;;;;;;;;;;;;;;;;;36791:19;36823:1;36813:7;:11;36791:33;;36839:31;36873:11;:24;36885:11;36873:24;;;;;;;;;;;36839:58;;36941:1;36916:27;;:8;:13;;;;;;;;;;;;:27;;;36912:384;;37126:13;;37111:11;:28;37107:174;;37180:4;37164:8;:13;;;:20;;;;;;;;;;;;;;;;;;37233:13;:28;;;37207:8;:23;;;:54;;;;;;;;;;;;;;;;;;37107:174;36912:384;36271:1036;;;37343:7;37339:2;37324:27;;37333:4;37324:27;;;;;;;;;;;;37362:42;37383:4;37389:2;37393:7;37402:1;37362:20;:42::i;:::-;35386:2026;;35282:2130;;;:::o;31366:104::-;31435:27;31445:2;31449:8;31435:27;;;;;;;;;;;;:9;:27::i;:::-;31366:104;;:::o;26256:1109::-;26318:21;;:::i;:::-;26352:12;26367:7;26352:22;;26435:4;26416:15;:13;:15::i;:::-;:23;;:47;;;;;26450:13;;26443:4;:20;26416:47;26412:886;;;26484:31;26518:11;:17;26530:4;26518:17;;;;;;;;;;;26484:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26559:9;:16;;;26554:729;;26630:1;26604:28;;:9;:14;;;:28;;;26600:101;;26668:9;26661:16;;;;;;26600:101;27003:261;27010:4;27003:261;;;27043:6;;;;;;;;27088:11;:17;27100:4;27088:17;;;;;;;;;;;27076:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27162:1;27136:28;;:9;:14;;;:28;;;27132:109;;27204:9;27197:16;;;;;;27132:109;27003:261;;;26554:729;26465:833;26412:886;27326:31;;;;;;;;;;;;;;26256:1109;;;;:::o;45650:191::-;45724:16;45743:6;;;;;;;;;;;45724:25;;45769:8;45760:6;;:17;;;;;;;;;;;;;;;;;;45824:8;45793:40;;45814:8;45793:40;;;;;;;;;;;;45713:128;45650:191;:::o;3390:326::-;3450:4;3707:1;3685:7;:19;;;:23;3678:30;;3390:326;;;:::o;41022:667::-;41185:4;41222:2;41206:36;;;41243:12;:10;:12::i;:::-;41257:4;41263:7;41272:5;41206:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;41202:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41457:1;41440:6;:13;:18;41436:235;;41486:40;;;;;;;;;;;;;;41436:235;41629:6;41623:13;41614:6;41610:2;41606:15;41599:38;41202:480;41335:45;;;41325:55;;;:6;:55;;;;41318:62;;;41022:667;;;;;;:::o;398:723::-;454:13;684:1;675:5;:10;671:53;;702:10;;;;;;;;;;;;;;;;;;;;;671:53;734:12;749:5;734:20;;765:14;790:78;805:1;797:4;:9;790:78;;823:8;;;;;:::i;:::-;;;;854:2;846:10;;;;;:::i;:::-;;;790:78;;;878:19;910:6;900:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;878:39;;928:154;944:1;935:5;:10;928:154;;972:1;962:11;;;;;:::i;:::-;;;1039:2;1031:5;:10;;;;:::i;:::-;1018:2;:24;;;;:::i;:::-;1005:39;;988:6;995;988:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1068:2;1059:11;;;;;:::i;:::-;;;928:154;;;1106:6;1092:21;;;;;398:723;;;;:::o;42337:159::-;;;;;:::o;43155:158::-;;;;;:::o;31844:1751::-;31967:20;31990:13;;31967:36;;32032:1;32018:16;;:2;:16;;;32014:48;;32043:19;;;;;;;;;;;;;;32014:48;32089:1;32077:8;:13;32073:44;;32099:18;;;;;;;;;;;;;;32073:44;32130:61;32160:1;32164:2;32168:12;32182:8;32130:21;:61::i;:::-;32503:8;32468:12;:16;32481:2;32468:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32567:8;32527:12;:16;32540:2;32527:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32626:2;32593:11;:25;32605:12;32593:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;32693:15;32643:11;:25;32655:12;32643:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;32726:20;32749:12;32726:35;;32776:11;32805:8;32790:12;:23;32776:37;;32834:15;:2;:13;;;:15::i;:::-;32830:633;;;32870:314;32926:12;32922:2;32901:38;;32918:1;32901:38;;;;;;;;;;;;32967:69;33006:1;33010:2;33014:14;;;;;;33030:5;32967:30;:69::i;:::-;32962:174;;33072:40;;;;;;;;;;;;;;32962:174;33179:3;33163:12;:19;32870:314;;33265:12;33248:13;;:29;33244:43;;33279:8;;;33244:43;32830:633;;;33328:120;33384:14;;;;;;33380:2;33359:40;;33376:1;33359:40;;;;;;;;;;;;33443:3;33427:12;:19;33328:120;;32830:633;33493:12;33477:13;:28;;;;32443:1074;;33527:60;33556:1;33560:2;33564:12;33578:8;33527:20;:60::i;:::-;31956:1639;31844:1751;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:77:1:-;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;442:75::-;475:6;508:2;502:9;492:19;;442:75;:::o;523:117::-;632:1;629;622:12;646:117;755:1;752;745:12;769:149;805:7;845:66;838:5;834:78;823:89;;769:149;;;:::o;924:120::-;996:23;1013:5;996:23;:::i;:::-;989:5;986:34;976:62;;1034:1;1031;1024:12;976:62;924:120;:::o;1050:137::-;1095:5;1133:6;1120:20;1111:29;;1149:32;1175:5;1149:32;:::i;:::-;1050:137;;;;:::o;1193:327::-;1251:6;1300:2;1288:9;1279:7;1275:23;1271:32;1268:119;;;1306:79;;:::i;:::-;1268:119;1426:1;1451:52;1495:7;1486:6;1475:9;1471:22;1451:52;:::i;:::-;1441:62;;1397:116;1193:327;;;;:::o;1526:90::-;1560:7;1603:5;1596:13;1589:21;1578:32;;1526:90;;;:::o;1622:109::-;1703:21;1718:5;1703:21;:::i;:::-;1698:3;1691:34;1622:109;;:::o;1737:210::-;1824:4;1862:2;1851:9;1847:18;1839:26;;1875:65;1937:1;1926:9;1922:17;1913:6;1875:65;:::i;:::-;1737:210;;;;:::o;1953:99::-;2005:6;2039:5;2033:12;2023:22;;1953:99;;;:::o;2058:169::-;2142:11;2176:6;2171:3;2164:19;2216:4;2211:3;2207:14;2192:29;;2058:169;;;;:::o;2233:307::-;2301:1;2311:113;2325:6;2322:1;2319:13;2311:113;;;2410:1;2405:3;2401:11;2395:18;2391:1;2386:3;2382:11;2375:39;2347:2;2344:1;2340:10;2335:15;;2311:113;;;2442:6;2439:1;2436:13;2433:101;;;2522:1;2513:6;2508:3;2504:16;2497:27;2433:101;2282:258;2233:307;;;:::o;2546:102::-;2587:6;2638:2;2634:7;2629:2;2622:5;2618:14;2614:28;2604:38;;2546:102;;;:::o;2654:364::-;2742:3;2770:39;2803:5;2770:39;:::i;:::-;2825:71;2889:6;2884:3;2825:71;:::i;:::-;2818:78;;2905:52;2950:6;2945:3;2938:4;2931:5;2927:16;2905:52;:::i;:::-;2982:29;3004:6;2982:29;:::i;:::-;2977:3;2973:39;2966:46;;2746:272;2654:364;;;;:::o;3024:313::-;3137:4;3175:2;3164:9;3160:18;3152:26;;3224:9;3218:4;3214:20;3210:1;3199:9;3195:17;3188:47;3252:78;3325:4;3316:6;3252:78;:::i;:::-;3244:86;;3024:313;;;;:::o;3343:122::-;3416:24;3434:5;3416:24;:::i;:::-;3409:5;3406:35;3396:63;;3455:1;3452;3445:12;3396:63;3343:122;:::o;3471:139::-;3517:5;3555:6;3542:20;3533:29;;3571:33;3598:5;3571:33;:::i;:::-;3471:139;;;;:::o;3616:329::-;3675:6;3724:2;3712:9;3703:7;3699:23;3695:32;3692:119;;;3730:79;;:::i;:::-;3692:119;3850:1;3875:53;3920:7;3911:6;3900:9;3896:22;3875:53;:::i;:::-;3865:63;;3821:117;3616:329;;;;:::o;3951:126::-;3988:7;4028:42;4021:5;4017:54;4006:65;;3951:126;;;:::o;4083:96::-;4120:7;4149:24;4167:5;4149:24;:::i;:::-;4138:35;;4083:96;;;:::o;4185:118::-;4272:24;4290:5;4272:24;:::i;:::-;4267:3;4260:37;4185:118;;:::o;4309:222::-;4402:4;4440:2;4429:9;4425:18;4417:26;;4453:71;4521:1;4510:9;4506:17;4497:6;4453:71;:::i;:::-;4309:222;;;;:::o;4537:122::-;4610:24;4628:5;4610:24;:::i;:::-;4603:5;4600:35;4590:63;;4649:1;4646;4639:12;4590:63;4537:122;:::o;4665:139::-;4711:5;4749:6;4736:20;4727:29;;4765:33;4792:5;4765:33;:::i;:::-;4665:139;;;;:::o;4810:474::-;4878:6;4886;4935:2;4923:9;4914:7;4910:23;4906:32;4903:119;;;4941:79;;:::i;:::-;4903:119;5061:1;5086:53;5131:7;5122:6;5111:9;5107:22;5086:53;:::i;:::-;5076:63;;5032:117;5188:2;5214:53;5259:7;5250:6;5239:9;5235:22;5214:53;:::i;:::-;5204:63;;5159:118;4810:474;;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:117::-;6024:1;6021;6014:12;6038:117;6147:1;6144;6137:12;6161:180;6209:77;6206:1;6199:88;6306:4;6303:1;6296:15;6330:4;6327:1;6320:15;6347:281;6430:27;6452:4;6430:27;:::i;:::-;6422:6;6418:40;6560:6;6548:10;6545:22;6524:18;6512:10;6509:34;6506:62;6503:88;;;6571:18;;:::i;:::-;6503:88;6611:10;6607:2;6600:22;6390:238;6347:281;;:::o;6634:129::-;6668:6;6695:20;;:::i;:::-;6685:30;;6724:33;6752:4;6744:6;6724:33;:::i;:::-;6634:129;;;:::o;6769:308::-;6831:4;6921:18;6913:6;6910:30;6907:56;;;6943:18;;:::i;:::-;6907:56;6981:29;7003:6;6981:29;:::i;:::-;6973:37;;7065:4;7059;7055:15;7047:23;;6769:308;;;:::o;7083:154::-;7167:6;7162:3;7157;7144:30;7229:1;7220:6;7215:3;7211:16;7204:27;7083:154;;;:::o;7243:412::-;7321:5;7346:66;7362:49;7404:6;7362:49;:::i;:::-;7346:66;:::i;:::-;7337:75;;7435:6;7428:5;7421:21;7473:4;7466:5;7462:16;7511:3;7502:6;7497:3;7493:16;7490:25;7487:112;;;7518:79;;:::i;:::-;7487:112;7608:41;7642:6;7637:3;7632;7608:41;:::i;:::-;7327:328;7243:412;;;;;:::o;7675:340::-;7731:5;7780:3;7773:4;7765:6;7761:17;7757:27;7747:122;;7788:79;;:::i;:::-;7747:122;7905:6;7892:20;7930:79;8005:3;7997:6;7990:4;7982:6;7978:17;7930:79;:::i;:::-;7921:88;;7737:278;7675:340;;;;:::o;8021:509::-;8090:6;8139:2;8127:9;8118:7;8114:23;8110:32;8107:119;;;8145:79;;:::i;:::-;8107:119;8293:1;8282:9;8278:17;8265:31;8323:18;8315:6;8312:30;8309:117;;;8345:79;;:::i;:::-;8309:117;8450:63;8505:7;8496:6;8485:9;8481:22;8450:63;:::i;:::-;8440:73;;8236:287;8021:509;;;;:::o;8536:329::-;8595:6;8644:2;8632:9;8623:7;8619:23;8615:32;8612:119;;;8650:79;;:::i;:::-;8612:119;8770:1;8795:53;8840:7;8831:6;8820:9;8816:22;8795:53;:::i;:::-;8785:63;;8741:117;8536:329;;;;:::o;8871:116::-;8941:21;8956:5;8941:21;:::i;:::-;8934:5;8931:32;8921:60;;8977:1;8974;8967:12;8921:60;8871:116;:::o;8993:133::-;9036:5;9074:6;9061:20;9052:29;;9090:30;9114:5;9090:30;:::i;:::-;8993:133;;;;:::o;9132:468::-;9197:6;9205;9254:2;9242:9;9233:7;9229:23;9225:32;9222:119;;;9260:79;;:::i;:::-;9222:119;9380:1;9405:53;9450:7;9441:6;9430:9;9426:22;9405:53;:::i;:::-;9395:63;;9351:117;9507:2;9533:50;9575:7;9566:6;9555:9;9551:22;9533:50;:::i;:::-;9523:60;;9478:115;9132:468;;;;;:::o;9606:307::-;9667:4;9757:18;9749:6;9746:30;9743:56;;;9779:18;;:::i;:::-;9743:56;9817:29;9839:6;9817:29;:::i;:::-;9809:37;;9901:4;9895;9891:15;9883:23;;9606:307;;;:::o;9919:410::-;9996:5;10021:65;10037:48;10078:6;10037:48;:::i;:::-;10021:65;:::i;:::-;10012:74;;10109:6;10102:5;10095:21;10147:4;10140:5;10136:16;10185:3;10176:6;10171:3;10167:16;10164:25;10161:112;;;10192:79;;:::i;:::-;10161:112;10282:41;10316:6;10311:3;10306;10282:41;:::i;:::-;10002:327;9919:410;;;;;:::o;10348:338::-;10403:5;10452:3;10445:4;10437:6;10433:17;10429:27;10419:122;;10460:79;;:::i;:::-;10419:122;10577:6;10564:20;10602:78;10676:3;10668:6;10661:4;10653:6;10649:17;10602:78;:::i;:::-;10593:87;;10409:277;10348:338;;;;:::o;10692:943::-;10787:6;10795;10803;10811;10860:3;10848:9;10839:7;10835:23;10831:33;10828:120;;;10867:79;;:::i;:::-;10828:120;10987:1;11012:53;11057:7;11048:6;11037:9;11033:22;11012:53;:::i;:::-;11002:63;;10958:117;11114:2;11140:53;11185:7;11176:6;11165:9;11161:22;11140:53;:::i;:::-;11130:63;;11085:118;11242:2;11268:53;11313:7;11304:6;11293:9;11289:22;11268:53;:::i;:::-;11258:63;;11213:118;11398:2;11387:9;11383:18;11370:32;11429:18;11421:6;11418:30;11415:117;;;11451:79;;:::i;:::-;11415:117;11556:62;11610:7;11601:6;11590:9;11586:22;11556:62;:::i;:::-;11546:72;;11341:287;10692:943;;;;;;;:::o;11641:474::-;11709:6;11717;11766:2;11754:9;11745:7;11741:23;11737:32;11734:119;;;11772:79;;:::i;:::-;11734:119;11892:1;11917:53;11962:7;11953:6;11942:9;11938:22;11917:53;:::i;:::-;11907:63;;11863:117;12019:2;12045:53;12090:7;12081:6;12070:9;12066:22;12045:53;:::i;:::-;12035:63;;11990:118;11641:474;;;;;:::o;12121:180::-;12169:77;12166:1;12159:88;12266:4;12263:1;12256:15;12290:4;12287:1;12280:15;12307:320;12351:6;12388:1;12382:4;12378:12;12368:22;;12435:1;12429:4;12425:12;12456:18;12446:81;;12512:4;12504:6;12500:17;12490:27;;12446:81;12574:2;12566:6;12563:14;12543:18;12540:38;12537:84;;12593:18;;:::i;:::-;12537:84;12358:269;12307:320;;;:::o;12633:180::-;12681:77;12678:1;12671:88;12778:4;12775:1;12768:15;12802:4;12799:1;12792:15;12819:305;12859:3;12878:20;12896:1;12878:20;:::i;:::-;12873:25;;12912:20;12930:1;12912:20;:::i;:::-;12907:25;;13066:1;12998:66;12994:74;12991:1;12988:81;12985:107;;;13072:18;;:::i;:::-;12985:107;13116:1;13113;13109:9;13102:16;;12819:305;;;;:::o;13130:169::-;13270:21;13266:1;13258:6;13254:14;13247:45;13130:169;:::o;13305:366::-;13447:3;13468:67;13532:2;13527:3;13468:67;:::i;:::-;13461:74;;13544:93;13633:3;13544:93;:::i;:::-;13662:2;13657:3;13653:12;13646:19;;13305:366;;;:::o;13677:419::-;13843:4;13881:2;13870:9;13866:18;13858:26;;13930:9;13924:4;13920:20;13916:1;13905:9;13901:17;13894:47;13958:131;14084:4;13958:131;:::i;:::-;13950:139;;13677:419;;;:::o;14102:178::-;14242:30;14238:1;14230:6;14226:14;14219:54;14102:178;:::o;14286:366::-;14428:3;14449:67;14513:2;14508:3;14449:67;:::i;:::-;14442:74;;14525:93;14614:3;14525:93;:::i;:::-;14643:2;14638:3;14634:12;14627:19;;14286:366;;;:::o;14658:419::-;14824:4;14862:2;14851:9;14847:18;14839:26;;14911:9;14905:4;14901:20;14897:1;14886:9;14882:17;14875:47;14939:131;15065:4;14939:131;:::i;:::-;14931:139;;14658:419;;;:::o;15083:348::-;15123:7;15146:20;15164:1;15146:20;:::i;:::-;15141:25;;15180:20;15198:1;15180:20;:::i;:::-;15175:25;;15368:1;15300:66;15296:74;15293:1;15290:81;15285:1;15278:9;15271:17;15267:105;15264:131;;;15375:18;;:::i;:::-;15264:131;15423:1;15420;15416:9;15405:20;;15083:348;;;;:::o;15437:235::-;15577:34;15573:1;15565:6;15561:14;15554:58;15646:18;15641:2;15633:6;15629:15;15622:43;15437:235;:::o;15678:366::-;15820:3;15841:67;15905:2;15900:3;15841:67;:::i;:::-;15834:74;;15917:93;16006:3;15917:93;:::i;:::-;16035:2;16030:3;16026:12;16019:19;;15678:366;;;:::o;16050:419::-;16216:4;16254:2;16243:9;16239:18;16231:26;;16303:9;16297:4;16293:20;16289:1;16278:9;16274:17;16267:47;16331:131;16457:4;16331:131;:::i;:::-;16323:139;;16050:419;;;:::o;16475:182::-;16615:34;16611:1;16603:6;16599:14;16592:58;16475:182;:::o;16663:366::-;16805:3;16826:67;16890:2;16885:3;16826:67;:::i;:::-;16819:74;;16902:93;16991:3;16902:93;:::i;:::-;17020:2;17015:3;17011:12;17004:19;;16663:366;;;:::o;17035:419::-;17201:4;17239:2;17228:9;17224:18;17216:26;;17288:9;17282:4;17278:20;17274:1;17263:9;17259:17;17252:47;17316:131;17442:4;17316:131;:::i;:::-;17308:139;;17035:419;;;:::o;17460:147::-;17561:11;17598:3;17583:18;;17460:147;;;;:::o;17613:114::-;;:::o;17733:398::-;17892:3;17913:83;17994:1;17989:3;17913:83;:::i;:::-;17906:90;;18005:93;18094:3;18005:93;:::i;:::-;18123:1;18118:3;18114:11;18107:18;;17733:398;;;:::o;18137:379::-;18321:3;18343:147;18486:3;18343:147;:::i;:::-;18336:154;;18507:3;18500:10;;18137:379;;;:::o;18522:166::-;18662:18;18658:1;18650:6;18646:14;18639:42;18522:166;:::o;18694:366::-;18836:3;18857:67;18921:2;18916:3;18857:67;:::i;:::-;18850:74;;18933:93;19022:3;18933:93;:::i;:::-;19051:2;19046:3;19042:12;19035:19;;18694:366;;;:::o;19066:419::-;19232:4;19270:2;19259:9;19255:18;19247:26;;19319:9;19313:4;19309:20;19305:1;19294:9;19290:17;19283:47;19347:131;19473:4;19347:131;:::i;:::-;19339:139;;19066:419;;;:::o;19491:171::-;19631:23;19627:1;19619:6;19615:14;19608:47;19491:171;:::o;19668:366::-;19810:3;19831:67;19895:2;19890:3;19831:67;:::i;:::-;19824:74;;19907:93;19996:3;19907:93;:::i;:::-;20025:2;20020:3;20016:12;20009:19;;19668:366;;;:::o;20040:419::-;20206:4;20244:2;20233:9;20229:18;20221:26;;20293:9;20287:4;20283:20;20279:1;20268:9;20264:17;20257:47;20321:131;20447:4;20321:131;:::i;:::-;20313:139;;20040:419;;;:::o;20465:148::-;20567:11;20604:3;20589:18;;20465:148;;;;:::o;20619:141::-;20668:4;20691:3;20683:11;;20714:3;20711:1;20704:14;20748:4;20745:1;20735:18;20727:26;;20619:141;;;:::o;20790:845::-;20893:3;20930:5;20924:12;20959:36;20985:9;20959:36;:::i;:::-;21011:89;21093:6;21088:3;21011:89;:::i;:::-;21004:96;;21131:1;21120:9;21116:17;21147:1;21142:137;;;;21293:1;21288:341;;;;21109:520;;21142:137;21226:4;21222:9;21211;21207:25;21202:3;21195:38;21262:6;21257:3;21253:16;21246:23;;21142:137;;21288:341;21355:38;21387:5;21355:38;:::i;:::-;21415:1;21429:154;21443:6;21440:1;21437:13;21429:154;;;21517:7;21511:14;21507:1;21502:3;21498:11;21491:35;21567:1;21558:7;21554:15;21543:26;;21465:4;21462:1;21458:12;21453:17;;21429:154;;;21612:6;21607:3;21603:16;21596:23;;21295:334;;21109:520;;20897:738;;20790:845;;;;:::o;21641:377::-;21747:3;21775:39;21808:5;21775:39;:::i;:::-;21830:89;21912:6;21907:3;21830:89;:::i;:::-;21823:96;;21928:52;21973:6;21968:3;21961:4;21954:5;21950:16;21928:52;:::i;:::-;22005:6;22000:3;21996:16;21989:23;;21751:267;21641:377;;;;:::o;22024:429::-;22201:3;22223:92;22311:3;22302:6;22223:92;:::i;:::-;22216:99;;22332:95;22423:3;22414:6;22332:95;:::i;:::-;22325:102;;22444:3;22437:10;;22024:429;;;;;:::o;22459:225::-;22599:34;22595:1;22587:6;22583:14;22576:58;22668:8;22663:2;22655:6;22651:15;22644:33;22459:225;:::o;22690:366::-;22832:3;22853:67;22917:2;22912:3;22853:67;:::i;:::-;22846:74;;22929:93;23018:3;22929:93;:::i;:::-;23047:2;23042:3;23038:12;23031:19;;22690:366;;;:::o;23062:419::-;23228:4;23266:2;23255:9;23251:18;23243:26;;23315:9;23309:4;23305:20;23301:1;23290:9;23286:17;23279:47;23343:131;23469:4;23343:131;:::i;:::-;23335:139;;23062:419;;;:::o;23487:98::-;23538:6;23572:5;23566:12;23556:22;;23487:98;;;:::o;23591:168::-;23674:11;23708:6;23703:3;23696:19;23748:4;23743:3;23739:14;23724:29;;23591:168;;;;:::o;23765:360::-;23851:3;23879:38;23911:5;23879:38;:::i;:::-;23933:70;23996:6;23991:3;23933:70;:::i;:::-;23926:77;;24012:52;24057:6;24052:3;24045:4;24038:5;24034:16;24012:52;:::i;:::-;24089:29;24111:6;24089:29;:::i;:::-;24084:3;24080:39;24073:46;;23855:270;23765:360;;;;:::o;24131:640::-;24326:4;24364:3;24353:9;24349:19;24341:27;;24378:71;24446:1;24435:9;24431:17;24422:6;24378:71;:::i;:::-;24459:72;24527:2;24516:9;24512:18;24503:6;24459:72;:::i;:::-;24541;24609:2;24598:9;24594:18;24585:6;24541:72;:::i;:::-;24660:9;24654:4;24650:20;24645:2;24634:9;24630:18;24623:48;24688:76;24759:4;24750:6;24688:76;:::i;:::-;24680:84;;24131:640;;;;;;;:::o;24777:141::-;24833:5;24864:6;24858:13;24849:22;;24880:32;24906:5;24880:32;:::i;:::-;24777:141;;;;:::o;24924:349::-;24993:6;25042:2;25030:9;25021:7;25017:23;25013:32;25010:119;;;25048:79;;:::i;:::-;25010:119;25168:1;25193:63;25248:7;25239:6;25228:9;25224:22;25193:63;:::i;:::-;25183:73;;25139:127;24924:349;;;;:::o;25279:233::-;25318:3;25341:24;25359:5;25341:24;:::i;:::-;25332:33;;25387:66;25380:5;25377:77;25374:103;;25457:18;;:::i;:::-;25374:103;25504:1;25497:5;25493:13;25486:20;;25279:233;;;:::o;25518:180::-;25566:77;25563:1;25556:88;25663:4;25660:1;25653:15;25687:4;25684:1;25677:15;25704:185;25744:1;25761:20;25779:1;25761:20;:::i;:::-;25756:25;;25795:20;25813:1;25795:20;:::i;:::-;25790:25;;25834:1;25824:35;;25839:18;;:::i;:::-;25824:35;25881:1;25878;25874:9;25869:14;;25704:185;;;;:::o;25895:191::-;25935:4;25955:20;25973:1;25955:20;:::i;:::-;25950:25;;25989:20;26007:1;25989:20;:::i;:::-;25984:25;;26028:1;26025;26022:8;26019:34;;;26033:18;;:::i;:::-;26019:34;26078:1;26075;26071:9;26063:17;;25895:191;;;;:::o;26092:176::-;26124:1;26141:20;26159:1;26141:20;:::i;:::-;26136:25;;26175:20;26193:1;26175:20;:::i;:::-;26170:25;;26214:1;26204:35;;26219:18;;:::i;:::-;26204:35;26260:1;26257;26253:9;26248:14;;26092:176;;;;:::o;26274:180::-;26322:77;26319:1;26312:88;26419:4;26416:1;26409:15;26443:4;26440:1;26433:15
Swarm Source
ipfs://39bbb48e059dda947ca83f8c6260cdb8aa5141f641cccf71ed2c7771290ab911
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.