Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
4,928 XDMP
Holders
2,124
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 XDMPLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
XDAOMintPass
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-04-15 */ // Sources flattened with hardhat v2.9.1 https://hardhat.org // File @openzeppelin/contracts/utils/introspection/[email protected] // 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/token/ERC721/[email protected] // OpenZeppelin Contracts v4.4.1 (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`, 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 Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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 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); /** * @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; } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts v4.4.1 (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 `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // 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/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @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 * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 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/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/utils/[email protected] // 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/introspection/[email protected] // 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 erc721a/contracts/[email protected] // Creator: Chiru Labs pragma solidity ^0.8.4; 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; } 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 { _mint(to, quantity, _data, true); } /** * @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, bytes memory _data, bool safe ) 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 (safe && 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 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 This is 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/[email protected] // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File @openzeppelin/contracts/security/[email protected] // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File base64-sol/[email protected] pragma solidity >=0.6.0; /// @title Base64 /// @author Brecht Devos - <[email protected]> /// @notice Provides functions for encoding/decoding base64 library Base64 { string internal constant TABLE_ENCODE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; bytes internal constant TABLE_DECODE = hex"0000000000000000000000000000000000000000000000000000000000000000" hex"00000000000000000000003e0000003f3435363738393a3b3c3d000000000000" hex"00000102030405060708090a0b0c0d0e0f101112131415161718190000000000" hex"001a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132330000000000"; function encode(bytes memory data) internal pure returns (string memory) { if (data.length == 0) return ''; // load the table into memory string memory table = TABLE_ENCODE; // multiply by 4/3 rounded up uint256 encodedLen = 4 * ((data.length + 2) / 3); // add some extra buffer at the end required for the writing string memory result = new string(encodedLen + 32); assembly { // set the actual output length mstore(result, encodedLen) // prepare the lookup table let tablePtr := add(table, 1) // input ptr let dataPtr := data let endPtr := add(dataPtr, mload(data)) // result ptr, jump over length let resultPtr := add(result, 32) // run over the input, 3 bytes at a time for {} lt(dataPtr, endPtr) {} { // read 3 bytes dataPtr := add(dataPtr, 3) let input := mload(dataPtr) // write 4 characters mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F)))) resultPtr := add(resultPtr, 1) mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F)))) resultPtr := add(resultPtr, 1) mstore8(resultPtr, mload(add(tablePtr, and(shr( 6, input), 0x3F)))) resultPtr := add(resultPtr, 1) mstore8(resultPtr, mload(add(tablePtr, and( input, 0x3F)))) resultPtr := add(resultPtr, 1) } // padding with '=' switch mod(mload(data), 3) case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) } case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) } } return result; } function decode(string memory _data) internal pure returns (bytes memory) { bytes memory data = bytes(_data); if (data.length == 0) return new bytes(0); require(data.length % 4 == 0, "invalid base64 decoder input"); // load the table into memory bytes memory table = TABLE_DECODE; // every 4 characters represent 3 bytes uint256 decodedLen = (data.length / 4) * 3; // add some extra buffer at the end required for the writing bytes memory result = new bytes(decodedLen + 32); assembly { // padding with '=' let lastBytes := mload(add(data, mload(data))) if eq(and(lastBytes, 0xFF), 0x3d) { decodedLen := sub(decodedLen, 1) if eq(and(lastBytes, 0xFFFF), 0x3d3d) { decodedLen := sub(decodedLen, 1) } } // set the actual output length mstore(result, decodedLen) // prepare the lookup table let tablePtr := add(table, 1) // input ptr let dataPtr := data let endPtr := add(dataPtr, mload(data)) // result ptr, jump over length let resultPtr := add(result, 32) // run over the input, 4 characters at a time for {} lt(dataPtr, endPtr) {} { // read 4 characters dataPtr := add(dataPtr, 4) let input := mload(dataPtr) // write 3 bytes let output := add( add( shl(18, and(mload(add(tablePtr, and(shr(24, input), 0xFF))), 0xFF)), shl(12, and(mload(add(tablePtr, and(shr(16, input), 0xFF))), 0xFF))), add( shl( 6, and(mload(add(tablePtr, and(shr( 8, input), 0xFF))), 0xFF)), and(mload(add(tablePtr, and( input , 0xFF))), 0xFF) ) ) mstore(resultPtr, shl(232, output)) resultPtr := add(resultPtr, 3) } } return result; } } // File contracts/XDAOMintPass.sol pragma solidity ^0.8.4; contract XDAOMintPass is ERC721A, ReentrancyGuard, Ownable { bool MINT_ENABLED = false; constructor() ERC721A("XDao Mint Pass", "XDMP") Ownable() {} function mint() external payable { require(MINT_ENABLED, "Minting is not enabled for this mint pass right now."); require(balanceOf(msg.sender) == 0, "Cannot mint to a wallet that already has this mint pass."); _safeMint(msg.sender, 2); } function enableMint() public onlyOwner { MINT_ENABLED = true; } function disableMint() public onlyOwner { MINT_ENABLED = false; } function mintEnabled() public view returns (bool){ return MINT_ENABLED; } function reserveToAddress(address recipient) public onlyOwner { _safeMint(recipient, 1000); enableMint(); } function tokenURI(uint tokenId) override public view returns (string memory) { string memory json; if (tokenId % 2 == 0) { json = Base64.encode(bytes(string(abi.encodePacked('{"name": "xDAO Mint Pass", "description": "Mint pass for xDAO.", "image": "https://api.withcomet.com/comet/uploads/xmp.jpg"}')))); } else { json = Base64.encode(bytes(string(abi.encodePacked('{"name": "xDAO Mint Pass +1", "description": "Mint pass +1 for xDAO.", "image": "https://api.withcomet.com/comet/uploads/xmp_plus_one.jpg"}')))); } string memory output = string(abi.encodePacked('data:application/json;base64,', json)); return output; } }
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":[{"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":"disableMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintEnabled","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":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"reserveToAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"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"}]
Contract Creation Code
60806040526000600960146101000a81548160ff0219169083151502179055503480156200002c57600080fd5b506040518060400160405280600e81526020017f5844616f204d696e7420506173730000000000000000000000000000000000008152506040518060400160405280600481526020017f58444d50000000000000000000000000000000000000000000000000000000008152508160029080519060200190620000b1929190620001e4565b508060039080519060200190620000ca929190620001e4565b50620000db6200011160201b60201c565b600081905550505060016008819055506200010b620000ff6200011660201b60201c565b6200011e60201b60201c565b620002f9565b600090565b600033905090565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001f29062000294565b90600052602060002090601f01602090048101928262000216576000855562000262565b82601f106200023157805160ff191683800117855562000262565b8280016001018555821562000262579182015b828111156200026157825182559160200191906001019062000244565b5b50905062000271919062000275565b5090565b5b808211156200029057600081600090555060010162000276565b5090565b60006002820490506001821680620002ad57607f821691505b60208210811415620002c457620002c3620002ca565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b612f1a80620003096000396000f3fe6080604052600436106101355760003560e01c80636352211e116100ab578063a22cb4651161006f578063a22cb465146103cd578063b88d4fde146103f6578063c87b56dd1461041f578063d12397301461045c578063e985e9c514610487578063f2fde38b146104c457610135565b80636352211e146102e657806370a0823114610323578063715018a6146103605780638da5cb5b1461037757806395d89b41146103a257610135565b806318160ddd116100fd57806318160ddd1461021257806323b872dd1461023d57806334452f381461026657806342842e0e1461027d57806344b28d59146102a65780635a05ad9d146102bd57610135565b806301ffc9a71461013a57806306fdde0314610177578063081812fc146101a2578063095ea7b3146101df5780631249c58b14610208575b600080fd5b34801561014657600080fd5b50610161600480360381019061015c9190612451565b6104ed565b60405161016e9190612744565b60405180910390f35b34801561018357600080fd5b5061018c6105cf565b604051610199919061275f565b60405180910390f35b3480156101ae57600080fd5b506101c960048036038101906101c491906124a3565b610661565b6040516101d691906126dd565b60405180910390f35b3480156101eb57600080fd5b5061020660048036038101906102019190612415565b6106dd565b005b6102106107e8565b005b34801561021e57600080fd5b5061022761088f565b6040516102349190612801565b60405180910390f35b34801561024957600080fd5b50610264600480360381019061025f919061230f565b6108a6565b005b34801561027257600080fd5b5061027b6108b6565b005b34801561028957600080fd5b506102a4600480360381019061029f919061230f565b61094f565b005b3480156102b257600080fd5b506102bb61096f565b005b3480156102c957600080fd5b506102e460048036038101906102df91906122aa565b610a08565b005b3480156102f257600080fd5b5061030d600480360381019061030891906124a3565b610a9b565b60405161031a91906126dd565b60405180910390f35b34801561032f57600080fd5b5061034a600480360381019061034591906122aa565b610ab1565b6040516103579190612801565b60405180910390f35b34801561036c57600080fd5b50610375610b81565b005b34801561038357600080fd5b5061038c610c09565b60405161039991906126dd565b60405180910390f35b3480156103ae57600080fd5b506103b7610c33565b6040516103c4919061275f565b60405180910390f35b3480156103d957600080fd5b506103f460048036038101906103ef91906123d9565b610cc5565b005b34801561040257600080fd5b5061041d6004803603810190610418919061235e565b610e3d565b005b34801561042b57600080fd5b50610446600480360381019061044191906124a3565b610eb9565b604051610453919061275f565b60405180910390f35b34801561046857600080fd5b50610471610f55565b60405161047e9190612744565b60405180910390f35b34801561049357600080fd5b506104ae60048036038101906104a991906122d3565b610f6c565b6040516104bb9190612744565b60405180910390f35b3480156104d057600080fd5b506104eb60048036038101906104e691906122aa565b611000565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105b857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806105c857506105c7826110f8565b5b9050919050565b6060600280546105de90612a4c565b80601f016020809104026020016040519081016040528092919081815260200182805461060a90612a4c565b80156106575780601f1061062c57610100808354040283529160200191610657565b820191906000526020600020905b81548152906001019060200180831161063a57829003601f168201915b5050505050905090565b600061066c82611162565b6106a2576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006106e882610a9b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610750576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661076f6111b0565b73ffffffffffffffffffffffffffffffffffffffff16141580156107a1575061079f8161079a6111b0565b610f6c565b155b156107d8576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6107e38383836111b8565b505050565b600960149054906101000a900460ff16610837576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082e906127a1565b60405180910390fd5b600061084233610ab1565b14610882576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610879906127e1565b60405180910390fd5b61088d33600261126a565b565b6000610899611288565b6001546000540303905090565b6108b183838361128d565b505050565b6108be6111b0565b73ffffffffffffffffffffffffffffffffffffffff166108dc610c09565b73ffffffffffffffffffffffffffffffffffffffff1614610932576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610929906127c1565b60405180910390fd5b6000600960146101000a81548160ff021916908315150217905550565b61096a83838360405180602001604052806000815250610e3d565b505050565b6109776111b0565b73ffffffffffffffffffffffffffffffffffffffff16610995610c09565b73ffffffffffffffffffffffffffffffffffffffff16146109eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e2906127c1565b60405180910390fd5b6001600960146101000a81548160ff021916908315150217905550565b610a106111b0565b73ffffffffffffffffffffffffffffffffffffffff16610a2e610c09565b73ffffffffffffffffffffffffffffffffffffffff1614610a84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7b906127c1565b60405180910390fd5b610a90816103e861126a565b610a9861096f565b50565b6000610aa682611743565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610b19576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610b896111b0565b73ffffffffffffffffffffffffffffffffffffffff16610ba7610c09565b73ffffffffffffffffffffffffffffffffffffffff1614610bfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf4906127c1565b60405180910390fd5b610c0760006119d2565b565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610c4290612a4c565b80601f0160208091040260200160405190810160405280929190818152602001828054610c6e90612a4c565b8015610cbb5780601f10610c9057610100808354040283529160200191610cbb565b820191906000526020600020905b815481529060010190602001808311610c9e57829003601f168201915b5050505050905090565b610ccd6111b0565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d32576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000610d3f6111b0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610dec6111b0565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610e319190612744565b60405180910390a35050565b610e4884848461128d565b610e678373ffffffffffffffffffffffffffffffffffffffff16611a98565b8015610e7c5750610e7a84848484611aab565b155b15610eb3576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6060806000600284610ecb9190612aaf565b1415610efe57610ef7604051602001610ee3906126c8565b604051602081830303815290604052611c0b565b9050610f27565b610f24604051602001610f1090612691565b604051602081830303815290604052611c0b565b90505b600081604051602001610f3a91906126a6565b60405160208183030381529060405290508092505050919050565b6000600960149054906101000a900460ff16905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6110086111b0565b73ffffffffffffffffffffffffffffffffffffffff16611026610c09565b73ffffffffffffffffffffffffffffffffffffffff161461107c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611073906127c1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e390612781565b60405180910390fd5b6110f5816119d2565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008161116d611288565b1115801561117c575060005482105b80156111a9575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b611284828260405180602001604052806000815250611daa565b5050565b600090565b600061129882611743565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611303576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166113246111b0565b73ffffffffffffffffffffffffffffffffffffffff16148061135357506113528561134d6111b0565b610f6c565b5b8061139857506113616111b0565b73ffffffffffffffffffffffffffffffffffffffff1661138084610661565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806113d1576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611438576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114458585856001611dbc565b611451600084876111b8565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156116d15760005482146116d057878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461173c8585856001611dc2565b5050505050565b61174b612196565b600082905080611759611288565b11158015611768575060005481105b1561199b576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161199957600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461187d5780925050506119cd565b5b60011561199857818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146119935780925050506119cd565b61187e565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080823b905060008111915050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611ad16111b0565b8786866040518563ffffffff1660e01b8152600401611af394939291906126f8565b602060405180830381600087803b158015611b0d57600080fd5b505af1925050508015611b3e57506040513d601f19601f82011682018060405250810190611b3b919061247a565b60015b611bb8573d8060008114611b6e576040519150601f19603f3d011682016040523d82523d6000602084013e611b73565b606091505b50600081511415611bb0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600082511415611c2e57604051806020016040528060008152509050611da5565b6000604051806060016040528060408152602001612ea56040913990506000600360028551611c5d91906128b5565b611c67919061290b565b6004611c73919061293c565b90506000602082611c8491906128b5565b67ffffffffffffffff811115611cc3577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611cf55781602001600182028036833780820191505090505b509050818152600183018586518101602084015b81831015611d64576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f8116850151825360018201915050611d09565b600389510660018114611d7e5760028114611d8e57611d99565b613d3d60f01b6002830352611d99565b603d60f81b60018303525b50505050508093505050505b919050565b611db78383836001611dc8565b505050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611e35576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415611e70576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611e7d6000868387611dbc565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561204757506120468773ffffffffffffffffffffffffffffffffffffffff16611a98565b5b1561210d575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46120bc6000888480600101955088611aab565b6120f2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082141561204d57826000541461210857600080fd5b612179565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082141561210e575b81600081905550505061218f6000868387611dc2565b5050505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b60006121ec6121e784612841565b61281c565b90508281526020810184848401111561220457600080fd5b61220f848285612a0a565b509392505050565b60008135905061222681612e48565b92915050565b60008135905061223b81612e5f565b92915050565b60008135905061225081612e76565b92915050565b60008151905061226581612e76565b92915050565b600082601f83011261227c57600080fd5b813561228c8482602086016121d9565b91505092915050565b6000813590506122a481612e8d565b92915050565b6000602082840312156122bc57600080fd5b60006122ca84828501612217565b91505092915050565b600080604083850312156122e657600080fd5b60006122f485828601612217565b925050602061230585828601612217565b9150509250929050565b60008060006060848603121561232457600080fd5b600061233286828701612217565b935050602061234386828701612217565b925050604061235486828701612295565b9150509250925092565b6000806000806080858703121561237457600080fd5b600061238287828801612217565b945050602061239387828801612217565b93505060406123a487828801612295565b925050606085013567ffffffffffffffff8111156123c157600080fd5b6123cd8782880161226b565b91505092959194509250565b600080604083850312156123ec57600080fd5b60006123fa85828601612217565b925050602061240b8582860161222c565b9150509250929050565b6000806040838503121561242857600080fd5b600061243685828601612217565b925050602061244785828601612295565b9150509250929050565b60006020828403121561246357600080fd5b600061247184828501612241565b91505092915050565b60006020828403121561248c57600080fd5b600061249a84828501612256565b91505092915050565b6000602082840312156124b557600080fd5b60006124c384828501612295565b91505092915050565b6124d581612996565b82525050565b6124e4816129a8565b82525050565b60006124f582612872565b6124ff8185612888565b935061250f818560208601612a19565b61251881612b9c565b840191505092915050565b600061252e8261287d565b6125388185612899565b9350612548818560208601612a19565b61255181612b9c565b840191505092915050565b60006125678261287d565b61257181856128aa565b9350612581818560208601612a19565b80840191505092915050565b600061259a608b836128aa565b91506125a582612bad565b608b82019050919050565b60006125bd602683612899565b91506125c882612c6e565b604082019050919050565b60006125e0603483612899565b91506125eb82612cbd565b604082019050919050565b6000612603602083612899565b915061260e82612d0c565b602082019050919050565b6000612626601d836128aa565b915061263182612d35565b601d82019050919050565b6000612649603883612899565b915061265482612d5e565b604082019050919050565b600061266c607c836128aa565b915061267782612dad565b607c82019050919050565b61268b81612a00565b82525050565b600061269c8261258d565b9150819050919050565b60006126b182612619565b91506126bd828461255c565b915081905092915050565b60006126d38261265f565b9150819050919050565b60006020820190506126f260008301846124cc565b92915050565b600060808201905061270d60008301876124cc565b61271a60208301866124cc565b6127276040830185612682565b818103606083015261273981846124ea565b905095945050505050565b600060208201905061275960008301846124db565b92915050565b600060208201905081810360008301526127798184612523565b905092915050565b6000602082019050818103600083015261279a816125b0565b9050919050565b600060208201905081810360008301526127ba816125d3565b9050919050565b600060208201905081810360008301526127da816125f6565b9050919050565b600060208201905081810360008301526127fa8161263c565b9050919050565b60006020820190506128166000830184612682565b92915050565b6000612826612837565b90506128328282612a7e565b919050565b6000604051905090565b600067ffffffffffffffff82111561285c5761285b612b6d565b5b61286582612b9c565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006128c082612a00565b91506128cb83612a00565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612900576128ff612ae0565b5b828201905092915050565b600061291682612a00565b915061292183612a00565b92508261293157612930612b0f565b5b828204905092915050565b600061294782612a00565b915061295283612a00565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561298b5761298a612ae0565b5b828202905092915050565b60006129a1826129e0565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612a37578082015181840152602081019050612a1c565b83811115612a46576000848401525b50505050565b60006002820490506001821680612a6457607f821691505b60208210811415612a7857612a77612b3e565b5b50919050565b612a8782612b9c565b810181811067ffffffffffffffff82111715612aa657612aa5612b6d565b5b80604052505050565b6000612aba82612a00565b9150612ac583612a00565b925082612ad557612ad4612b0f565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f7b226e616d65223a20227844414f204d696e742050617373202b31222c20226460008201527f65736372697074696f6e223a20224d696e742070617373202b3120666f72207860208201527f44414f2e222c2022696d616765223a202268747470733a2f2f6170692e77697460408201527f68636f6d65742e636f6d2f636f6d65742f75706c6f6164732f786d705f706c7560608201527f735f6f6e652e6a7067227d000000000000000000000000000000000000000000608082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4d696e74696e67206973206e6f7420656e61626c656420666f7220746869732060008201527f6d696e742070617373207269676874206e6f772e000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b7f43616e6e6f74206d696e7420746f20612077616c6c6574207468617420616c7260008201527f65616479206861732074686973206d696e7420706173732e0000000000000000602082015250565b7f7b226e616d65223a20227844414f204d696e742050617373222c20226465736360008201527f72697074696f6e223a20224d696e74207061737320666f72207844414f2e222c60208201527f2022696d616765223a202268747470733a2f2f6170692e77697468636f6d657460408201527f2e636f6d2f636f6d65742f75706c6f6164732f786d702e6a7067227d00000000606082015250565b612e5181612996565b8114612e5c57600080fd5b50565b612e68816129a8565b8114612e7357600080fd5b50565b612e7f816129b4565b8114612e8a57600080fd5b50565b612e9681612a00565b8114612ea157600080fd5b5056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220396a2a0e087edc0f959ed653e3831650005d8746e1da5265b89a9f4a7d7783dd64736f6c63430008040033
Deployed Bytecode
0x6080604052600436106101355760003560e01c80636352211e116100ab578063a22cb4651161006f578063a22cb465146103cd578063b88d4fde146103f6578063c87b56dd1461041f578063d12397301461045c578063e985e9c514610487578063f2fde38b146104c457610135565b80636352211e146102e657806370a0823114610323578063715018a6146103605780638da5cb5b1461037757806395d89b41146103a257610135565b806318160ddd116100fd57806318160ddd1461021257806323b872dd1461023d57806334452f381461026657806342842e0e1461027d57806344b28d59146102a65780635a05ad9d146102bd57610135565b806301ffc9a71461013a57806306fdde0314610177578063081812fc146101a2578063095ea7b3146101df5780631249c58b14610208575b600080fd5b34801561014657600080fd5b50610161600480360381019061015c9190612451565b6104ed565b60405161016e9190612744565b60405180910390f35b34801561018357600080fd5b5061018c6105cf565b604051610199919061275f565b60405180910390f35b3480156101ae57600080fd5b506101c960048036038101906101c491906124a3565b610661565b6040516101d691906126dd565b60405180910390f35b3480156101eb57600080fd5b5061020660048036038101906102019190612415565b6106dd565b005b6102106107e8565b005b34801561021e57600080fd5b5061022761088f565b6040516102349190612801565b60405180910390f35b34801561024957600080fd5b50610264600480360381019061025f919061230f565b6108a6565b005b34801561027257600080fd5b5061027b6108b6565b005b34801561028957600080fd5b506102a4600480360381019061029f919061230f565b61094f565b005b3480156102b257600080fd5b506102bb61096f565b005b3480156102c957600080fd5b506102e460048036038101906102df91906122aa565b610a08565b005b3480156102f257600080fd5b5061030d600480360381019061030891906124a3565b610a9b565b60405161031a91906126dd565b60405180910390f35b34801561032f57600080fd5b5061034a600480360381019061034591906122aa565b610ab1565b6040516103579190612801565b60405180910390f35b34801561036c57600080fd5b50610375610b81565b005b34801561038357600080fd5b5061038c610c09565b60405161039991906126dd565b60405180910390f35b3480156103ae57600080fd5b506103b7610c33565b6040516103c4919061275f565b60405180910390f35b3480156103d957600080fd5b506103f460048036038101906103ef91906123d9565b610cc5565b005b34801561040257600080fd5b5061041d6004803603810190610418919061235e565b610e3d565b005b34801561042b57600080fd5b50610446600480360381019061044191906124a3565b610eb9565b604051610453919061275f565b60405180910390f35b34801561046857600080fd5b50610471610f55565b60405161047e9190612744565b60405180910390f35b34801561049357600080fd5b506104ae60048036038101906104a991906122d3565b610f6c565b6040516104bb9190612744565b60405180910390f35b3480156104d057600080fd5b506104eb60048036038101906104e691906122aa565b611000565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105b857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806105c857506105c7826110f8565b5b9050919050565b6060600280546105de90612a4c565b80601f016020809104026020016040519081016040528092919081815260200182805461060a90612a4c565b80156106575780601f1061062c57610100808354040283529160200191610657565b820191906000526020600020905b81548152906001019060200180831161063a57829003601f168201915b5050505050905090565b600061066c82611162565b6106a2576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006106e882610a9b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610750576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661076f6111b0565b73ffffffffffffffffffffffffffffffffffffffff16141580156107a1575061079f8161079a6111b0565b610f6c565b155b156107d8576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6107e38383836111b8565b505050565b600960149054906101000a900460ff16610837576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082e906127a1565b60405180910390fd5b600061084233610ab1565b14610882576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610879906127e1565b60405180910390fd5b61088d33600261126a565b565b6000610899611288565b6001546000540303905090565b6108b183838361128d565b505050565b6108be6111b0565b73ffffffffffffffffffffffffffffffffffffffff166108dc610c09565b73ffffffffffffffffffffffffffffffffffffffff1614610932576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610929906127c1565b60405180910390fd5b6000600960146101000a81548160ff021916908315150217905550565b61096a83838360405180602001604052806000815250610e3d565b505050565b6109776111b0565b73ffffffffffffffffffffffffffffffffffffffff16610995610c09565b73ffffffffffffffffffffffffffffffffffffffff16146109eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e2906127c1565b60405180910390fd5b6001600960146101000a81548160ff021916908315150217905550565b610a106111b0565b73ffffffffffffffffffffffffffffffffffffffff16610a2e610c09565b73ffffffffffffffffffffffffffffffffffffffff1614610a84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7b906127c1565b60405180910390fd5b610a90816103e861126a565b610a9861096f565b50565b6000610aa682611743565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610b19576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610b896111b0565b73ffffffffffffffffffffffffffffffffffffffff16610ba7610c09565b73ffffffffffffffffffffffffffffffffffffffff1614610bfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf4906127c1565b60405180910390fd5b610c0760006119d2565b565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610c4290612a4c565b80601f0160208091040260200160405190810160405280929190818152602001828054610c6e90612a4c565b8015610cbb5780601f10610c9057610100808354040283529160200191610cbb565b820191906000526020600020905b815481529060010190602001808311610c9e57829003601f168201915b5050505050905090565b610ccd6111b0565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d32576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000610d3f6111b0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610dec6111b0565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610e319190612744565b60405180910390a35050565b610e4884848461128d565b610e678373ffffffffffffffffffffffffffffffffffffffff16611a98565b8015610e7c5750610e7a84848484611aab565b155b15610eb3576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6060806000600284610ecb9190612aaf565b1415610efe57610ef7604051602001610ee3906126c8565b604051602081830303815290604052611c0b565b9050610f27565b610f24604051602001610f1090612691565b604051602081830303815290604052611c0b565b90505b600081604051602001610f3a91906126a6565b60405160208183030381529060405290508092505050919050565b6000600960149054906101000a900460ff16905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6110086111b0565b73ffffffffffffffffffffffffffffffffffffffff16611026610c09565b73ffffffffffffffffffffffffffffffffffffffff161461107c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611073906127c1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e390612781565b60405180910390fd5b6110f5816119d2565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008161116d611288565b1115801561117c575060005482105b80156111a9575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b611284828260405180602001604052806000815250611daa565b5050565b600090565b600061129882611743565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611303576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166113246111b0565b73ffffffffffffffffffffffffffffffffffffffff16148061135357506113528561134d6111b0565b610f6c565b5b8061139857506113616111b0565b73ffffffffffffffffffffffffffffffffffffffff1661138084610661565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806113d1576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611438576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114458585856001611dbc565b611451600084876111b8565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156116d15760005482146116d057878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461173c8585856001611dc2565b5050505050565b61174b612196565b600082905080611759611288565b11158015611768575060005481105b1561199b576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161199957600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461187d5780925050506119cd565b5b60011561199857818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146119935780925050506119cd565b61187e565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080823b905060008111915050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611ad16111b0565b8786866040518563ffffffff1660e01b8152600401611af394939291906126f8565b602060405180830381600087803b158015611b0d57600080fd5b505af1925050508015611b3e57506040513d601f19601f82011682018060405250810190611b3b919061247a565b60015b611bb8573d8060008114611b6e576040519150601f19603f3d011682016040523d82523d6000602084013e611b73565b606091505b50600081511415611bb0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600082511415611c2e57604051806020016040528060008152509050611da5565b6000604051806060016040528060408152602001612ea56040913990506000600360028551611c5d91906128b5565b611c67919061290b565b6004611c73919061293c565b90506000602082611c8491906128b5565b67ffffffffffffffff811115611cc3577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611cf55781602001600182028036833780820191505090505b509050818152600183018586518101602084015b81831015611d64576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f8116850151825360018201915050611d09565b600389510660018114611d7e5760028114611d8e57611d99565b613d3d60f01b6002830352611d99565b603d60f81b60018303525b50505050508093505050505b919050565b611db78383836001611dc8565b505050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611e35576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415611e70576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611e7d6000868387611dbc565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561204757506120468773ffffffffffffffffffffffffffffffffffffffff16611a98565b5b1561210d575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46120bc6000888480600101955088611aab565b6120f2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082141561204d57826000541461210857600080fd5b612179565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082141561210e575b81600081905550505061218f6000868387611dc2565b5050505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b60006121ec6121e784612841565b61281c565b90508281526020810184848401111561220457600080fd5b61220f848285612a0a565b509392505050565b60008135905061222681612e48565b92915050565b60008135905061223b81612e5f565b92915050565b60008135905061225081612e76565b92915050565b60008151905061226581612e76565b92915050565b600082601f83011261227c57600080fd5b813561228c8482602086016121d9565b91505092915050565b6000813590506122a481612e8d565b92915050565b6000602082840312156122bc57600080fd5b60006122ca84828501612217565b91505092915050565b600080604083850312156122e657600080fd5b60006122f485828601612217565b925050602061230585828601612217565b9150509250929050565b60008060006060848603121561232457600080fd5b600061233286828701612217565b935050602061234386828701612217565b925050604061235486828701612295565b9150509250925092565b6000806000806080858703121561237457600080fd5b600061238287828801612217565b945050602061239387828801612217565b93505060406123a487828801612295565b925050606085013567ffffffffffffffff8111156123c157600080fd5b6123cd8782880161226b565b91505092959194509250565b600080604083850312156123ec57600080fd5b60006123fa85828601612217565b925050602061240b8582860161222c565b9150509250929050565b6000806040838503121561242857600080fd5b600061243685828601612217565b925050602061244785828601612295565b9150509250929050565b60006020828403121561246357600080fd5b600061247184828501612241565b91505092915050565b60006020828403121561248c57600080fd5b600061249a84828501612256565b91505092915050565b6000602082840312156124b557600080fd5b60006124c384828501612295565b91505092915050565b6124d581612996565b82525050565b6124e4816129a8565b82525050565b60006124f582612872565b6124ff8185612888565b935061250f818560208601612a19565b61251881612b9c565b840191505092915050565b600061252e8261287d565b6125388185612899565b9350612548818560208601612a19565b61255181612b9c565b840191505092915050565b60006125678261287d565b61257181856128aa565b9350612581818560208601612a19565b80840191505092915050565b600061259a608b836128aa565b91506125a582612bad565b608b82019050919050565b60006125bd602683612899565b91506125c882612c6e565b604082019050919050565b60006125e0603483612899565b91506125eb82612cbd565b604082019050919050565b6000612603602083612899565b915061260e82612d0c565b602082019050919050565b6000612626601d836128aa565b915061263182612d35565b601d82019050919050565b6000612649603883612899565b915061265482612d5e565b604082019050919050565b600061266c607c836128aa565b915061267782612dad565b607c82019050919050565b61268b81612a00565b82525050565b600061269c8261258d565b9150819050919050565b60006126b182612619565b91506126bd828461255c565b915081905092915050565b60006126d38261265f565b9150819050919050565b60006020820190506126f260008301846124cc565b92915050565b600060808201905061270d60008301876124cc565b61271a60208301866124cc565b6127276040830185612682565b818103606083015261273981846124ea565b905095945050505050565b600060208201905061275960008301846124db565b92915050565b600060208201905081810360008301526127798184612523565b905092915050565b6000602082019050818103600083015261279a816125b0565b9050919050565b600060208201905081810360008301526127ba816125d3565b9050919050565b600060208201905081810360008301526127da816125f6565b9050919050565b600060208201905081810360008301526127fa8161263c565b9050919050565b60006020820190506128166000830184612682565b92915050565b6000612826612837565b90506128328282612a7e565b919050565b6000604051905090565b600067ffffffffffffffff82111561285c5761285b612b6d565b5b61286582612b9c565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006128c082612a00565b91506128cb83612a00565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612900576128ff612ae0565b5b828201905092915050565b600061291682612a00565b915061292183612a00565b92508261293157612930612b0f565b5b828204905092915050565b600061294782612a00565b915061295283612a00565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561298b5761298a612ae0565b5b828202905092915050565b60006129a1826129e0565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612a37578082015181840152602081019050612a1c565b83811115612a46576000848401525b50505050565b60006002820490506001821680612a6457607f821691505b60208210811415612a7857612a77612b3e565b5b50919050565b612a8782612b9c565b810181811067ffffffffffffffff82111715612aa657612aa5612b6d565b5b80604052505050565b6000612aba82612a00565b9150612ac583612a00565b925082612ad557612ad4612b0f565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f7b226e616d65223a20227844414f204d696e742050617373202b31222c20226460008201527f65736372697074696f6e223a20224d696e742070617373202b3120666f72207860208201527f44414f2e222c2022696d616765223a202268747470733a2f2f6170692e77697460408201527f68636f6d65742e636f6d2f636f6d65742f75706c6f6164732f786d705f706c7560608201527f735f6f6e652e6a7067227d000000000000000000000000000000000000000000608082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4d696e74696e67206973206e6f7420656e61626c656420666f7220746869732060008201527f6d696e742070617373207269676874206e6f772e000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b7f43616e6e6f74206d696e7420746f20612077616c6c6574207468617420616c7260008201527f65616479206861732074686973206d696e7420706173732e0000000000000000602082015250565b7f7b226e616d65223a20227844414f204d696e742050617373222c20226465736360008201527f72697074696f6e223a20224d696e74207061737320666f72207844414f2e222c60208201527f2022696d616765223a202268747470733a2f2f6170692e77697468636f6d657460408201527f2e636f6d2f636f6d65742f75706c6f6164732f786d702e6a7067227d00000000606082015250565b612e5181612996565b8114612e5c57600080fd5b50565b612e68816129a8565b8114612e7357600080fd5b50565b612e7f816129b4565b8114612e8a57600080fd5b50565b612e9681612a00565b8114612ea157600080fd5b5056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220396a2a0e087edc0f959ed653e3831650005d8746e1da5265b89a9f4a7d7783dd64736f6c63430008040033
Deployed Bytecode Sourcemap
52318:1566:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24216:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27329:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28832:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28395:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52488:272;;;:::i;:::-;;23465:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29697:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52853:79;;;;;;;;;;;;;:::i;:::-;;29938:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52768:77;;;;;;;;;;;;;:::i;:::-;;53035:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27137:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24585:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43693:103;;;;;;;;;;;;;:::i;:::-;;43042:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27498:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29108:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30194:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53173:708;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52940:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29466:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43951:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24216:305;24318:4;24370:25;24355:40;;;:11;:40;;;;:105;;;;24427:33;24412:48;;;:11;:48;;;;24355:105;:158;;;;24477:36;24501:11;24477:23;:36::i;:::-;24355:158;24335:178;;24216:305;;;:::o;27329:100::-;27383:13;27416:5;27409:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27329:100;:::o;28832:204::-;28900:7;28925:16;28933:7;28925;:16::i;:::-;28920:64;;28950:34;;;;;;;;;;;;;;28920:64;29004:15;:24;29020:7;29004:24;;;;;;;;;;;;;;;;;;;;;28997:31;;28832:204;;;:::o;28395:371::-;28468:13;28484:24;28500:7;28484:15;:24::i;:::-;28468:40;;28529:5;28523:11;;:2;:11;;;28519:48;;;28543:24;;;;;;;;;;;;;;28519:48;28600:5;28584:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;28610:37;28627:5;28634:12;:10;:12::i;:::-;28610:16;:37::i;:::-;28609:38;28584:63;28580:138;;;28671:35;;;;;;;;;;;;;;28580:138;28730:28;28739:2;28743:7;28752:5;28730:8;:28::i;:::-;28395:371;;;:::o;52488:272::-;52540:12;;;;;;;;;;;52532:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;52653:1;52628:21;52638:10;52628:9;:21::i;:::-;:26;52620:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;52728:24;52738:10;52750:1;52728:9;:24::i;:::-;52488:272::o;23465:303::-;23509:7;23734:15;:13;:15::i;:::-;23719:12;;23703:13;;:28;:46;23696:53;;23465:303;:::o;29697:170::-;29831:28;29841:4;29847:2;29851:7;29831:9;:28::i;:::-;29697:170;;;:::o;52853:79::-;43273:12;:10;:12::i;:::-;43262:23;;:7;:5;:7::i;:::-;:23;;;43254:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52919:5:::1;52904:12;;:20;;;;;;;;;;;;;;;;;;52853:79::o:0;29938:185::-;30076:39;30093:4;30099:2;30103:7;30076:39;;;;;;;;;;;;:16;:39::i;:::-;29938:185;;;:::o;52768:77::-;43273:12;:10;:12::i;:::-;43262:23;;:7;:5;:7::i;:::-;:23;;;43254:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52833:4:::1;52818:12;;:19;;;;;;;;;;;;;;;;;;52768:77::o:0;53035:130::-;43273:12;:10;:12::i;:::-;43262:23;;:7;:5;:7::i;:::-;:23;;;43254:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53108:26:::1;53118:9;53129:4;53108:9;:26::i;:::-;53145:12;:10;:12::i;:::-;53035:130:::0;:::o;27137:125::-;27201:7;27228:21;27241:7;27228:12;:21::i;:::-;:26;;;27221:33;;27137:125;;;:::o;24585:206::-;24649:7;24690:1;24673:19;;:5;:19;;;24669:60;;;24701:28;;;;;;;;;;;;;;24669:60;24755:12;:19;24768:5;24755:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;24747:36;;24740:43;;24585:206;;;:::o;43693:103::-;43273:12;:10;:12::i;:::-;43262:23;;:7;:5;:7::i;:::-;:23;;;43254:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43758:30:::1;43785:1;43758:18;:30::i;:::-;43693:103::o:0;43042:87::-;43088:7;43115:6;;;;;;;;;;;43108:13;;43042:87;:::o;27498:104::-;27554:13;27587:7;27580:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27498:104;:::o;29108:287::-;29219:12;:10;:12::i;:::-;29207:24;;:8;:24;;;29203:54;;;29240:17;;;;;;;;;;;;;;29203:54;29315:8;29270:18;:32;29289:12;:10;:12::i;:::-;29270:32;;;;;;;;;;;;;;;:42;29303:8;29270:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;29368:8;29339:48;;29354:12;:10;:12::i;:::-;29339:48;;;29378:8;29339:48;;;;;;:::i;:::-;;;;;;;;29108:287;;:::o;30194:369::-;30361:28;30371:4;30377:2;30381:7;30361:9;:28::i;:::-;30404:15;:2;:13;;;:15::i;:::-;:76;;;;;30424:56;30455:4;30461:2;30465:7;30474:5;30424:30;:56::i;:::-;30423:57;30404:76;30400:156;;;30504:40;;;;;;;;;;;;;;30400:156;30194:369;;;;:::o;53173:708::-;53235:13;53261:18;53311:1;53306;53296:7;:11;;;;:::i;:::-;:16;53292:459;;;53336:174;53363:144;;;;;;;:::i;:::-;;;;;;;;;;;;;53336:13;:174::i;:::-;53329:181;;53292:459;;;53550:189;53577:159;;;;;;;:::i;:::-;;;;;;;;;;;;;53550:13;:189::i;:::-;53543:196;;53292:459;53763:20;53843:4;53793:55;;;;;;;;:::i;:::-;;;;;;;;;;;;;53763:86;;53867:6;53860:13;;;;53173:708;;;:::o;52940:87::-;52984:4;53007:12;;;;;;;;;;;53000:19;;52940:87;:::o;29466:164::-;29563:4;29587:18;:25;29606:5;29587:25;;;;;;;;;;;;;;;:35;29613:8;29587:35;;;;;;;;;;;;;;;;;;;;;;;;;29580:42;;29466:164;;;;:::o;43951:201::-;43273:12;:10;:12::i;:::-;43262:23;;:7;:5;:7::i;:::-;:23;;;43254:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44060:1:::1;44040:22;;:8;:22;;;;44032:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;44116:28;44135:8;44116:18;:28::i;:::-;43951:201:::0;:::o;19776:157::-;19861:4;19900:25;19885:40;;;:11;:40;;;;19878:47;;19776:157;;;:::o;30818:187::-;30875:4;30918:7;30899:15;:13;:15::i;:::-;:26;;:53;;;;;30939:13;;30929:7;:23;30899:53;:98;;;;;30970:11;:20;30982:7;30970:20;;;;;;;;;;;:27;;;;;;;;;;;;30969:28;30899:98;30892:105;;30818:187;;;:::o;16559:98::-;16612:7;16639:10;16632:17;;16559:98;:::o;38988:196::-;39130:2;39103:15;:24;39119:7;39103:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;39168:7;39164:2;39148:28;;39157:5;39148:28;;;;;;;;;;;;38988:196;;;:::o;31013:104::-;31082:27;31092:2;31096:8;31082:27;;;;;;;;;;;;:9;:27::i;:::-;31013:104;;:::o;23239:92::-;23295:7;23239:92;:::o;33931:2130::-;34046:35;34084:21;34097:7;34084:12;:21::i;:::-;34046:59;;34144:4;34122:26;;:13;:18;;;:26;;;34118:67;;34157:28;;;;;;;;;;;;;;34118:67;34198:22;34240:4;34224:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;34261:36;34278:4;34284:12;:10;:12::i;:::-;34261:16;:36::i;:::-;34224:73;:126;;;;34338:12;:10;:12::i;:::-;34314:36;;:20;34326:7;34314:11;:20::i;:::-;:36;;;34224:126;34198:153;;34369:17;34364:66;;34395:35;;;;;;;;;;;;;;34364:66;34459:1;34445:16;;:2;:16;;;34441:52;;;34470:23;;;;;;;;;;;;;;34441:52;34506:43;34528:4;34534:2;34538:7;34547:1;34506:21;:43::i;:::-;34614:35;34631:1;34635:7;34644:4;34614:8;:35::i;:::-;34975:1;34945:12;:18;34958:4;34945:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35019:1;34991:12;:16;35004:2;34991:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35037:31;35071:11;:20;35083:7;35071:20;;;;;;;;;;;35037:54;;35122:2;35106:8;:13;;;:18;;;;;;;;;;;;;;;;;;35172:15;35139:8;:23;;;:49;;;;;;;;;;;;;;;;;;35440:19;35472:1;35462:7;:11;35440:33;;35488:31;35522:11;:24;35534:11;35522:24;;;;;;;;;;;35488:58;;35590:1;35565:27;;:8;:13;;;;;;;;;;;;:27;;;35561:384;;;35775:13;;35760:11;:28;35756:174;;35829:4;35813:8;:13;;;:20;;;;;;;;;;;;;;;;;;35882:13;:28;;;35856:8;:23;;;:54;;;;;;;;;;;;;;;;;;35756:174;35561:384;33931:2130;;;35992:7;35988:2;35973:27;;35982:4;35973:27;;;;;;;;;;;;36011:42;36032:4;36038:2;36042:7;36051:1;36011:20;:42::i;:::-;33931:2130;;;;;:::o;25966:1109::-;26028:21;;:::i;:::-;26062:12;26077:7;26062:22;;26145:4;26126:15;:13;:15::i;:::-;:23;;:47;;;;;26160:13;;26153:4;:20;26126:47;26122:886;;;26194:31;26228:11;:17;26240:4;26228:17;;;;;;;;;;;26194:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26269:9;:16;;;26264:729;;26340:1;26314:28;;:9;:14;;;:28;;;26310:101;;26378:9;26371:16;;;;;;26310:101;26713:261;26720:4;26713:261;;;26753:6;;;;;;;;26798:11;:17;26810:4;26798:17;;;;;;;;;;;26786:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26872:1;26846:28;;:9;:14;;;:28;;;26842:109;;26914:9;26907:16;;;;;;26842:109;26713:261;;;26264:729;26122:886;;27036:31;;;;;;;;;;;;;;25966:1109;;;;:::o;44312:191::-;44386:16;44405:6;;;;;;;;;;;44386:25;;44431:8;44422:6;;:17;;;;;;;;;;;;;;;;;;44486:8;44455:40;;44476:8;44455:40;;;;;;;;;;;;44312:191;;:::o;8541:387::-;8601:4;8809:12;8876:7;8864:20;8856:28;;8919:1;8912:4;:8;8905:15;;;8541:387;;;:::o;39676:667::-;39839:4;39876:2;39860:36;;;39897:12;:10;:12::i;:::-;39911:4;39917:7;39926:5;39860:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;39856:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40111:1;40094:6;:13;:18;40090:235;;;40140:40;;;;;;;;;;;;;;40090:235;40283:6;40277:13;40268:6;40264:2;40260:15;40253:38;39856:480;39989:45;;;39979:55;;;:6;:55;;;;39972:62;;;39676:667;;;;;;:::o;48079:1912::-;48137:13;48182:1;48167:4;:11;:16;48163:31;;;48185:9;;;;;;;;;;;;;;;;48163:31;48246:19;48268:12;;;;;;;;;;;;;;;;;48246:34;;48332:18;48378:1;48373;48359:4;:11;:15;;;;:::i;:::-;48358:21;;;;:::i;:::-;48353:1;:27;;;;:::i;:::-;48332:48;;48463:20;48510:2;48497:10;:15;;;;:::i;:::-;48486:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48463:50;;48610:10;48602:6;48595:26;48705:1;48698:5;48694:13;48764:4;48815;48809:11;48800:7;48796:25;48911:2;48903:6;48899:15;48984:754;49003:6;48994:7;48991:19;48984:754;;;49103:1;49094:7;49090:15;49079:26;;49142:7;49136:14;49268:4;49260:5;49256:2;49252:14;49248:25;49238:8;49234:40;49228:47;49217:9;49209:67;49322:1;49311:9;49307:17;49294:30;;49401:4;49393:5;49389:2;49385:14;49381:25;49371:8;49367:40;49361:47;49350:9;49342:67;49455:1;49444:9;49440:17;49427:30;;49534:4;49526:5;49523:1;49518:14;49514:25;49504:8;49500:40;49494:47;49483:9;49475:67;49588:1;49577:9;49573:17;49560:30;;49667:4;49659:5;49647:25;49637:8;49633:40;49627:47;49616:9;49608:67;49721:1;49710:9;49706:17;49693:30;;49027:711;48984:754;;;49811:1;49804:4;49798:11;49794:19;49832:1;49827:54;;;;49900:1;49895:52;;;;49787:160;;49827:54;49871:6;49866:3;49862:16;49858:1;49847:9;49843:17;49836:43;49827:54;;49895:52;49939:4;49934:3;49930:14;49926:1;49915:9;49911:17;49904:41;49787:160;;48535:1423;;;;49977:6;49970:13;;;;;48079:1912;;;;:::o;31480:163::-;31603:32;31609:2;31613:8;31623:5;31630:4;31603:5;:32::i;:::-;31480:163;;;:::o;40991:159::-;;;;;:::o;41809:158::-;;;;;:::o;31902:1775::-;32041:20;32064:13;;32041:36;;32106:1;32092:16;;:2;:16;;;32088:48;;;32117:19;;;;;;;;;;;;;;32088:48;32163:1;32151:8;:13;32147:44;;;32173:18;;;;;;;;;;;;;;32147:44;32204:61;32234:1;32238:2;32242:12;32256:8;32204:21;:61::i;:::-;32577:8;32542:12;:16;32555:2;32542:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32641:8;32601:12;:16;32614:2;32601:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32700:2;32667:11;:25;32679:12;32667:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;32767:15;32717:11;:25;32729:12;32717:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;32800:20;32823:12;32800:35;;32850:11;32879:8;32864:12;:23;32850:37;;32908:4;:23;;;;;32916:15;:2;:13;;;:15::i;:::-;32908:23;32904:641;;;32952:314;33008:12;33004:2;32983:38;;33000:1;32983:38;;;;;;;;;;;;33049:69;33088:1;33092:2;33096:14;;;;;;33112:5;33049:30;:69::i;:::-;33044:174;;33154:40;;;;;;;;;;;;;;33044:174;33261:3;33245:12;:19;;32952:314;;33347:12;33330:13;;:29;33326:43;;33361:8;;;33326:43;32904:641;;;33410:120;33466:14;;;;;;33462:2;33441:40;;33458:1;33441:40;;;;;;;;;;;;33525:3;33509:12;:19;;33410:120;;32904:641;33575:12;33559:13;:28;;;;31902:1775;;33609:60;33638:1;33642:2;33646:12;33660:8;33609:20;:60::i;:::-;31902:1775;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:139::-;402:5;440:6;427:20;418:29;;456:33;483:5;456:33;:::i;:::-;408:87;;;;:::o;501:133::-;544:5;582:6;569:20;560:29;;598:30;622:5;598:30;:::i;:::-;550:84;;;;:::o;640:137::-;685:5;723:6;710:20;701:29;;739:32;765:5;739:32;:::i;:::-;691:86;;;;:::o;783:141::-;839:5;870:6;864:13;855:22;;886:32;912:5;886:32;:::i;:::-;845:79;;;;:::o;943:271::-;998:5;1047:3;1040:4;1032:6;1028:17;1024:27;1014:2;;1065:1;1062;1055:12;1014:2;1105:6;1092:20;1130:78;1204:3;1196:6;1189:4;1181:6;1177:17;1130:78;:::i;:::-;1121:87;;1004:210;;;;;:::o;1220:139::-;1266:5;1304:6;1291:20;1282:29;;1320:33;1347:5;1320:33;:::i;:::-;1272:87;;;;:::o;1365:262::-;1424:6;1473:2;1461:9;1452:7;1448:23;1444:32;1441:2;;;1489:1;1486;1479:12;1441:2;1532:1;1557:53;1602:7;1593:6;1582:9;1578:22;1557:53;:::i;:::-;1547:63;;1503:117;1431:196;;;;:::o;1633:407::-;1701:6;1709;1758:2;1746:9;1737:7;1733:23;1729:32;1726:2;;;1774:1;1771;1764:12;1726:2;1817:1;1842:53;1887:7;1878:6;1867:9;1863:22;1842:53;:::i;:::-;1832:63;;1788:117;1944:2;1970:53;2015:7;2006:6;1995:9;1991:22;1970:53;:::i;:::-;1960:63;;1915:118;1716:324;;;;;:::o;2046:552::-;2123:6;2131;2139;2188:2;2176:9;2167:7;2163:23;2159:32;2156:2;;;2204:1;2201;2194:12;2156:2;2247:1;2272:53;2317:7;2308:6;2297:9;2293:22;2272:53;:::i;:::-;2262:63;;2218:117;2374:2;2400:53;2445:7;2436:6;2425:9;2421:22;2400:53;:::i;:::-;2390:63;;2345:118;2502:2;2528:53;2573:7;2564:6;2553:9;2549:22;2528:53;:::i;:::-;2518:63;;2473:118;2146:452;;;;;:::o;2604:809::-;2699:6;2707;2715;2723;2772:3;2760:9;2751:7;2747:23;2743:33;2740:2;;;2789:1;2786;2779:12;2740:2;2832:1;2857:53;2902:7;2893:6;2882:9;2878:22;2857:53;:::i;:::-;2847:63;;2803:117;2959:2;2985:53;3030:7;3021:6;3010:9;3006:22;2985:53;:::i;:::-;2975:63;;2930:118;3087:2;3113:53;3158:7;3149:6;3138:9;3134:22;3113:53;:::i;:::-;3103:63;;3058:118;3243:2;3232:9;3228:18;3215:32;3274:18;3266:6;3263:30;3260:2;;;3306:1;3303;3296:12;3260:2;3334:62;3388:7;3379:6;3368:9;3364:22;3334:62;:::i;:::-;3324:72;;3186:220;2730:683;;;;;;;:::o;3419:401::-;3484:6;3492;3541:2;3529:9;3520:7;3516:23;3512:32;3509:2;;;3557:1;3554;3547:12;3509:2;3600:1;3625:53;3670:7;3661:6;3650:9;3646:22;3625:53;:::i;:::-;3615:63;;3571:117;3727:2;3753:50;3795:7;3786:6;3775:9;3771:22;3753:50;:::i;:::-;3743:60;;3698:115;3499:321;;;;;:::o;3826:407::-;3894:6;3902;3951:2;3939:9;3930:7;3926:23;3922:32;3919:2;;;3967:1;3964;3957:12;3919:2;4010:1;4035:53;4080:7;4071:6;4060:9;4056:22;4035:53;:::i;:::-;4025:63;;3981:117;4137:2;4163:53;4208:7;4199:6;4188:9;4184:22;4163:53;:::i;:::-;4153:63;;4108:118;3909:324;;;;;:::o;4239:260::-;4297:6;4346:2;4334:9;4325:7;4321:23;4317:32;4314:2;;;4362:1;4359;4352:12;4314:2;4405:1;4430:52;4474:7;4465:6;4454:9;4450:22;4430:52;:::i;:::-;4420:62;;4376:116;4304:195;;;;:::o;4505:282::-;4574:6;4623:2;4611:9;4602:7;4598:23;4594:32;4591:2;;;4639:1;4636;4629:12;4591:2;4682:1;4707:63;4762:7;4753:6;4742:9;4738:22;4707:63;:::i;:::-;4697:73;;4653:127;4581:206;;;;:::o;4793:262::-;4852:6;4901:2;4889:9;4880:7;4876:23;4872:32;4869:2;;;4917:1;4914;4907:12;4869:2;4960:1;4985:53;5030:7;5021:6;5010:9;5006:22;4985:53;:::i;:::-;4975:63;;4931:117;4859:196;;;;:::o;5061:118::-;5148:24;5166:5;5148:24;:::i;:::-;5143:3;5136:37;5126:53;;:::o;5185:109::-;5266:21;5281:5;5266:21;:::i;:::-;5261:3;5254:34;5244:50;;:::o;5300:360::-;5386:3;5414:38;5446:5;5414:38;:::i;:::-;5468:70;5531:6;5526:3;5468:70;:::i;:::-;5461:77;;5547:52;5592:6;5587:3;5580:4;5573:5;5569:16;5547:52;:::i;:::-;5624:29;5646:6;5624:29;:::i;:::-;5619:3;5615:39;5608:46;;5390:270;;;;;:::o;5666:364::-;5754:3;5782:39;5815:5;5782:39;:::i;:::-;5837:71;5901:6;5896:3;5837:71;:::i;:::-;5830:78;;5917:52;5962:6;5957:3;5950:4;5943:5;5939:16;5917:52;:::i;:::-;5994:29;6016:6;5994:29;:::i;:::-;5989:3;5985:39;5978:46;;5758:272;;;;;:::o;6036:377::-;6142:3;6170:39;6203:5;6170:39;:::i;:::-;6225:89;6307:6;6302:3;6225:89;:::i;:::-;6218:96;;6323:52;6368:6;6363:3;6356:4;6349:5;6345:16;6323:52;:::i;:::-;6400:6;6395:3;6391:16;6384:23;;6146:267;;;;;:::o;6419:404::-;6579:3;6600:86;6682:3;6677;6600:86;:::i;:::-;6593:93;;6695;6784:3;6695:93;:::i;:::-;6813:3;6808;6804:13;6797:20;;6583:240;;;:::o;6829:366::-;6971:3;6992:67;7056:2;7051:3;6992:67;:::i;:::-;6985:74;;7068:93;7157:3;7068:93;:::i;:::-;7186:2;7181:3;7177:12;7170:19;;6975:220;;;:::o;7201:366::-;7343:3;7364:67;7428:2;7423:3;7364:67;:::i;:::-;7357:74;;7440:93;7529:3;7440:93;:::i;:::-;7558:2;7553:3;7549:12;7542:19;;7347:220;;;:::o;7573:366::-;7715:3;7736:67;7800:2;7795:3;7736:67;:::i;:::-;7729:74;;7812:93;7901:3;7812:93;:::i;:::-;7930:2;7925:3;7921:12;7914:19;;7719:220;;;:::o;7945:402::-;8105:3;8126:85;8208:2;8203:3;8126:85;:::i;:::-;8119:92;;8220:93;8309:3;8220:93;:::i;:::-;8338:2;8333:3;8329:12;8322:19;;8109:238;;;:::o;8353:366::-;8495:3;8516:67;8580:2;8575:3;8516:67;:::i;:::-;8509:74;;8592:93;8681:3;8592:93;:::i;:::-;8710:2;8705:3;8701:12;8694:19;;8499:220;;;:::o;8725:404::-;8885:3;8906:86;8988:3;8983;8906:86;:::i;:::-;8899:93;;9001;9090:3;9001:93;:::i;:::-;9119:3;9114;9110:13;9103:20;;8889:240;;;:::o;9135:118::-;9222:24;9240:5;9222:24;:::i;:::-;9217:3;9210:37;9200:53;;:::o;9259:381::-;9444:3;9466:148;9610:3;9466:148;:::i;:::-;9459:155;;9631:3;9624:10;;9448:192;;;:::o;9646:541::-;9879:3;9901:148;10045:3;9901:148;:::i;:::-;9894:155;;10066:95;10157:3;10148:6;10066:95;:::i;:::-;10059:102;;10178:3;10171:10;;9883:304;;;;:::o;10193:381::-;10378:3;10400:148;10544:3;10400:148;:::i;:::-;10393:155;;10565:3;10558:10;;10382:192;;;:::o;10580:222::-;10673:4;10711:2;10700:9;10696:18;10688:26;;10724:71;10792:1;10781:9;10777:17;10768:6;10724:71;:::i;:::-;10678:124;;;;:::o;10808:640::-;11003:4;11041:3;11030:9;11026:19;11018:27;;11055:71;11123:1;11112:9;11108:17;11099:6;11055:71;:::i;:::-;11136:72;11204:2;11193:9;11189:18;11180:6;11136:72;:::i;:::-;11218;11286:2;11275:9;11271:18;11262:6;11218:72;:::i;:::-;11337:9;11331:4;11327:20;11322:2;11311:9;11307:18;11300:48;11365:76;11436:4;11427:6;11365:76;:::i;:::-;11357:84;;11008:440;;;;;;;:::o;11454:210::-;11541:4;11579:2;11568:9;11564:18;11556:26;;11592:65;11654:1;11643:9;11639:17;11630:6;11592:65;:::i;:::-;11546:118;;;;:::o;11670:313::-;11783:4;11821:2;11810:9;11806:18;11798:26;;11870:9;11864:4;11860:20;11856:1;11845:9;11841:17;11834:47;11898:78;11971:4;11962:6;11898:78;:::i;:::-;11890:86;;11788:195;;;;:::o;11989:419::-;12155:4;12193:2;12182:9;12178:18;12170:26;;12242:9;12236:4;12232:20;12228:1;12217:9;12213:17;12206:47;12270:131;12396:4;12270:131;:::i;:::-;12262:139;;12160:248;;;:::o;12414:419::-;12580:4;12618:2;12607:9;12603:18;12595:26;;12667:9;12661:4;12657:20;12653:1;12642:9;12638:17;12631:47;12695:131;12821:4;12695:131;:::i;:::-;12687:139;;12585:248;;;:::o;12839:419::-;13005:4;13043:2;13032:9;13028:18;13020:26;;13092:9;13086:4;13082:20;13078:1;13067:9;13063:17;13056:47;13120:131;13246:4;13120:131;:::i;:::-;13112:139;;13010:248;;;:::o;13264:419::-;13430:4;13468:2;13457:9;13453:18;13445:26;;13517:9;13511:4;13507:20;13503:1;13492:9;13488:17;13481:47;13545:131;13671:4;13545:131;:::i;:::-;13537:139;;13435:248;;;:::o;13689:222::-;13782:4;13820:2;13809:9;13805:18;13797:26;;13833:71;13901:1;13890:9;13886:17;13877:6;13833:71;:::i;:::-;13787:124;;;;:::o;13917:129::-;13951:6;13978:20;;:::i;:::-;13968:30;;14007:33;14035:4;14027:6;14007:33;:::i;:::-;13958:88;;;:::o;14052:75::-;14085:6;14118:2;14112:9;14102:19;;14092:35;:::o;14133:307::-;14194:4;14284:18;14276:6;14273:30;14270:2;;;14306:18;;:::i;:::-;14270:2;14344:29;14366:6;14344:29;:::i;:::-;14336:37;;14428:4;14422;14418:15;14410:23;;14199:241;;;:::o;14446:98::-;14497:6;14531:5;14525:12;14515:22;;14504:40;;;:::o;14550:99::-;14602:6;14636:5;14630:12;14620:22;;14609:40;;;:::o;14655:168::-;14738:11;14772:6;14767:3;14760:19;14812:4;14807:3;14803:14;14788:29;;14750:73;;;;:::o;14829:169::-;14913:11;14947:6;14942:3;14935:19;14987:4;14982:3;14978:14;14963:29;;14925:73;;;;:::o;15004:148::-;15106:11;15143:3;15128:18;;15118:34;;;;:::o;15158:305::-;15198:3;15217:20;15235:1;15217:20;:::i;:::-;15212:25;;15251:20;15269:1;15251:20;:::i;:::-;15246:25;;15405:1;15337:66;15333:74;15330:1;15327:81;15324:2;;;15411:18;;:::i;:::-;15324:2;15455:1;15452;15448:9;15441:16;;15202:261;;;;:::o;15469:185::-;15509:1;15526:20;15544:1;15526:20;:::i;:::-;15521:25;;15560:20;15578:1;15560:20;:::i;:::-;15555:25;;15599:1;15589:2;;15604:18;;:::i;:::-;15589:2;15646:1;15643;15639:9;15634:14;;15511:143;;;;:::o;15660:348::-;15700:7;15723:20;15741:1;15723:20;:::i;:::-;15718:25;;15757:20;15775:1;15757:20;:::i;:::-;15752:25;;15945:1;15877:66;15873:74;15870:1;15867:81;15862:1;15855:9;15848:17;15844:105;15841:2;;;15952:18;;:::i;:::-;15841:2;16000:1;15997;15993:9;15982:20;;15708:300;;;;:::o;16014:96::-;16051:7;16080:24;16098:5;16080:24;:::i;:::-;16069:35;;16059:51;;;:::o;16116:90::-;16150:7;16193:5;16186:13;16179:21;16168:32;;16158:48;;;:::o;16212:149::-;16248:7;16288:66;16281:5;16277:78;16266:89;;16256:105;;;:::o;16367:126::-;16404:7;16444:42;16437:5;16433:54;16422:65;;16412:81;;;:::o;16499:77::-;16536:7;16565:5;16554:16;;16544:32;;;:::o;16582:154::-;16666:6;16661:3;16656;16643:30;16728:1;16719:6;16714:3;16710:16;16703:27;16633:103;;;:::o;16742:307::-;16810:1;16820:113;16834:6;16831:1;16828:13;16820:113;;;16919:1;16914:3;16910:11;16904:18;16900:1;16895:3;16891:11;16884:39;16856:2;16853:1;16849:10;16844:15;;16820:113;;;16951:6;16948:1;16945:13;16942:2;;;17031:1;17022:6;17017:3;17013:16;17006:27;16942:2;16791:258;;;;:::o;17055:320::-;17099:6;17136:1;17130:4;17126:12;17116:22;;17183:1;17177:4;17173:12;17204:18;17194:2;;17260:4;17252:6;17248:17;17238:27;;17194:2;17322;17314:6;17311:14;17291:18;17288:38;17285:2;;;17341:18;;:::i;:::-;17285:2;17106:269;;;;:::o;17381:281::-;17464:27;17486:4;17464:27;:::i;:::-;17456:6;17452:40;17594:6;17582:10;17579:22;17558:18;17546:10;17543:34;17540:62;17537:2;;;17605:18;;:::i;:::-;17537:2;17645:10;17641:2;17634:22;17424:238;;;:::o;17668:176::-;17700:1;17717:20;17735:1;17717:20;:::i;:::-;17712:25;;17751:20;17769:1;17751:20;:::i;:::-;17746:25;;17790:1;17780:2;;17795:18;;:::i;:::-;17780:2;17836:1;17833;17829:9;17824:14;;17702:142;;;;:::o;17850:180::-;17898:77;17895:1;17888:88;17995:4;17992:1;17985:15;18019:4;18016:1;18009:15;18036:180;18084:77;18081:1;18074:88;18181:4;18178:1;18171:15;18205:4;18202:1;18195:15;18222:180;18270:77;18267:1;18260:88;18367:4;18364:1;18357:15;18391:4;18388:1;18381:15;18408:180;18456:77;18453:1;18446:88;18553:4;18550:1;18543:15;18577:4;18574:1;18567:15;18594:102;18635:6;18686:2;18682:7;18677:2;18670:5;18666:14;18662:28;18652:38;;18642:54;;;:::o;18702:587::-;18842:66;18838:1;18830:6;18826:14;18819:90;18943:66;18938:2;18930:6;18926:15;18919:91;19044:66;19039:2;19031:6;19027:15;19020:91;19145:34;19140:2;19132:6;19128:15;19121:59;19215:66;19209:3;19201:6;19197:16;19190:92;18808:481;:::o;19295:225::-;19435:34;19431:1;19423:6;19419:14;19412:58;19504:8;19499:2;19491:6;19487:15;19480:33;19401:119;:::o;19526:239::-;19666:34;19662:1;19654:6;19650:14;19643:58;19735:22;19730:2;19722:6;19718:15;19711:47;19632:133;:::o;19771:182::-;19911:34;19907:1;19899:6;19895:14;19888:58;19877:76;:::o;19959:179::-;20099:31;20095:1;20087:6;20083:14;20076:55;20065:73;:::o;20144:243::-;20284:34;20280:1;20272:6;20268:14;20261:58;20353:26;20348:2;20340:6;20336:15;20329:51;20250:137;:::o;20393:517::-;20533:66;20529:1;20521:6;20517:14;20510:90;20634:66;20629:2;20621:6;20617:15;20610:91;20735:66;20730:2;20722:6;20718:15;20711:91;20836:66;20831:2;20823:6;20819:15;20812:91;20499:411;:::o;20916:122::-;20989:24;21007:5;20989:24;:::i;:::-;20982:5;20979:35;20969:2;;21028:1;21025;21018:12;20969:2;20959:79;:::o;21044:116::-;21114:21;21129:5;21114:21;:::i;:::-;21107:5;21104:32;21094:2;;21150:1;21147;21140:12;21094:2;21084:76;:::o;21166:120::-;21238:23;21255:5;21238:23;:::i;:::-;21231:5;21228:34;21218:2;;21276:1;21273;21266:12;21218:2;21208:78;:::o;21292:122::-;21365:24;21383:5;21365:24;:::i;:::-;21358:5;21355:35;21345:2;;21404:1;21401;21394:12;21345:2;21335:79;:::o
Swarm Source
ipfs://396a2a0e087edc0f959ed653e3831650005d8746e1da5265b89a9f4a7d7783dd
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.