SappySeals
Deploy on AlchemyContract Information
The following smart contract is called SappySeals and it is an ERC721 token with URI storage. It allows for the minting of seals with a maximum batch size of 20 and a total count of 10,000. There is a whitelist feature for presale minting and an admin minting function. The contract also has functions for changing the base URI, price, and start date.
More Info
// Sources flattened with hardhat v2.5.0 https://hardhat.org
// File contracts/utils/introspection/IERC165.sol
// SPDX-License-Identifier: MIT
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 contracts/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 contracts/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 contracts/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 contracts/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;
// solhint-disable-next-line no-inline-assembly
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");
// solhint-disable-next-line avoid-low-level-calls, avoid-call-value
(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");
// solhint-disable-next-line avoid-low-level-calls
(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");
// solhint-disable-next-line avoid-low-level-calls
(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");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.delegatecall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private 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
// solhint-disable-next-line no-inline-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
// File contracts/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) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
}
// File contracts/utils/Strings.sol
pragma solidity ^0.8.0;
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant alphabet = "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] = alphabet[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
}
// File contracts/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 contracts/token/ERC721/ERC721.sol
pragma solidity ^0.8.0;
/**
* @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
* the Metadata extension, but not including the Enumerable extension, which is available separately as
* {ERC721Enumerable}.
*/
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
using Address for address;
using Strings for uint256;
// Token name
string private _name;
// Token symbol
string private _symbol;
// Mapping from token ID to owner address
mapping (uint256 => address) private _owners;
// Mapping owner address to token count
mapping (address => uint256) private _balances;
// 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;
/**
* @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
*/
constructor (string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
/**
* @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 virtual override returns (uint256) {
require(owner != address(0), "ERC721: balance query for the zero address");
return _balances[owner];
}
/**
* @dev See {IERC721-ownerOf}.
*/
function ownerOf(uint256 tokenId) public view virtual override returns (address) {
address owner = _owners[tokenId];
require(owner != address(0), "ERC721: owner query for nonexistent token");
return owner;
}
/**
* @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) {
require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
string memory baseURI = _baseURI();
return bytes(baseURI).length > 0
? string(abi.encodePacked(baseURI, tokenId.toString()))
: '';
}
/**
* @dev Base URI for computing {tokenURI}. 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 virtual override {
address owner = ERC721.ownerOf(tokenId);
require(to != owner, "ERC721: approval to current owner");
require(_msgSender() == owner || isApprovedForAll(owner, _msgSender()),
"ERC721: approve caller is not owner nor approved for all"
);
_approve(to, tokenId);
}
/**
* @dev See {IERC721-getApproved}.
*/
function getApproved(uint256 tokenId) public view virtual override returns (address) {
require(_exists(tokenId), "ERC721: approved query for nonexistent token");
return _tokenApprovals[tokenId];
}
/**
* @dev See {IERC721-setApprovalForAll}.
*/
function setApprovalForAll(address operator, bool approved) public virtual override {
require(operator != _msgSender(), "ERC721: approve to caller");
_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 {
//solhint-disable-next-line max-line-length
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
_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 {
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
_safeTransfer(from, to, tokenId, _data);
}
/**
* @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.
*
* `_data` is additional data, it has no specified format and it is sent in call to `to`.
*
* This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
* implement alternative mechanisms to perform token transfer, such as signature-based.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual {
_transfer(from, to, tokenId);
require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
}
/**
* @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`),
* and stop existing when they are burned (`_burn`).
*/
function _exists(uint256 tokenId) internal view virtual returns (bool) {
return _owners[tokenId] != address(0);
}
/**
* @dev Returns whether `spender` is allowed to manage `tokenId`.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
require(_exists(tokenId), "ERC721: operator query for nonexistent token");
address owner = ERC721.ownerOf(tokenId);
return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
}
/**
* @dev Safely mints `tokenId` and transfers it to `to`.
*
* Requirements:
*
* - `tokenId` must not exist.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function _safeMint(address to, uint256 tokenId) internal virtual {
_safeMint(to, tokenId, "");
}
/**
* @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
* forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
*/
function _safeMint(address to, uint256 tokenId, bytes memory _data) internal virtual {
_mint(to, tokenId);
require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
}
/**
* @dev Mints `tokenId` and transfers it to `to`.
*
* WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
*
* Requirements:
*
* - `tokenId` must not exist.
* - `to` cannot be the zero address.
*
* Emits a {Transfer} event.
*/
function _mint(address to, uint256 tokenId) internal virtual {
require(to != address(0), "ERC721: mint to the zero address");
require(!_exists(tokenId), "ERC721: token already minted");
_beforeTokenTransfer(address(0), to, tokenId);
_balances[to] += 1;
_owners[tokenId] = to;
emit Transfer(address(0), to, tokenId);
}
/**
* @dev Destroys `tokenId`.
* The approval is cleared when the token is burned.
*
* Requirements:
*
* - `tokenId` must exist.
*
* Emits a {Transfer} event.
*/
function _burn(uint256 tokenId) internal virtual {
address owner = ERC721.ownerOf(tokenId);
_beforeTokenTransfer(owner, address(0), tokenId);
// Clear approvals
_approve(address(0), tokenId);
_balances[owner] -= 1;
delete _owners[tokenId];
emit Transfer(owner, address(0), tokenId);
}
/**
* @dev Transfers `tokenId` from `from` to `to`.
* As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
*
* 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) internal virtual {
require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
require(to != address(0), "ERC721: transfer to the zero address");
_beforeTokenTransfer(from, to, tokenId);
// Clear approvals from the previous owner
_approve(address(0), tokenId);
_balances[from] -= 1;
_balances[to] += 1;
_owners[tokenId] = to;
emit Transfer(from, to, tokenId);
}
/**
* @dev Approve `to` to operate on `tokenId`
*
* Emits a {Approval} event.
*/
function _approve(address to, uint256 tokenId) internal virtual {
_tokenApprovals[tokenId] = to;
emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
}
/**
* @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
* The call is not executed if the target address is not a 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 _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data)
private returns (bool)
{
if (to.isContract()) {
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("ERC721: transfer to non ERC721Receiver implementer");
} else {
// solhint-disable-next-line no-inline-assembly
assembly {
revert(add(32, reason), mload(reason))
}
}
}
} else {
return true;
}
}
/**
* @dev Hook that is called before any token transfer. This includes minting
* and burning.
*
* 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, ``from``'s `tokenId` will be burned.
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual { }
}
// File contracts/token/ERC721/extensions/ERC721URIStorage.sol
pragma solidity ^0.8.0;
/**
* @dev ERC721 token with storage based token URI management.
*/
abstract contract ERC721URIStorage is ERC721 {
using Strings for uint256;
// Optional mapping for token URIs
mapping (uint256 => string) private _tokenURIs;
/**
* @dev See {IERC721Metadata-tokenURI}.
*/
function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token");
string memory _tokenURI = _tokenURIs[tokenId];
string memory base = _baseURI();
// If there is no base URI, return the token URI.
if (bytes(base).length == 0) {
return _tokenURI;
}
// If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
if (bytes(_tokenURI).length > 0) {
return string(abi.encodePacked(base, _tokenURI));
}
return super.tokenURI(tokenId);
}
/**
* @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
_tokenURIs[tokenId] = _tokenURI;
}
/**
* @dev Destroys `tokenId`.
* The approval is cleared when the token is burned.
*
* Requirements:
*
* - `tokenId` must exist.
*
* Emits a {Transfer} event.
*/
function _burn(uint256 tokenId) internal virtual override {
super._burn(tokenId);
if (bytes(_tokenURIs[tokenId]).length != 0) {
delete _tokenURIs[tokenId];
}
}
}
// File contracts/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 () {
address msgSender = _msgSender();
_owner = msgSender;
emit OwnershipTransferred(address(0), 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 {
emit OwnershipTransferred(_owner, address(0));
_owner = 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");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
}
pragma solidity ^0.8.0;
contract SappySeals is ERC721URIStorage, Ownable{
event MintSeals (address indexed minter, uint256 startWith, uint256 times);
uint256 public totalSeals;
uint256 public totalCount = 10000; //bruhTotal
uint256 public maxBatch = 20; // bruhBatch
uint256 public price = 60000000000000000; // 0.06 eth
uint256 public releaseUnix = 1630447200; // works KEKW
uint256 public presaleRelease = 1630445400; // presale time (please work)
string public baseURI;
bool public started;
bool public whiteListStart;
mapping(address => bool) whiteList;
mapping(address => uint256) whiteListMintCount;
uint addressRegistryCount;
constructor(string memory name_, string memory symbol_, string memory baseURI_) ERC721(name_, symbol_) {
baseURI = baseURI_;
}
modifier canWhitelistMint() {
require(block.timestamp >= presaleRelease, "Wait buddy");
require(whiteListStart, "Hang on boys, youll get in soon");
require(whiteList[msg.sender] == true, "Not whitelisted.");
_;
}
modifier mintEnabled() {
require(block.timestamp >= releaseUnix, "Wait buddy");
require(started, "not started");
_;
}
function totalSupply() public view virtual returns (uint256) {
return totalSeals;
}
function _baseURI() internal view virtual override returns (string memory){
return baseURI;
}
function setBaseURI(string memory _newURI) public onlyOwner {
baseURI = _newURI;
}
function changePrice(uint256 _newPrice) public onlyOwner {
price = _newPrice;
}
function changeStartDate(uint256 newDate) public onlyOwner {
releaseUnix = newDate;
}
function changePresaleStartDate(uint256 newDate) public onlyOwner {
presaleRelease = newDate;
}
function setTokenURI(uint256 _tokenId, string memory _tokenURI) public onlyOwner {
_setTokenURI(_tokenId, _tokenURI);
}
function setNormalStart(bool _start) public onlyOwner {
started = _start;
}
function setWhiteListStart(bool _start) public onlyOwner {
whiteListStart = _start;
}
function getWhitelistMintAmount(address _addr) public view virtual returns (uint256) {
return whiteListMintCount[_addr];
}
function mintSeal(uint256 _times) payable public mintEnabled {
require(_times >0 && _times <= maxBatch, "mint wrong number");
require(totalSeals + _times <= totalCount, "too much");
require(msg.value == _times * price, "value error");
payable(owner()).transfer(msg.value);
emit MintSeals(_msgSender(), totalSeals+1, _times);
for(uint256 i=0; i< _times; i++){
_mint(_msgSender(), 1 + totalSeals++);
}
}
function adminMint(uint256 _times) payable public onlyOwner {
require(_times >0 && _times <= maxBatch, "mint wrong number");
require(totalSeals + _times <= totalCount, "too much");
require(msg.value == _times * price, "value error");
payable(owner()).transfer(msg.value);
emit MintSeals(_msgSender(), totalSeals+1, _times);
for(uint256 i=0; i< _times; i++){
_mint(_msgSender(), 1 + totalSeals++);
}
}
function whitelistMint(uint _times) payable public canWhitelistMint {
require(whiteListMintCount[msg.sender] - _times >= 0, "Over mint limit for address.");
require(totalSeals + _times <= totalCount, "Mint amount will exceed total collection amount.");
require(msg.value == _times * price, "Incorrect transaction value.");
payable(owner()).transfer(msg.value);
whiteListMintCount[_msgSender()] -= _times;
emit MintSeals(_msgSender(), totalSeals+1, _times);
for(uint256 i=0; i< _times; i++){
_mint(_msgSender(), 1 + totalSeals++);
}
}
function adminMintGiveaways(address _addr) public onlyOwner {
require(totalSeals + 1 <= totalCount, "Mint amount will exceed total collection amount.");
emit MintSeals(_addr, totalSeals+1, 1);
_mint(_addr, 1 + totalSeals++);
}
function addToWhitelist(address _addr, uint numberOfMints) public onlyOwner {
whiteList[_addr] = true;
whiteListMintCount[_addr] = numberOfMints;
addressRegistryCount++;
}
function addToWhitelistBulk(address[] memory _addr,uint[] memory _numberOfMints) public onlyOwner {
for(uint256 i = 0; i < _addr.length; i++){
whiteList[_addr[i]] = true;
whiteListMintCount[_addr[i]] = _numberOfMints[i];
}
}
//Check address is in whiteList
function isAddressInWhitelist(address _addr) public view virtual returns(bool) {
return whiteList[_addr] == true;
}
}
[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"string","name":"baseURI_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"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":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"startWith","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"times","type":"uint256"}],"name":"MintSeals","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":"_addr","type":"address"},{"internalType":"uint256","name":"numberOfMints","type":"uint256"}],"name":"addToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addr","type":"address[]"},{"internalType":"uint256[]","name":"_numberOfMints","type":"uint256[]"}],"name":"addToWhitelistBulk","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_times","type":"uint256"}],"name":"adminMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"adminMintGiveaways","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newDate","type":"uint256"}],"name":"changePresaleStartDate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"changePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newDate","type":"uint256"}],"name":"changeStartDate","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":"_addr","type":"address"}],"name":"getWhitelistMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"isAddressInWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"maxBatch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_times","type":"uint256"}],"name":"mintSeal","outputs":[],"stateMutability":"payable","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":"presaleRelease","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"releaseUnix","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_start","type":"bool"}],"name":"setNormalStart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_start","type":"bool"}],"name":"setWhiteListStart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"started","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"totalCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSeals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whiteListStart","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_times","type":"uint256"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"}]
[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"string","name":"baseURI_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"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":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"startWith","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"times","type":"uint256"}],"name":"MintSeals","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":"_addr","type":"address"},{"internalType":"uint256","name":"numberOfMints","type":"uint256"}],"name":"addToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addr","type":"address[]"},{"internalType":"uint256[]","name":"_numberOfMints","type":"uint256[]"}],"name":"addToWhitelistBulk","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_times","type":"uint256"}],"name":"adminMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"adminMintGiveaways","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newDate","type":"uint256"}],"name":"changePresaleStartDate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"changePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newDate","type":"uint256"}],"name":"changeStartDate","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":"_addr","type":"address"}],"name":"getWhitelistMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"isAddressInWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"maxBatch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_times","type":"uint256"}],"name":"mintSeal","outputs":[],"stateMutability":"payable","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":"presaleRelease","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"releaseUnix","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_start","type":"bool"}],"name":"setNormalStart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_start","type":"bool"}],"name":"setWhiteListStart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"started","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"totalCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSeals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whiteListStart","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_times","type":"uint256"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"}]
60806040526127106009556014600a5566d529ae9e860000600b5563612ea660600c5563612e9f58600d553480156200003757600080fd5b50604051620054df380380620054df83398181016040528101906200005d919062000290565b82828160009080519060200190620000779291906200016e565b508060019080519060200190620000909291906200016e565b5050506000620000a56200016660201b60201c565b905080600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35080600e90805190602001906200015c9291906200016e565b50505050620004a1565b600033905090565b8280546200017c90620003c6565b90600052602060002090601f016020900481019282620001a05760008555620001ec565b82601f10620001bb57805160ff1916838001178555620001ec565b82800160010185558215620001ec579182015b82811115620001eb578251825591602001919060010190620001ce565b5b509050620001fb9190620001ff565b5090565b5b808211156200021a57600081600090555060010162000200565b5090565b6000620002356200022f846200035a565b62000331565b9050828152602081018484840111156200024e57600080fd5b6200025b84828562000390565b509392505050565b600082601f8301126200027557600080fd5b8151620002878482602086016200021e565b91505092915050565b600080600060608486031215620002a657600080fd5b600084015167ffffffffffffffff811115620002c157600080fd5b620002cf8682870162000263565b935050602084015167ffffffffffffffff811115620002ed57600080fd5b620002fb8682870162000263565b925050604084015167ffffffffffffffff8111156200031957600080fd5b620003278682870162000263565b9150509250925092565b60006200033d62000350565b90506200034b8282620003fc565b919050565b6000604051905090565b600067ffffffffffffffff82111562000378576200037762000461565b5b620003838262000490565b9050602081019050919050565b60005b83811015620003b057808201518184015260208101905062000393565b83811115620003c0576000848401525b50505050565b60006002820490506001821680620003df57607f821691505b60208210811415620003f657620003f562000432565b5b50919050565b620004078262000490565b810181811067ffffffffffffffff8211171562000429576200042862000461565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b61502e80620004b16000396000f3fe6080604052600436106102455760003560e01c8063715018a611610139578063a035b1fe116100b6578063c1f261231161007a578063c1f2612314610856578063c87b56dd14610872578063d0f2a114146108af578063d9ff054e146108cb578063e985e9c5146108f6578063f2fde38b1461093357610245565b8063a035b1fe14610787578063a22cb465146107b2578063a2b40d19146107db578063b88d4fde14610804578063bffb26ce1461082d57610245565b8063917bb57f116100fd578063917bb57f1461069057806395d89b41146106b95780639955fc45146106e45780639a3132991461070d5780639afdf2f31461074a57610245565b8063715018a6146105dc57806383ebc808146105f3578063868ff4a21461061e57806388eae7051461063a5780638da5cb5b1461066557610245565b806334eafb11116101c75780635f4f603d1161018b5780635f4f603d146104e35780636352211e1461050c57806367765b87146105495780636c0360eb1461057457806370a082311461059f57610245565b806334eafb11146104125780633c49a8a91461043d57806342842e0e146104665780635082aed51461048f57806355f804b3146104ba57610245565b8063162094c41161020e578063162094c41461034157806318160ddd1461036a5780631f2698ab14610395578063214405fc146103c057806323b872dd146103e957610245565b8062739f2a1461024a57806301ffc9a71461027357806306fdde03146102b0578063081812fc146102db578063095ea7b314610318575b600080fd5b34801561025657600080fd5b50610271600480360381019061026c9190613a58565b61095c565b005b34801561027f57600080fd5b5061029a600480360381019061029591906139c5565b6109e2565b6040516102a79190614013565b60405180910390f35b3480156102bc57600080fd5b506102c5610ac4565b6040516102d2919061402e565b60405180910390f35b3480156102e757600080fd5b5061030260048036038101906102fd9190613a58565b610b56565b60405161030f9190613fac565b60405180910390f35b34801561032457600080fd5b5061033f600480360381019061033a91906138f4565b610bdb565b005b34801561034d57600080fd5b5061036860048036038101906103639190613a81565b610cf3565b005b34801561037657600080fd5b5061037f610d7d565b60405161038c91906143d0565b60405180910390f35b3480156103a157600080fd5b506103aa610d87565b6040516103b79190614013565b60405180910390f35b3480156103cc57600080fd5b506103e760048036038101906103e291906138f4565b610d9a565b005b3480156103f557600080fd5b50610410600480360381019061040b91906137ee565b610ece565b005b34801561041e57600080fd5b50610427610f2e565b60405161043491906143d0565b60405180910390f35b34801561044957600080fd5b50610464600480360381019061045f9190613789565b610f34565b005b34801561047257600080fd5b5061048d600480360381019061048891906137ee565b611091565b005b34801561049b57600080fd5b506104a46110b1565b6040516104b191906143d0565b60405180910390f35b3480156104c657600080fd5b506104e160048036038101906104dc9190613a17565b6110b7565b005b3480156104ef57600080fd5b5061050a6004803603810190610505919061399c565b61114d565b005b34801561051857600080fd5b50610533600480360381019061052e9190613a58565b6111e6565b6040516105409190613fac565b60405180910390f35b34801561055557600080fd5b5061055e611298565b60405161056b91906143d0565b60405180910390f35b34801561058057600080fd5b5061058961129e565b604051610596919061402e565b60405180910390f35b3480156105ab57600080fd5b506105c660048036038101906105c19190613789565b61132c565b6040516105d391906143d0565b60405180910390f35b3480156105e857600080fd5b506105f16113e4565b005b3480156105ff57600080fd5b50610608611521565b60405161061591906143d0565b60405180910390f35b61063860048036038101906106339190613a58565b611527565b005b34801561064657600080fd5b5061064f6118e2565b60405161065c9190614013565b60405180910390f35b34801561067157600080fd5b5061067a6118f5565b6040516106879190613fac565b60405180910390f35b34801561069c57600080fd5b506106b760048036038101906106b2919061399c565b61191f565b005b3480156106c557600080fd5b506106ce6119b8565b6040516106db919061402e565b60405180910390f35b3480156106f057600080fd5b5061070b60048036038101906107069190613a58565b611a4a565b005b34801561071957600080fd5b50610734600480360381019061072f9190613789565b611ad0565b6040516107419190614013565b60405180910390f35b34801561075657600080fd5b50610771600480360381019061076c9190613789565b611b2d565b60405161077e91906143d0565b60405180910390f35b34801561079357600080fd5b5061079c611b76565b6040516107a991906143d0565b60405180910390f35b3480156107be57600080fd5b506107d960048036038101906107d491906138b8565b611b7c565b005b3480156107e757600080fd5b5061080260048036038101906107fd9190613a58565b611cfd565b005b34801561081057600080fd5b5061082b6004803603810190610826919061383d565b611d83565b005b34801561083957600080fd5b50610854600480360381019061084f9190613930565b611de5565b005b610870600480360381019061086b9190613a58565b611fe1565b005b34801561087e57600080fd5b5061089960048036038101906108949190613a58565b612257565b6040516108a6919061402e565b60405180910390f35b6108c960048036038101906108c49190613a58565b6123a9565b005b3480156108d757600080fd5b506108e0612637565b6040516108ed91906143d0565b60405180910390f35b34801561090257600080fd5b5061091d600480360381019061091891906137b2565b61263d565b60405161092a9190614013565b60405180910390f35b34801561093f57600080fd5b5061095a60048036038101906109559190613789565b6126d1565b005b61096461287d565b73ffffffffffffffffffffffffffffffffffffffff166109826118f5565b73ffffffffffffffffffffffffffffffffffffffff16146109d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109cf90614270565b60405180910390fd5b80600c8190555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610aad57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610abd5750610abc82612885565b5b9050919050565b606060008054610ad39061473c565b80601f0160208091040260200160405190810160405280929190818152602001828054610aff9061473c565b8015610b4c5780601f10610b2157610100808354040283529160200191610b4c565b820191906000526020600020905b815481529060010190602001808311610b2f57829003601f168201915b5050505050905090565b6000610b61826128ef565b610ba0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9790614250565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610be6826111e6565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4e906142f0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c7661287d565b73ffffffffffffffffffffffffffffffffffffffff161480610ca55750610ca481610c9f61287d565b61263d565b5b610ce4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cdb90614170565b60405180910390fd5b610cee838361295b565b505050565b610cfb61287d565b73ffffffffffffffffffffffffffffffffffffffff16610d196118f5565b73ffffffffffffffffffffffffffffffffffffffff1614610d6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6690614270565b60405180910390fd5b610d798282612a14565b5050565b6000600854905090565b600f60009054906101000a900460ff1681565b610da261287d565b73ffffffffffffffffffffffffffffffffffffffff16610dc06118f5565b73ffffffffffffffffffffffffffffffffffffffff1614610e16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0d90614270565b60405180910390fd5b6001601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060126000815480929190610ec59061479f565b91905055505050565b610edf610ed961287d565b82612a88565b610f1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1590614310565b60405180910390fd5b610f29838383612b66565b505050565b60095481565b610f3c61287d565b73ffffffffffffffffffffffffffffffffffffffff16610f5a6118f5565b73ffffffffffffffffffffffffffffffffffffffff1614610fb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa790614270565b60405180910390fd5b6009546001600854610fc2919061455f565b1115611003576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffa90614350565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff167fc1c66401eeae5b2a4ff23f6d7784eefe229334268d00c4b0e5e2c44c4ae4fda5600160085461104a919061455f565b600160405161105a9291906143eb565b60405180910390a261108e81600860008154809291906110799061479f565b919050556001611089919061455f565b612dc2565b50565b6110ac83838360405180602001604052806000815250611d83565b505050565b600d5481565b6110bf61287d565b73ffffffffffffffffffffffffffffffffffffffff166110dd6118f5565b73ffffffffffffffffffffffffffffffffffffffff1614611133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112a90614270565b60405180910390fd5b80600e9080519060200190611149929190613481565b5050565b61115561287d565b73ffffffffffffffffffffffffffffffffffffffff166111736118f5565b73ffffffffffffffffffffffffffffffffffffffff16146111c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c090614270565b60405180910390fd5b80600f60016101000a81548160ff02191690831515021790555050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561128f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611286906141b0565b60405180910390fd5b80915050919050565b600a5481565b600e80546112ab9061473c565b80601f01602080910402602001604051908101604052809291908181526020018280546112d79061473c565b80156113245780601f106112f957610100808354040283529160200191611324565b820191906000526020600020905b81548152906001019060200180831161130757829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561139d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139490614190565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6113ec61287d565b73ffffffffffffffffffffffffffffffffffffffff1661140a6118f5565b73ffffffffffffffffffffffffffffffffffffffff1614611460576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145790614270565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600c5481565b600d5442101561156c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611563906142b0565b60405180910390fd5b600f60019054906101000a900460ff166115bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b290614390565b60405180910390fd5b60011515601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151461164e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164590614330565b60405180910390fd5b600081601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461169b9190614640565b10156116dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d390614130565b60405180910390fd5b600954816008546116ed919061455f565b111561172e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172590614350565b60405180910390fd5b600b548161173c91906145e6565b341461177d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611774906141f0565b60405180910390fd5b6117856118f5565b73ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f193505050501580156117ca573d6000803e3d6000fd5b5080601160006117d861287d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118219190614640565b9250508190555061183061287d565b73ffffffffffffffffffffffffffffffffffffffff167fc1c66401eeae5b2a4ff23f6d7784eefe229334268d00c4b0e5e2c44c4ae4fda56001600854611876919061455f565b83604051611885929190614414565b60405180910390a260005b818110156118de576118cb6118a361287d565b600860008154809291906118b69061479f565b9190505560016118c6919061455f565b612dc2565b80806118d69061479f565b915050611890565b5050565b600f60019054906101000a900460ff1681565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61192761287d565b73ffffffffffffffffffffffffffffffffffffffff166119456118f5565b73ffffffffffffffffffffffffffffffffffffffff161461199b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199290614270565b60405180910390fd5b80600f60006101000a81548160ff02191690831515021790555050565b6060600180546119c79061473c565b80601f01602080910402602001604051908101604052809291908181526020018280546119f39061473c565b8015611a405780601f10611a1557610100808354040283529160200191611a40565b820191906000526020600020905b815481529060010190602001808311611a2357829003601f168201915b5050505050905090565b611a5261287d565b73ffffffffffffffffffffffffffffffffffffffff16611a706118f5565b73ffffffffffffffffffffffffffffffffffffffff1614611ac6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abd90614270565b60405180910390fd5b80600d8190555050565b600060011515601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515149050919050565b6000601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600b5481565b611b8461287d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611bf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be990614110565b60405180910390fd5b8060056000611bff61287d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611cac61287d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611cf19190614013565b60405180910390a35050565b611d0561287d565b73ffffffffffffffffffffffffffffffffffffffff16611d236118f5565b73ffffffffffffffffffffffffffffffffffffffff1614611d79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7090614270565b60405180910390fd5b80600b8190555050565b611d94611d8e61287d565b83612a88565b611dd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dca90614310565b60405180910390fd5b611ddf84848484612f90565b50505050565b611ded61287d565b73ffffffffffffffffffffffffffffffffffffffff16611e0b6118f5565b73ffffffffffffffffffffffffffffffffffffffff1614611e61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5890614270565b60405180910390fd5b60005b8251811015611fdc57600160106000858481518110611eac577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550818181518110611f3e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015160116000858481518110611f83577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508080611fd49061479f565b915050611e64565b505050565b611fe961287d565b73ffffffffffffffffffffffffffffffffffffffff166120076118f5565b73ffffffffffffffffffffffffffffffffffffffff161461205d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205490614270565b60405180910390fd5b60008111801561206f5750600a548111155b6120ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a5906140d0565b60405180910390fd5b600954816008546120bf919061455f565b1115612100576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f790614050565b60405180910390fd5b600b548161210e91906145e6565b341461214f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612146906143b0565b60405180910390fd5b6121576118f5565b73ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f1935050505015801561219c573d6000803e3d6000fd5b506121a561287d565b73ffffffffffffffffffffffffffffffffffffffff167fc1c66401eeae5b2a4ff23f6d7784eefe229334268d00c4b0e5e2c44c4ae4fda560016008546121eb919061455f565b836040516121fa929190614414565b60405180910390a260005b818110156122535761224061221861287d565b6008600081548092919061222b9061479f565b91905055600161223b919061455f565b612dc2565b808061224b9061479f565b915050612205565b5050565b6060612262826128ef565b6122a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229890614230565b60405180910390fd5b60006006600084815260200190815260200160002080546122c19061473c565b80601f01602080910402602001604051908101604052809291908181526020018280546122ed9061473c565b801561233a5780601f1061230f5761010080835404028352916020019161233a565b820191906000526020600020905b81548152906001019060200180831161231d57829003601f168201915b50505050509050600061234b612fec565b90506000815114156123615781925050506123a4565b60008251111561239657808260405160200161237e929190613f88565b604051602081830303815290604052925050506123a4565b61239f8461307e565b925050505b919050565b600c544210156123ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e5906142b0565b60405180910390fd5b600f60009054906101000a900460ff1661243d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243490614370565b60405180910390fd5b60008111801561244f5750600a548111155b61248e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612485906140d0565b60405180910390fd5b6009548160085461249f919061455f565b11156124e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d790614050565b60405180910390fd5b600b54816124ee91906145e6565b341461252f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612526906143b0565b60405180910390fd5b6125376118f5565b73ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f1935050505015801561257c573d6000803e3d6000fd5b5061258561287d565b73ffffffffffffffffffffffffffffffffffffffff167fc1c66401eeae5b2a4ff23f6d7784eefe229334268d00c4b0e5e2c44c4ae4fda560016008546125cb919061455f565b836040516125da929190614414565b60405180910390a260005b81811015612633576126206125f861287d565b6008600081548092919061260b9061479f565b91905055600161261b919061455f565b612dc2565b808061262b9061479f565b9150506125e5565b5050565b60085481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6126d961287d565b73ffffffffffffffffffffffffffffffffffffffff166126f76118f5565b73ffffffffffffffffffffffffffffffffffffffff161461274d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274490614270565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156127bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b490614090565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600033905090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166129ce836111e6565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b612a1d826128ef565b612a5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a53906141d0565b60405180910390fd5b80600660008481526020019081526020016000209080519060200190612a83929190613481565b505050565b6000612a93826128ef565b612ad2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ac990614150565b60405180910390fd5b6000612add836111e6565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612b4c57508373ffffffffffffffffffffffffffffffffffffffff16612b3484610b56565b73ffffffffffffffffffffffffffffffffffffffff16145b80612b5d5750612b5c818561263d565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612b86826111e6565b73ffffffffffffffffffffffffffffffffffffffff1614612bdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bd390614290565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c43906140f0565b60405180910390fd5b612c57838383613125565b612c6260008261295b565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612cb29190614640565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d09919061455f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e2990614210565b60405180910390fd5b612e3b816128ef565b15612e7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e72906140b0565b60405180910390fd5b612e8760008383613125565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ed7919061455f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b612f9b848484612b66565b612fa78484848461312a565b612fe6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fdd90614070565b60405180910390fd5b50505050565b6060600e8054612ffb9061473c565b80601f01602080910402602001604051908101604052809291908181526020018280546130279061473c565b80156130745780601f1061304957610100808354040283529160200191613074565b820191906000526020600020905b81548152906001019060200180831161305757829003601f168201915b5050505050905090565b6060613089826128ef565b6130c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130bf906142d0565b60405180910390fd5b60006130d2612fec565b905060008151116130f2576040518060200160405280600081525061311d565b806130fc846132c1565b60405160200161310d929190613f88565b6040516020818303038152906040525b915050919050565b505050565b600061314b8473ffffffffffffffffffffffffffffffffffffffff1661346e565b156132b4578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261317461287d565b8786866040518563ffffffff1660e01b81526004016131969493929190613fc7565b602060405180830381600087803b1580156131b057600080fd5b505af19250505080156131e157506040513d601f19601f820116820180604052508101906131de91906139ee565b60015b613264573d8060008114613211576040519150601f19603f3d011682016040523d82523d6000602084013e613216565b606091505b5060008151141561325c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161325390614070565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506132b9565b600190505b949350505050565b60606000821415613309576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613469565b600082905060005b6000821461333b5780806133249061479f565b915050600a8261333491906145b5565b9150613311565b60008167ffffffffffffffff81111561337d577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156133af5781602001600182028036833780820191505090505b5090505b60008514613462576001826133c89190614640565b9150600a856133d791906147e8565b60306133e3919061455f565b60f81b81838151811061341f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561345b91906145b5565b94506133b3565b8093505050505b919050565b600080823b905060008111915050919050565b82805461348d9061473c565b90600052602060002090601f0160209004810192826134af57600085556134f6565b82601f106134c857805160ff19168380011785556134f6565b828001600101855582156134f6579182015b828111156134f55782518255916020019190600101906134da565b5b5090506135039190613507565b5090565b5b80821115613520576000816000905550600101613508565b5090565b600061353761353284614462565b61443d565b9050808382526020820190508285602086028201111561355657600080fd5b60005b85811015613586578161356c8882613678565b845260208401935060208301925050600181019050613559565b5050509392505050565b60006135a361359e8461448e565b61443d565b905080838252602082019050828560208602820111156135c257600080fd5b60005b858110156135f257816135d88882613774565b8452602084019350602083019250506001810190506135c5565b5050509392505050565b600061360f61360a846144ba565b61443d565b90508281526020810184848401111561362757600080fd5b6136328482856146fa565b509392505050565b600061364d613648846144eb565b61443d565b90508281526020810184848401111561366557600080fd5b6136708482856146fa565b509392505050565b60008135905061368781614f9c565b92915050565b600082601f83011261369e57600080fd5b81356136ae848260208601613524565b91505092915050565b600082601f8301126136c857600080fd5b81356136d8848260208601613590565b91505092915050565b6000813590506136f081614fb3565b92915050565b60008135905061370581614fca565b92915050565b60008151905061371a81614fca565b92915050565b600082601f83011261373157600080fd5b81356137418482602086016135fc565b91505092915050565b600082601f83011261375b57600080fd5b813561376b84826020860161363a565b91505092915050565b60008135905061378381614fe1565b92915050565b60006020828403121561379b57600080fd5b60006137a984828501613678565b91505092915050565b600080604083850312156137c557600080fd5b60006137d385828601613678565b92505060206137e485828601613678565b9150509250929050565b60008060006060848603121561380357600080fd5b600061381186828701613678565b935050602061382286828701613678565b925050604061383386828701613774565b9150509250925092565b6000806000806080858703121561385357600080fd5b600061386187828801613678565b945050602061387287828801613678565b935050604061388387828801613774565b925050606085013567ffffffffffffffff8111156138a057600080fd5b6138ac87828801613720565b91505092959194509250565b600080604083850312156138cb57600080fd5b60006138d985828601613678565b92505060206138ea858286016136e1565b9150509250929050565b6000806040838503121561390757600080fd5b600061391585828601613678565b925050602061392685828601613774565b9150509250929050565b6000806040838503121561394357600080fd5b600083013567ffffffffffffffff81111561395d57600080fd5b6139698582860161368d565b925050602083013567ffffffffffffffff81111561398657600080fd5b613992858286016136b7565b9150509250929050565b6000602082840312156139ae57600080fd5b60006139bc848285016136e1565b91505092915050565b6000602082840312156139d757600080fd5b60006139e5848285016136f6565b91505092915050565b600060208284031215613a0057600080fd5b6000613a0e8482850161370b565b91505092915050565b600060208284031215613a2957600080fd5b600082013567ffffffffffffffff811115613a4357600080fd5b613a4f8482850161374a565b91505092915050565b600060208284031215613a6a57600080fd5b6000613a7884828501613774565b91505092915050565b60008060408385031215613a9457600080fd5b6000613aa285828601613774565b925050602083013567ffffffffffffffff811115613abf57600080fd5b613acb8582860161374a565b9150509250929050565b613ade81614674565b82525050565b613aed81614686565b82525050565b6000613afe8261451c565b613b088185614532565b9350613b18818560208601614709565b613b21816148d5565b840191505092915050565b613b35816146e8565b82525050565b6000613b4682614527565b613b508185614543565b9350613b60818560208601614709565b613b69816148d5565b840191505092915050565b6000613b7f82614527565b613b898185614554565b9350613b99818560208601614709565b80840191505092915050565b6000613bb2600883614543565b9150613bbd826148e6565b602082019050919050565b6000613bd5603283614543565b9150613be08261490f565b604082019050919050565b6000613bf8602683614543565b9150613c038261495e565b604082019050919050565b6000613c1b601c83614543565b9150613c26826149ad565b602082019050919050565b6000613c3e601183614543565b9150613c49826149d6565b602082019050919050565b6000613c61602483614543565b9150613c6c826149ff565b604082019050919050565b6000613c84601983614543565b9150613c8f82614a4e565b602082019050919050565b6000613ca7601c83614543565b9150613cb282614a77565b602082019050919050565b6000613cca602c83614543565b9150613cd582614aa0565b604082019050919050565b6000613ced603883614543565b9150613cf882614aef565b604082019050919050565b6000613d10602a83614543565b9150613d1b82614b3e565b604082019050919050565b6000613d33602983614543565b9150613d3e82614b8d565b604082019050919050565b6000613d56602e83614543565b9150613d6182614bdc565b604082019050919050565b6000613d79601c83614543565b9150613d8482614c2b565b602082019050919050565b6000613d9c602083614543565b9150613da782614c54565b602082019050919050565b6000613dbf603183614543565b9150613dca82614c7d565b604082019050919050565b6000613de2602c83614543565b9150613ded82614ccc565b604082019050919050565b6000613e05602083614543565b9150613e1082614d1b565b602082019050919050565b6000613e28602983614543565b9150613e3382614d44565b604082019050919050565b6000613e4b600a83614543565b9150613e5682614d93565b602082019050919050565b6000613e6e602f83614543565b9150613e7982614dbc565b604082019050919050565b6000613e91602183614543565b9150613e9c82614e0b565b604082019050919050565b6000613eb4603183614543565b9150613ebf82614e5a565b604082019050919050565b6000613ed7601083614543565b9150613ee282614ea9565b602082019050919050565b6000613efa603083614543565b9150613f0582614ed2565b604082019050919050565b6000613f1d600b83614543565b9150613f2882614f21565b602082019050919050565b6000613f40601f83614543565b9150613f4b82614f4a565b602082019050919050565b6000613f63600b83614543565b9150613f6e82614f73565b602082019050919050565b613f82816146de565b82525050565b6000613f948285613b74565b9150613fa08284613b74565b91508190509392505050565b6000602082019050613fc16000830184613ad5565b92915050565b6000608082019050613fdc6000830187613ad5565b613fe96020830186613ad5565b613ff66040830185613f79565b81810360608301526140088184613af3565b905095945050505050565b60006020820190506140286000830184613ae4565b92915050565b600060208201905081810360008301526140488184613b3b565b905092915050565b6000602082019050818103600083015261406981613ba5565b9050919050565b6000602082019050818103600083015261408981613bc8565b9050919050565b600060208201905081810360008301526140a981613beb565b9050919050565b600060208201905081810360008301526140c981613c0e565b9050919050565b600060208201905081810360008301526140e981613c31565b9050919050565b6000602082019050818103600083015261410981613c54565b9050919050565b6000602082019050818103600083015261412981613c77565b9050919050565b6000602082019050818103600083015261414981613c9a565b9050919050565b6000602082019050818103600083015261416981613cbd565b9050919050565b6000602082019050818103600083015261418981613ce0565b9050919050565b600060208201905081810360008301526141a981613d03565b9050919050565b600060208201905081810360008301526141c981613d26565b9050919050565b600060208201905081810360008301526141e981613d49565b9050919050565b6000602082019050818103600083015261420981613d6c565b9050919050565b6000602082019050818103600083015261422981613d8f565b9050919050565b6000602082019050818103600083015261424981613db2565b9050919050565b6000602082019050818103600083015261426981613dd5565b9050919050565b6000602082019050818103600083015261428981613df8565b9050919050565b600060208201905081810360008301526142a981613e1b565b9050919050565b600060208201905081810360008301526142c981613e3e565b9050919050565b600060208201905081810360008301526142e981613e61565b9050919050565b6000602082019050818103600083015261430981613e84565b9050919050565b6000602082019050818103600083015261432981613ea7565b9050919050565b6000602082019050818103600083015261434981613eca565b9050919050565b6000602082019050818103600083015261436981613eed565b9050919050565b6000602082019050818103600083015261438981613f10565b9050919050565b600060208201905081810360008301526143a981613f33565b9050919050565b600060208201905081810360008301526143c981613f56565b9050919050565b60006020820190506143e56000830184613f79565b92915050565b60006040820190506144006000830185613f79565b61440d6020830184613b2c565b9392505050565b60006040820190506144296000830185613f79565b6144366020830184613f79565b9392505050565b6000614447614458565b9050614453828261476e565b919050565b6000604051905090565b600067ffffffffffffffff82111561447d5761447c6148a6565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156144a9576144a86148a6565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156144d5576144d46148a6565b5b6144de826148d5565b9050602081019050919050565b600067ffffffffffffffff821115614506576145056148a6565b5b61450f826148d5565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061456a826146de565b9150614575836146de565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156145aa576145a9614819565b5b828201905092915050565b60006145c0826146de565b91506145cb836146de565b9250826145db576145da614848565b5b828204905092915050565b60006145f1826146de565b91506145fc836146de565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561463557614634614819565b5b828202905092915050565b600061464b826146de565b9150614656836146de565b92508282101561466957614668614819565b5b828203905092915050565b600061467f826146be565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006146f3826146de565b9050919050565b82818337600083830152505050565b60005b8381101561472757808201518184015260208101905061470c565b83811115614736576000848401525b50505050565b6000600282049050600182168061475457607f821691505b6020821081141561476857614767614877565b5b50919050565b614777826148d5565b810181811067ffffffffffffffff82111715614796576147956148a6565b5b80604052505050565b60006147aa826146de565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156147dd576147dc614819565b5b600182019050919050565b60006147f3826146de565b91506147fe836146de565b92508261480e5761480d614848565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f746f6f206d756368000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f6d696e742077726f6e67206e756d626572000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4f766572206d696e74206c696d697420666f7220616464726573732e00000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f496e636f7272656374207472616e73616374696f6e2076616c75652e00000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f5761697420627564647900000000000000000000000000000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f4e6f742077686974656c69737465642e00000000000000000000000000000000600082015250565b7f4d696e7420616d6f756e742077696c6c2065786365656420746f74616c20636f60008201527f6c6c656374696f6e20616d6f756e742e00000000000000000000000000000000602082015250565b7f6e6f742073746172746564000000000000000000000000000000000000000000600082015250565b7f48616e67206f6e20626f79732c20796f756c6c2067657420696e20736f6f6e00600082015250565b7f76616c7565206572726f72000000000000000000000000000000000000000000600082015250565b614fa581614674565b8114614fb057600080fd5b50565b614fbc81614686565b8114614fc757600080fd5b50565b614fd381614692565b8114614fde57600080fd5b50565b614fea816146de565b8114614ff557600080fd5b5056fea264697066735822122050c3cb52042f65bfe263e2ec9f58bd94b1f7253da530003723db24e02929240164736f6c63430008040033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000b5361707079205365616c73000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000453415053000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
60806040526127106009556014600a5566d529ae9e860000600b5563612ea660600c5563612e9f58600d553480156200003757600080fd5b50604051620054df380380620054df83398181016040528101906200005d919062000290565b82828160009080519060200190620000779291906200016e565b508060019080519060200190620000909291906200016e565b5050506000620000a56200016660201b60201c565b905080600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35080600e90805190602001906200015c9291906200016e565b50505050620004a1565b600033905090565b8280546200017c90620003c6565b90600052602060002090601f016020900481019282620001a05760008555620001ec565b82601f10620001bb57805160ff1916838001178555620001ec565b82800160010185558215620001ec579182015b82811115620001eb578251825591602001919060010190620001ce565b5b509050620001fb9190620001ff565b5090565b5b808211156200021a57600081600090555060010162000200565b5090565b6000620002356200022f846200035a565b62000331565b9050828152602081018484840111156200024e57600080fd5b6200025b84828562000390565b509392505050565b600082601f8301126200027557600080fd5b8151620002878482602086016200021e565b91505092915050565b600080600060608486031215620002a657600080fd5b600084015167ffffffffffffffff811115620002c157600080fd5b620002cf8682870162000263565b935050602084015167ffffffffffffffff811115620002ed57600080fd5b620002fb8682870162000263565b925050604084015167ffffffffffffffff8111156200031957600080fd5b620003278682870162000263565b9150509250925092565b60006200033d62000350565b90506200034b8282620003fc565b919050565b6000604051905090565b600067ffffffffffffffff82111562000378576200037762000461565b5b620003838262000490565b9050602081019050919050565b60005b83811015620003b057808201518184015260208101905062000393565b83811115620003c0576000848401525b50505050565b60006002820490506001821680620003df57607f821691505b60208210811415620003f657620003f562000432565b5b50919050565b620004078262000490565b810181811067ffffffffffffffff8211171562000429576200042862000461565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b61502e80620004b16000396000f3fe6080604052600436106102455760003560e01c8063715018a611610139578063a035b1fe116100b6578063c1f261231161007a578063c1f2612314610856578063c87b56dd14610872578063d0f2a114146108af578063d9ff054e146108cb578063e985e9c5146108f6578063f2fde38b1461093357610245565b8063a035b1fe14610787578063a22cb465146107b2578063a2b40d19146107db578063b88d4fde14610804578063bffb26ce1461082d57610245565b8063917bb57f116100fd578063917bb57f1461069057806395d89b41146106b95780639955fc45146106e45780639a3132991461070d5780639afdf2f31461074a57610245565b8063715018a6146105dc57806383ebc808146105f3578063868ff4a21461061e57806388eae7051461063a5780638da5cb5b1461066557610245565b806334eafb11116101c75780635f4f603d1161018b5780635f4f603d146104e35780636352211e1461050c57806367765b87146105495780636c0360eb1461057457806370a082311461059f57610245565b806334eafb11146104125780633c49a8a91461043d57806342842e0e146104665780635082aed51461048f57806355f804b3146104ba57610245565b8063162094c41161020e578063162094c41461034157806318160ddd1461036a5780631f2698ab14610395578063214405fc146103c057806323b872dd146103e957610245565b8062739f2a1461024a57806301ffc9a71461027357806306fdde03146102b0578063081812fc146102db578063095ea7b314610318575b600080fd5b34801561025657600080fd5b50610271600480360381019061026c9190613a58565b61095c565b005b34801561027f57600080fd5b5061029a600480360381019061029591906139c5565b6109e2565b6040516102a79190614013565b60405180910390f35b3480156102bc57600080fd5b506102c5610ac4565b6040516102d2919061402e565b60405180910390f35b3480156102e757600080fd5b5061030260048036038101906102fd9190613a58565b610b56565b60405161030f9190613fac565b60405180910390f35b34801561032457600080fd5b5061033f600480360381019061033a91906138f4565b610bdb565b005b34801561034d57600080fd5b5061036860048036038101906103639190613a81565b610cf3565b005b34801561037657600080fd5b5061037f610d7d565b60405161038c91906143d0565b60405180910390f35b3480156103a157600080fd5b506103aa610d87565b6040516103b79190614013565b60405180910390f35b3480156103cc57600080fd5b506103e760048036038101906103e291906138f4565b610d9a565b005b3480156103f557600080fd5b50610410600480360381019061040b91906137ee565b610ece565b005b34801561041e57600080fd5b50610427610f2e565b60405161043491906143d0565b60405180910390f35b34801561044957600080fd5b50610464600480360381019061045f9190613789565b610f34565b005b34801561047257600080fd5b5061048d600480360381019061048891906137ee565b611091565b005b34801561049b57600080fd5b506104a46110b1565b6040516104b191906143d0565b60405180910390f35b3480156104c657600080fd5b506104e160048036038101906104dc9190613a17565b6110b7565b005b3480156104ef57600080fd5b5061050a6004803603810190610505919061399c565b61114d565b005b34801561051857600080fd5b50610533600480360381019061052e9190613a58565b6111e6565b6040516105409190613fac565b60405180910390f35b34801561055557600080fd5b5061055e611298565b60405161056b91906143d0565b60405180910390f35b34801561058057600080fd5b5061058961129e565b604051610596919061402e565b60405180910390f35b3480156105ab57600080fd5b506105c660048036038101906105c19190613789565b61132c565b6040516105d391906143d0565b60405180910390f35b3480156105e857600080fd5b506105f16113e4565b005b3480156105ff57600080fd5b50610608611521565b60405161061591906143d0565b60405180910390f35b61063860048036038101906106339190613a58565b611527565b005b34801561064657600080fd5b5061064f6118e2565b60405161065c9190614013565b60405180910390f35b34801561067157600080fd5b5061067a6118f5565b6040516106879190613fac565b60405180910390f35b34801561069c57600080fd5b506106b760048036038101906106b2919061399c565b61191f565b005b3480156106c557600080fd5b506106ce6119b8565b6040516106db919061402e565b60405180910390f35b3480156106f057600080fd5b5061070b60048036038101906107069190613a58565b611a4a565b005b34801561071957600080fd5b50610734600480360381019061072f9190613789565b611ad0565b6040516107419190614013565b60405180910390f35b34801561075657600080fd5b50610771600480360381019061076c9190613789565b611b2d565b60405161077e91906143d0565b60405180910390f35b34801561079357600080fd5b5061079c611b76565b6040516107a991906143d0565b60405180910390f35b3480156107be57600080fd5b506107d960048036038101906107d491906138b8565b611b7c565b005b3480156107e757600080fd5b5061080260048036038101906107fd9190613a58565b611cfd565b005b34801561081057600080fd5b5061082b6004803603810190610826919061383d565b611d83565b005b34801561083957600080fd5b50610854600480360381019061084f9190613930565b611de5565b005b610870600480360381019061086b9190613a58565b611fe1565b005b34801561087e57600080fd5b5061089960048036038101906108949190613a58565b612257565b6040516108a6919061402e565b60405180910390f35b6108c960048036038101906108c49190613a58565b6123a9565b005b3480156108d757600080fd5b506108e0612637565b6040516108ed91906143d0565b60405180910390f35b34801561090257600080fd5b5061091d600480360381019061091891906137b2565b61263d565b60405161092a9190614013565b60405180910390f35b34801561093f57600080fd5b5061095a60048036038101906109559190613789565b6126d1565b005b61096461287d565b73ffffffffffffffffffffffffffffffffffffffff166109826118f5565b73ffffffffffffffffffffffffffffffffffffffff16146109d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109cf90614270565b60405180910390fd5b80600c8190555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610aad57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610abd5750610abc82612885565b5b9050919050565b606060008054610ad39061473c565b80601f0160208091040260200160405190810160405280929190818152602001828054610aff9061473c565b8015610b4c5780601f10610b2157610100808354040283529160200191610b4c565b820191906000526020600020905b815481529060010190602001808311610b2f57829003601f168201915b5050505050905090565b6000610b61826128ef565b610ba0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9790614250565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610be6826111e6565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4e906142f0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c7661287d565b73ffffffffffffffffffffffffffffffffffffffff161480610ca55750610ca481610c9f61287d565b61263d565b5b610ce4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cdb90614170565b60405180910390fd5b610cee838361295b565b505050565b610cfb61287d565b73ffffffffffffffffffffffffffffffffffffffff16610d196118f5565b73ffffffffffffffffffffffffffffffffffffffff1614610d6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6690614270565b60405180910390fd5b610d798282612a14565b5050565b6000600854905090565b600f60009054906101000a900460ff1681565b610da261287d565b73ffffffffffffffffffffffffffffffffffffffff16610dc06118f5565b73ffffffffffffffffffffffffffffffffffffffff1614610e16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0d90614270565b60405180910390fd5b6001601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060126000815480929190610ec59061479f565b91905055505050565b610edf610ed961287d565b82612a88565b610f1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1590614310565b60405180910390fd5b610f29838383612b66565b505050565b60095481565b610f3c61287d565b73ffffffffffffffffffffffffffffffffffffffff16610f5a6118f5565b73ffffffffffffffffffffffffffffffffffffffff1614610fb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa790614270565b60405180910390fd5b6009546001600854610fc2919061455f565b1115611003576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffa90614350565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff167fc1c66401eeae5b2a4ff23f6d7784eefe229334268d00c4b0e5e2c44c4ae4fda5600160085461104a919061455f565b600160405161105a9291906143eb565b60405180910390a261108e81600860008154809291906110799061479f565b919050556001611089919061455f565b612dc2565b50565b6110ac83838360405180602001604052806000815250611d83565b505050565b600d5481565b6110bf61287d565b73ffffffffffffffffffffffffffffffffffffffff166110dd6118f5565b73ffffffffffffffffffffffffffffffffffffffff1614611133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112a90614270565b60405180910390fd5b80600e9080519060200190611149929190613481565b5050565b61115561287d565b73ffffffffffffffffffffffffffffffffffffffff166111736118f5565b73ffffffffffffffffffffffffffffffffffffffff16146111c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c090614270565b60405180910390fd5b80600f60016101000a81548160ff02191690831515021790555050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561128f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611286906141b0565b60405180910390fd5b80915050919050565b600a5481565b600e80546112ab9061473c565b80601f01602080910402602001604051908101604052809291908181526020018280546112d79061473c565b80156113245780601f106112f957610100808354040283529160200191611324565b820191906000526020600020905b81548152906001019060200180831161130757829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561139d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139490614190565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6113ec61287d565b73ffffffffffffffffffffffffffffffffffffffff1661140a6118f5565b73ffffffffffffffffffffffffffffffffffffffff1614611460576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145790614270565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600c5481565b600d5442101561156c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611563906142b0565b60405180910390fd5b600f60019054906101000a900460ff166115bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b290614390565b60405180910390fd5b60011515601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151461164e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164590614330565b60405180910390fd5b600081601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461169b9190614640565b10156116dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d390614130565b60405180910390fd5b600954816008546116ed919061455f565b111561172e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172590614350565b60405180910390fd5b600b548161173c91906145e6565b341461177d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611774906141f0565b60405180910390fd5b6117856118f5565b73ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f193505050501580156117ca573d6000803e3d6000fd5b5080601160006117d861287d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118219190614640565b9250508190555061183061287d565b73ffffffffffffffffffffffffffffffffffffffff167fc1c66401eeae5b2a4ff23f6d7784eefe229334268d00c4b0e5e2c44c4ae4fda56001600854611876919061455f565b83604051611885929190614414565b60405180910390a260005b818110156118de576118cb6118a361287d565b600860008154809291906118b69061479f565b9190505560016118c6919061455f565b612dc2565b80806118d69061479f565b915050611890565b5050565b600f60019054906101000a900460ff1681565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61192761287d565b73ffffffffffffffffffffffffffffffffffffffff166119456118f5565b73ffffffffffffffffffffffffffffffffffffffff161461199b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199290614270565b60405180910390fd5b80600f60006101000a81548160ff02191690831515021790555050565b6060600180546119c79061473c565b80601f01602080910402602001604051908101604052809291908181526020018280546119f39061473c565b8015611a405780601f10611a1557610100808354040283529160200191611a40565b820191906000526020600020905b815481529060010190602001808311611a2357829003601f168201915b5050505050905090565b611a5261287d565b73ffffffffffffffffffffffffffffffffffffffff16611a706118f5565b73ffffffffffffffffffffffffffffffffffffffff1614611ac6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abd90614270565b60405180910390fd5b80600d8190555050565b600060011515601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515149050919050565b6000601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600b5481565b611b8461287d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611bf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be990614110565b60405180910390fd5b8060056000611bff61287d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611cac61287d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611cf19190614013565b60405180910390a35050565b611d0561287d565b73ffffffffffffffffffffffffffffffffffffffff16611d236118f5565b73ffffffffffffffffffffffffffffffffffffffff1614611d79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7090614270565b60405180910390fd5b80600b8190555050565b611d94611d8e61287d565b83612a88565b611dd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dca90614310565b60405180910390fd5b611ddf84848484612f90565b50505050565b611ded61287d565b73ffffffffffffffffffffffffffffffffffffffff16611e0b6118f5565b73ffffffffffffffffffffffffffffffffffffffff1614611e61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5890614270565b60405180910390fd5b60005b8251811015611fdc57600160106000858481518110611eac577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550818181518110611f3e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015160116000858481518110611f83577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508080611fd49061479f565b915050611e64565b505050565b611fe961287d565b73ffffffffffffffffffffffffffffffffffffffff166120076118f5565b73ffffffffffffffffffffffffffffffffffffffff161461205d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205490614270565b60405180910390fd5b60008111801561206f5750600a548111155b6120ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a5906140d0565b60405180910390fd5b600954816008546120bf919061455f565b1115612100576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f790614050565b60405180910390fd5b600b548161210e91906145e6565b341461214f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612146906143b0565b60405180910390fd5b6121576118f5565b73ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f1935050505015801561219c573d6000803e3d6000fd5b506121a561287d565b73ffffffffffffffffffffffffffffffffffffffff167fc1c66401eeae5b2a4ff23f6d7784eefe229334268d00c4b0e5e2c44c4ae4fda560016008546121eb919061455f565b836040516121fa929190614414565b60405180910390a260005b818110156122535761224061221861287d565b6008600081548092919061222b9061479f565b91905055600161223b919061455f565b612dc2565b808061224b9061479f565b915050612205565b5050565b6060612262826128ef565b6122a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229890614230565b60405180910390fd5b60006006600084815260200190815260200160002080546122c19061473c565b80601f01602080910402602001604051908101604052809291908181526020018280546122ed9061473c565b801561233a5780601f1061230f5761010080835404028352916020019161233a565b820191906000526020600020905b81548152906001019060200180831161231d57829003601f168201915b50505050509050600061234b612fec565b90506000815114156123615781925050506123a4565b60008251111561239657808260405160200161237e929190613f88565b604051602081830303815290604052925050506123a4565b61239f8461307e565b925050505b919050565b600c544210156123ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e5906142b0565b60405180910390fd5b600f60009054906101000a900460ff1661243d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243490614370565b60405180910390fd5b60008111801561244f5750600a548111155b61248e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612485906140d0565b60405180910390fd5b6009548160085461249f919061455f565b11156124e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d790614050565b60405180910390fd5b600b54816124ee91906145e6565b341461252f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612526906143b0565b60405180910390fd5b6125376118f5565b73ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f1935050505015801561257c573d6000803e3d6000fd5b5061258561287d565b73ffffffffffffffffffffffffffffffffffffffff167fc1c66401eeae5b2a4ff23f6d7784eefe229334268d00c4b0e5e2c44c4ae4fda560016008546125cb919061455f565b836040516125da929190614414565b60405180910390a260005b81811015612633576126206125f861287d565b6008600081548092919061260b9061479f565b91905055600161261b919061455f565b612dc2565b808061262b9061479f565b9150506125e5565b5050565b60085481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6126d961287d565b73ffffffffffffffffffffffffffffffffffffffff166126f76118f5565b73ffffffffffffffffffffffffffffffffffffffff161461274d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274490614270565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156127bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b490614090565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600033905090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166129ce836111e6565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b612a1d826128ef565b612a5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a53906141d0565b60405180910390fd5b80600660008481526020019081526020016000209080519060200190612a83929190613481565b505050565b6000612a93826128ef565b612ad2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ac990614150565b60405180910390fd5b6000612add836111e6565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612b4c57508373ffffffffffffffffffffffffffffffffffffffff16612b3484610b56565b73ffffffffffffffffffffffffffffffffffffffff16145b80612b5d5750612b5c818561263d565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612b86826111e6565b73ffffffffffffffffffffffffffffffffffffffff1614612bdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bd390614290565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c43906140f0565b60405180910390fd5b612c57838383613125565b612c6260008261295b565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612cb29190614640565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d09919061455f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e2990614210565b60405180910390fd5b612e3b816128ef565b15612e7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e72906140b0565b60405180910390fd5b612e8760008383613125565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ed7919061455f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b612f9b848484612b66565b612fa78484848461312a565b612fe6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fdd90614070565b60405180910390fd5b50505050565b6060600e8054612ffb9061473c565b80601f01602080910402602001604051908101604052809291908181526020018280546130279061473c565b80156130745780601f1061304957610100808354040283529160200191613074565b820191906000526020600020905b81548152906001019060200180831161305757829003601f168201915b5050505050905090565b6060613089826128ef565b6130c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130bf906142d0565b60405180910390fd5b60006130d2612fec565b905060008151116130f2576040518060200160405280600081525061311d565b806130fc846132c1565b60405160200161310d929190613f88565b6040516020818303038152906040525b915050919050565b505050565b600061314b8473ffffffffffffffffffffffffffffffffffffffff1661346e565b156132b4578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261317461287d565b8786866040518563ffffffff1660e01b81526004016131969493929190613fc7565b602060405180830381600087803b1580156131b057600080fd5b505af19250505080156131e157506040513d601f19601f820116820180604052508101906131de91906139ee565b60015b613264573d8060008114613211576040519150601f19603f3d011682016040523d82523d6000602084013e613216565b606091505b5060008151141561325c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161325390614070565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506132b9565b600190505b949350505050565b60606000821415613309576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613469565b600082905060005b6000821461333b5780806133249061479f565b915050600a8261333491906145b5565b9150613311565b60008167ffffffffffffffff81111561337d577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156133af5781602001600182028036833780820191505090505b5090505b60008514613462576001826133c89190614640565b9150600a856133d791906147e8565b60306133e3919061455f565b60f81b81838151811061341f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561345b91906145b5565b94506133b3565b8093505050505b919050565b600080823b905060008111915050919050565b82805461348d9061473c565b90600052602060002090601f0160209004810192826134af57600085556134f6565b82601f106134c857805160ff19168380011785556134f6565b828001600101855582156134f6579182015b828111156134f55782518255916020019190600101906134da565b5b5090506135039190613507565b5090565b5b80821115613520576000816000905550600101613508565b5090565b600061353761353284614462565b61443d565b9050808382526020820190508285602086028201111561355657600080fd5b60005b85811015613586578161356c8882613678565b845260208401935060208301925050600181019050613559565b5050509392505050565b60006135a361359e8461448e565b61443d565b905080838252602082019050828560208602820111156135c257600080fd5b60005b858110156135f257816135d88882613774565b8452602084019350602083019250506001810190506135c5565b5050509392505050565b600061360f61360a846144ba565b61443d565b90508281526020810184848401111561362757600080fd5b6136328482856146fa565b509392505050565b600061364d613648846144eb565b61443d565b90508281526020810184848401111561366557600080fd5b6136708482856146fa565b509392505050565b60008135905061368781614f9c565b92915050565b600082601f83011261369e57600080fd5b81356136ae848260208601613524565b91505092915050565b600082601f8301126136c857600080fd5b81356136d8848260208601613590565b91505092915050565b6000813590506136f081614fb3565b92915050565b60008135905061370581614fca565b92915050565b60008151905061371a81614fca565b92915050565b600082601f83011261373157600080fd5b81356137418482602086016135fc565b91505092915050565b600082601f83011261375b57600080fd5b813561376b84826020860161363a565b91505092915050565b60008135905061378381614fe1565b92915050565b60006020828403121561379b57600080fd5b60006137a984828501613678565b91505092915050565b600080604083850312156137c557600080fd5b60006137d385828601613678565b92505060206137e485828601613678565b9150509250929050565b60008060006060848603121561380357600080fd5b600061381186828701613678565b935050602061382286828701613678565b925050604061383386828701613774565b9150509250925092565b6000806000806080858703121561385357600080fd5b600061386187828801613678565b945050602061387287828801613678565b935050604061388387828801613774565b925050606085013567ffffffffffffffff8111156138a057600080fd5b6138ac87828801613720565b91505092959194509250565b600080604083850312156138cb57600080fd5b60006138d985828601613678565b92505060206138ea858286016136e1565b9150509250929050565b6000806040838503121561390757600080fd5b600061391585828601613678565b925050602061392685828601613774565b9150509250929050565b6000806040838503121561394357600080fd5b600083013567ffffffffffffffff81111561395d57600080fd5b6139698582860161368d565b925050602083013567ffffffffffffffff81111561398657600080fd5b613992858286016136b7565b9150509250929050565b6000602082840312156139ae57600080fd5b60006139bc848285016136e1565b91505092915050565b6000602082840312156139d757600080fd5b60006139e5848285016136f6565b91505092915050565b600060208284031215613a0057600080fd5b6000613a0e8482850161370b565b91505092915050565b600060208284031215613a2957600080fd5b600082013567ffffffffffffffff811115613a4357600080fd5b613a4f8482850161374a565b91505092915050565b600060208284031215613a6a57600080fd5b6000613a7884828501613774565b91505092915050565b60008060408385031215613a9457600080fd5b6000613aa285828601613774565b925050602083013567ffffffffffffffff811115613abf57600080fd5b613acb8582860161374a565b9150509250929050565b613ade81614674565b82525050565b613aed81614686565b82525050565b6000613afe8261451c565b613b088185614532565b9350613b18818560208601614709565b613b21816148d5565b840191505092915050565b613b35816146e8565b82525050565b6000613b4682614527565b613b508185614543565b9350613b60818560208601614709565b613b69816148d5565b840191505092915050565b6000613b7f82614527565b613b898185614554565b9350613b99818560208601614709565b80840191505092915050565b6000613bb2600883614543565b9150613bbd826148e6565b602082019050919050565b6000613bd5603283614543565b9150613be08261490f565b604082019050919050565b6000613bf8602683614543565b9150613c038261495e565b604082019050919050565b6000613c1b601c83614543565b9150613c26826149ad565b602082019050919050565b6000613c3e601183614543565b9150613c49826149d6565b602082019050919050565b6000613c61602483614543565b9150613c6c826149ff565b604082019050919050565b6000613c84601983614543565b9150613c8f82614a4e565b602082019050919050565b6000613ca7601c83614543565b9150613cb282614a77565b602082019050919050565b6000613cca602c83614543565b9150613cd582614aa0565b604082019050919050565b6000613ced603883614543565b9150613cf882614aef565b604082019050919050565b6000613d10602a83614543565b9150613d1b82614b3e565b604082019050919050565b6000613d33602983614543565b9150613d3e82614b8d565b604082019050919050565b6000613d56602e83614543565b9150613d6182614bdc565b604082019050919050565b6000613d79601c83614543565b9150613d8482614c2b565b602082019050919050565b6000613d9c602083614543565b9150613da782614c54565b602082019050919050565b6000613dbf603183614543565b9150613dca82614c7d565b604082019050919050565b6000613de2602c83614543565b9150613ded82614ccc565b604082019050919050565b6000613e05602083614543565b9150613e1082614d1b565b602082019050919050565b6000613e28602983614543565b9150613e3382614d44565b604082019050919050565b6000613e4b600a83614543565b9150613e5682614d93565b602082019050919050565b6000613e6e602f83614543565b9150613e7982614dbc565b604082019050919050565b6000613e91602183614543565b9150613e9c82614e0b565b604082019050919050565b6000613eb4603183614543565b9150613ebf82614e5a565b604082019050919050565b6000613ed7601083614543565b9150613ee282614ea9565b602082019050919050565b6000613efa603083614543565b9150613f0582614ed2565b604082019050919050565b6000613f1d600b83614543565b9150613f2882614f21565b602082019050919050565b6000613f40601f83614543565b9150613f4b82614f4a565b602082019050919050565b6000613f63600b83614543565b9150613f6e82614f73565b602082019050919050565b613f82816146de565b82525050565b6000613f948285613b74565b9150613fa08284613b74565b91508190509392505050565b6000602082019050613fc16000830184613ad5565b92915050565b6000608082019050613fdc6000830187613ad5565b613fe96020830186613ad5565b613ff66040830185613f79565b81810360608301526140088184613af3565b905095945050505050565b60006020820190506140286000830184613ae4565b92915050565b600060208201905081810360008301526140488184613b3b565b905092915050565b6000602082019050818103600083015261406981613ba5565b9050919050565b6000602082019050818103600083015261408981613bc8565b9050919050565b600060208201905081810360008301526140a981613beb565b9050919050565b600060208201905081810360008301526140c981613c0e565b9050919050565b600060208201905081810360008301526140e981613c31565b9050919050565b6000602082019050818103600083015261410981613c54565b9050919050565b6000602082019050818103600083015261412981613c77565b9050919050565b6000602082019050818103600083015261414981613c9a565b9050919050565b6000602082019050818103600083015261416981613cbd565b9050919050565b6000602082019050818103600083015261418981613ce0565b9050919050565b600060208201905081810360008301526141a981613d03565b9050919050565b600060208201905081810360008301526141c981613d26565b9050919050565b600060208201905081810360008301526141e981613d49565b9050919050565b6000602082019050818103600083015261420981613d6c565b9050919050565b6000602082019050818103600083015261422981613d8f565b9050919050565b6000602082019050818103600083015261424981613db2565b9050919050565b6000602082019050818103600083015261426981613dd5565b9050919050565b6000602082019050818103600083015261428981613df8565b9050919050565b600060208201905081810360008301526142a981613e1b565b9050919050565b600060208201905081810360008301526142c981613e3e565b9050919050565b600060208201905081810360008301526142e981613e61565b9050919050565b6000602082019050818103600083015261430981613e84565b9050919050565b6000602082019050818103600083015261432981613ea7565b9050919050565b6000602082019050818103600083015261434981613eca565b9050919050565b6000602082019050818103600083015261436981613eed565b9050919050565b6000602082019050818103600083015261438981613f10565b9050919050565b600060208201905081810360008301526143a981613f33565b9050919050565b600060208201905081810360008301526143c981613f56565b9050919050565b60006020820190506143e56000830184613f79565b92915050565b60006040820190506144006000830185613f79565b61440d6020830184613b2c565b9392505050565b60006040820190506144296000830185613f79565b6144366020830184613f79565b9392505050565b6000614447614458565b9050614453828261476e565b919050565b6000604051905090565b600067ffffffffffffffff82111561447d5761447c6148a6565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156144a9576144a86148a6565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156144d5576144d46148a6565b5b6144de826148d5565b9050602081019050919050565b600067ffffffffffffffff821115614506576145056148a6565b5b61450f826148d5565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061456a826146de565b9150614575836146de565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156145aa576145a9614819565b5b828201905092915050565b60006145c0826146de565b91506145cb836146de565b9250826145db576145da614848565b5b828204905092915050565b60006145f1826146de565b91506145fc836146de565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561463557614634614819565b5b828202905092915050565b600061464b826146de565b9150614656836146de565b92508282101561466957614668614819565b5b828203905092915050565b600061467f826146be565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006146f3826146de565b9050919050565b82818337600083830152505050565b60005b8381101561472757808201518184015260208101905061470c565b83811115614736576000848401525b50505050565b6000600282049050600182168061475457607f821691505b6020821081141561476857614767614877565b5b50919050565b614777826148d5565b810181811067ffffffffffffffff82111715614796576147956148a6565b5b80604052505050565b60006147aa826146de565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156147dd576147dc614819565b5b600182019050919050565b60006147f3826146de565b91506147fe836146de565b92508261480e5761480d614848565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f746f6f206d756368000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f6d696e742077726f6e67206e756d626572000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4f766572206d696e74206c696d697420666f7220616464726573732e00000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f496e636f7272656374207472616e73616374696f6e2076616c75652e00000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f5761697420627564647900000000000000000000000000000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f4e6f742077686974656c69737465642e00000000000000000000000000000000600082015250565b7f4d696e7420616d6f756e742077696c6c2065786365656420746f74616c20636f60008201527f6c6c656374696f6e20616d6f756e742e00000000000000000000000000000000602082015250565b7f6e6f742073746172746564000000000000000000000000000000000000000000600082015250565b7f48616e67206f6e20626f79732c20796f756c6c2067657420696e20736f6f6e00600082015250565b7f76616c7565206572726f72000000000000000000000000000000000000000000600082015250565b614fa581614674565b8114614fb057600080fd5b50565b614fbc81614686565b8114614fc757600080fd5b50565b614fd381614692565b8114614fde57600080fd5b50565b614fea816146de565b8114614ff557600080fd5b5056fea264697066735822122050c3cb52042f65bfe263e2ec9f58bd94b1f7253da530003723db24e02929240164736f6c63430008040033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000b5361707079205365616c73000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000453415053000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000