Source Code
Overview
ETH Balance
ETH Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 1,915 transactions
| Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Set Approval For... | 26573563 | 40 days ago | IN | 0 ETH | 0.00000016 | ||||
| Set Approval For... | 26560855 | 40 days ago | IN | 0 ETH | 0.00000004 | ||||
| Set Approval For... | 26504415 | 41 days ago | IN | 0 ETH | 0.00000003 | ||||
| Set Approval For... | 25806284 | 53 days ago | IN | 0 ETH | 0.00000014 | ||||
| Set Approval For... | 24254802 | 82 days ago | IN | 0 ETH | 0.00000191 | ||||
| Set Approval For... | 23990054 | 87 days ago | IN | 0 ETH | 0.00000001 | ||||
| Set Approval For... | 22067038 | 119 days ago | IN | 0 ETH | 0.00000049 | ||||
| Set Approval For... | 21960459 | 120 days ago | IN | 0 ETH | 0.00000031 | ||||
| Set Approval For... | 21954160 | 121 days ago | IN | 0 ETH | 0.00000053 | ||||
| Set Approval For... | 21601173 | 126 days ago | IN | 0 ETH | 0.00000049 | ||||
| Set Approval For... | 20451075 | 144 days ago | IN | 0 ETH | 0.00000053 | ||||
| Set Approval For... | 20450398 | 144 days ago | IN | 0 ETH | 0.00000098 | ||||
| Set Approval For... | 19542072 | 158 days ago | IN | 0 ETH | 0.00000049 | ||||
| Set Approval For... | 19196879 | 162 days ago | IN | 0 ETH | 0.00000049 | ||||
| Set Approval For... | 17713279 | 180 days ago | IN | 0 ETH | 0.00000094 | ||||
| Set Approval For... | 17641465 | 182 days ago | IN | 0 ETH | 0.00000049 | ||||
| Safe Transfer Fr... | 16591579 | 219 days ago | IN | 0 ETH | 0.00000073 | ||||
| Set Approval For... | 16340966 | 228 days ago | IN | 0 ETH | 0.00000082 | ||||
| Set Approval For... | 15273862 | 261 days ago | IN | 0 ETH | 0.00000077 | ||||
| Set Approval For... | 13665616 | 332 days ago | IN | 0 ETH | 0.00000265 | ||||
| Set Approval For... | 13633208 | 334 days ago | IN | 0 ETH | 0.00000142 | ||||
| Set Approval For... | 13551245 | 338 days ago | IN | 0 ETH | 0.00000244 | ||||
| Set Approval For... | 13533967 | 338 days ago | IN | 0 ETH | 0.00000177 | ||||
| Set Approval For... | 13489126 | 340 days ago | IN | 0 ETH | 0.00000334 | ||||
| Safe Transfer Fr... | 12910760 | 366 days ago | IN | 0 ETH | 0.0000551 |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
PixyBits
Compiler Version
v0.8.26+commit.8a97fa7a
Contract Source Code (Solidity)
/**
*Submitted for verification at scrollscan.com on 2024-07-25
*/
// File: @openzeppelin/contracts/utils/Context.sol
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
pragma solidity ^0.8.20;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}
// File: @openzeppelin/contracts/access/Ownable.sol
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)
pragma solidity ^0.8.20;
/**
* @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.
*
* The initial owner is set to the address provided by the deployer. 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;
/**
* @dev The caller account is not authorized to perform an operation.
*/
error OwnableUnauthorizedAccount(address account);
/**
* @dev The owner is not a valid owner account. (eg. `address(0)`)
*/
error OwnableInvalidOwner(address owner);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the address provided by the deployer as the initial owner.
*/
constructor(address initialOwner) {
if (initialOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(initialOwner);
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
if (owner() != _msgSender()) {
revert OwnableUnauthorizedAccount(_msgSender());
}
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
if (newOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
// File: @openzeppelin/contracts/utils/introspection/IERC165.sol
// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
// File: @openzeppelin/contracts/token/ERC721/IERC721.sol
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721.sol)
pragma solidity ^0.8.20;
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721 is IERC165 {
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon
* a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must 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: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
* or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
* understand this adds an external call which potentially creates a reentrancy vulnerability.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 tokenId) external;
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the zero address clears previous approvals.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function approve(address to, uint256 tokenId) external;
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the address zero.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool approved) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}
*/
function isApprovedForAll(address owner, address operator) external view returns (bool);
}
// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721Receiver.sol)
pragma solidity ^0.8.20;
/**
* @title ERC721 token receiver interface
* @dev Interface for any contract that wants to support safeTransfers
* from ERC721 asset contracts.
*/
interface IERC721Receiver {
/**
* @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
* by `operator` from `from`, this function is called.
*
* It must return its Solidity selector to confirm the token transfer.
* If any other value is returned or the interface is not implemented by the recipient, the transfer will be
* reverted.
*
* The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
*/
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}
// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/extensions/IERC721Metadata.sol)
pragma solidity ^0.8.20;
/**
* @title ERC-721 Non-Fungible Token Standard, optional metadata extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721Metadata is IERC721 {
/**
* @dev Returns the token collection name.
*/
function name() external view returns (string memory);
/**
* @dev Returns the token collection symbol.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
*/
function tokenURI(uint256 tokenId) external view returns (string memory);
}
// File: @openzeppelin/contracts/utils/math/Math.sol
// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/Math.sol)
pragma solidity ^0.8.20;
/**
* @dev Standard math utilities missing in the Solidity language.
*/
library Math {
/**
* @dev Muldiv operation overflow.
*/
error MathOverflowedMulDiv();
enum Rounding {
Floor, // Toward negative infinity
Ceil, // Toward positive infinity
Trunc, // Toward zero
Expand // Away from zero
}
/**
* @dev Returns the addition of two unsigned integers, with an overflow flag.
*/
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the subtraction of two unsigned integers, with an overflow flag.
*/
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b > a) return (false, 0);
return (true, a - b);
}
}
/**
* @dev Returns the multiplication of two unsigned integers, with an overflow flag.
*/
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the division of two unsigned integers, with a division by zero flag.
*/
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a / b);
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
*/
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a % b);
}
}
/**
* @dev Returns the largest of two numbers.
*/
function max(uint256 a, uint256 b) internal pure returns (uint256) {
return a > b ? a : b;
}
/**
* @dev Returns the smallest of two numbers.
*/
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return a < b ? a : b;
}
/**
* @dev Returns the average of two numbers. The result is rounded towards
* zero.
*/
function average(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b) / 2 can overflow.
return (a & b) + (a ^ b) / 2;
}
/**
* @dev Returns the ceiling of the division of two numbers.
*
* This differs from standard division with `/` in that it rounds towards infinity instead
* of rounding towards zero.
*/
function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
if (b == 0) {
// Guarantee the same behavior as in a regular Solidity division.
return a / b;
}
// (a + b - 1) / b can overflow on addition, so we distribute.
return a == 0 ? 0 : (a - 1) / b + 1;
}
/**
* @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or
* denominator == 0.
* @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by
* Uniswap Labs also under MIT license.
*/
function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {
unchecked {
// 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
// use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
// variables such that product = prod1 * 2^256 + prod0.
uint256 prod0 = x * y; // Least significant 256 bits of the product
uint256 prod1; // Most significant 256 bits of the product
assembly {
let mm := mulmod(x, y, not(0))
prod1 := sub(sub(mm, prod0), lt(mm, prod0))
}
// Handle non-overflow cases, 256 by 256 division.
if (prod1 == 0) {
// Solidity will revert if denominator == 0, unlike the div opcode on its own.
// The surrounding unchecked block does not change this fact.
// See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.
return prod0 / denominator;
}
// Make sure the result is less than 2^256. Also prevents denominator == 0.
if (denominator <= prod1) {
revert MathOverflowedMulDiv();
}
///////////////////////////////////////////////
// 512 by 256 division.
///////////////////////////////////////////////
// Make division exact by subtracting the remainder from [prod1 prod0].
uint256 remainder;
assembly {
// Compute remainder using mulmod.
remainder := mulmod(x, y, denominator)
// Subtract 256 bit number from 512 bit number.
prod1 := sub(prod1, gt(remainder, prod0))
prod0 := sub(prod0, remainder)
}
// Factor powers of two out of denominator and compute largest power of two divisor of denominator.
// Always >= 1. See https://cs.stackexchange.com/q/138556/92363.
uint256 twos = denominator & (0 - denominator);
assembly {
// Divide denominator by twos.
denominator := div(denominator, twos)
// Divide [prod1 prod0] by twos.
prod0 := div(prod0, twos)
// Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
twos := add(div(sub(0, twos), twos), 1)
}
// Shift in bits from prod1 into prod0.
prod0 |= prod1 * twos;
// Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
// that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
// four bits. That is, denominator * inv = 1 mod 2^4.
uint256 inverse = (3 * denominator) ^ 2;
// Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also
// works in modular arithmetic, doubling the correct bits in each step.
inverse *= 2 - denominator * inverse; // inverse mod 2^8
inverse *= 2 - denominator * inverse; // inverse mod 2^16
inverse *= 2 - denominator * inverse; // inverse mod 2^32
inverse *= 2 - denominator * inverse; // inverse mod 2^64
inverse *= 2 - denominator * inverse; // inverse mod 2^128
inverse *= 2 - denominator * inverse; // inverse mod 2^256
// Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
// This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
// less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
// is no longer required.
result = prod0 * inverse;
return result;
}
}
/**
* @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
*/
function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {
uint256 result = mulDiv(x, y, denominator);
if (unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0) {
result += 1;
}
return result;
}
/**
* @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded
* towards zero.
*
* Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
*/
function sqrt(uint256 a) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
// For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
//
// We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
// `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
//
// This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
// → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
// → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
//
// Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
uint256 result = 1 << (log2(a) >> 1);
// At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
// since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
// every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
// into the expected uint128 result.
unchecked {
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
return min(result, a / result);
}
}
/**
* @notice Calculates sqrt(a), following the selected rounding direction.
*/
function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = sqrt(a);
return result + (unsignedRoundsUp(rounding) && result * result < a ? 1 : 0);
}
}
/**
* @dev Return the log in base 2 of a positive value rounded towards zero.
* Returns 0 if given 0.
*/
function log2(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >> 128 > 0) {
value >>= 128;
result += 128;
}
if (value >> 64 > 0) {
value >>= 64;
result += 64;
}
if (value >> 32 > 0) {
value >>= 32;
result += 32;
}
if (value >> 16 > 0) {
value >>= 16;
result += 16;
}
if (value >> 8 > 0) {
value >>= 8;
result += 8;
}
if (value >> 4 > 0) {
value >>= 4;
result += 4;
}
if (value >> 2 > 0) {
value >>= 2;
result += 2;
}
if (value >> 1 > 0) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 2, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log2(value);
return result + (unsignedRoundsUp(rounding) && 1 << result < value ? 1 : 0);
}
}
/**
* @dev Return the log in base 10 of a positive value rounded towards zero.
* Returns 0 if given 0.
*/
function log10(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >= 10 ** 64) {
value /= 10 ** 64;
result += 64;
}
if (value >= 10 ** 32) {
value /= 10 ** 32;
result += 32;
}
if (value >= 10 ** 16) {
value /= 10 ** 16;
result += 16;
}
if (value >= 10 ** 8) {
value /= 10 ** 8;
result += 8;
}
if (value >= 10 ** 4) {
value /= 10 ** 4;
result += 4;
}
if (value >= 10 ** 2) {
value /= 10 ** 2;
result += 2;
}
if (value >= 10 ** 1) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 10, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log10(value);
return result + (unsignedRoundsUp(rounding) && 10 ** result < value ? 1 : 0);
}
}
/**
* @dev Return the log in base 256 of a positive value rounded towards zero.
* Returns 0 if given 0.
*
* Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
*/
function log256(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >> 128 > 0) {
value >>= 128;
result += 16;
}
if (value >> 64 > 0) {
value >>= 64;
result += 8;
}
if (value >> 32 > 0) {
value >>= 32;
result += 4;
}
if (value >> 16 > 0) {
value >>= 16;
result += 2;
}
if (value >> 8 > 0) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 256, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log256(value);
return result + (unsignedRoundsUp(rounding) && 1 << (result << 3) < value ? 1 : 0);
}
}
/**
* @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.
*/
function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {
return uint8(rounding) % 2 == 1;
}
}
// File: @openzeppelin/contracts/utils/math/SignedMath.sol
// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/SignedMath.sol)
pragma solidity ^0.8.20;
/**
* @dev Standard signed math utilities missing in the Solidity language.
*/
library SignedMath {
/**
* @dev Returns the largest of two signed numbers.
*/
function max(int256 a, int256 b) internal pure returns (int256) {
return a > b ? a : b;
}
/**
* @dev Returns the smallest of two signed numbers.
*/
function min(int256 a, int256 b) internal pure returns (int256) {
return a < b ? a : b;
}
/**
* @dev Returns the average of two signed numbers without overflow.
* The result is rounded towards zero.
*/
function average(int256 a, int256 b) internal pure returns (int256) {
// Formula from the book "Hacker's Delight"
int256 x = (a & b) + ((a ^ b) >> 1);
return x + (int256(uint256(x) >> 255) & (a ^ b));
}
/**
* @dev Returns the absolute unsigned value of a signed value.
*/
function abs(int256 n) internal pure returns (uint256) {
unchecked {
// must be unchecked in order to support `n = type(int256).min`
return uint256(n >= 0 ? n : -n);
}
}
}
// File: @openzeppelin/contracts/utils/Strings.sol
// OpenZeppelin Contracts (last updated v5.0.0) (utils/Strings.sol)
pragma solidity ^0.8.20;
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant HEX_DIGITS = "0123456789abcdef";
uint8 private constant ADDRESS_LENGTH = 20;
/**
* @dev The `value` string doesn't fit in the specified `length`.
*/
error StringsInsufficientHexLength(uint256 value, uint256 length);
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
unchecked {
uint256 length = Math.log10(value) + 1;
string memory buffer = new string(length);
uint256 ptr;
/// @solidity memory-safe-assembly
assembly {
ptr := add(buffer, add(32, length))
}
while (true) {
ptr--;
/// @solidity memory-safe-assembly
assembly {
mstore8(ptr, byte(mod(value, 10), HEX_DIGITS))
}
value /= 10;
if (value == 0) break;
}
return buffer;
}
}
/**
* @dev Converts a `int256` to its ASCII `string` decimal representation.
*/
function toStringSigned(int256 value) internal pure returns (string memory) {
return string.concat(value < 0 ? "-" : "", toString(SignedMath.abs(value)));
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
unchecked {
return toHexString(value, Math.log256(value) + 1);
}
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
uint256 localValue = value;
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = HEX_DIGITS[localValue & 0xf];
localValue >>= 4;
}
if (localValue != 0) {
revert StringsInsufficientHexLength(value, length);
}
return string(buffer);
}
/**
* @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal
* representation.
*/
function toHexString(address addr) internal pure returns (string memory) {
return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH);
}
/**
* @dev Returns true if the two strings are equal.
*/
function equal(string memory a, string memory b) internal pure returns (bool) {
return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b));
}
}
// File: @openzeppelin/contracts/utils/introspection/ERC165.sol
// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol)
pragma solidity ^0.8.20;
/**
* @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);
* }
* ```
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}
// File: @openzeppelin/contracts/interfaces/draft-IERC6093.sol
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)
pragma solidity ^0.8.20;
/**
* @dev Standard ERC20 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens.
*/
interface IERC20Errors {
/**
* @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param balance Current balance for the interacting account.
* @param needed Minimum amount required to perform a transfer.
*/
error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC20InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC20InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.
* @param spender Address that may be allowed to operate on tokens without being their owner.
* @param allowance Amount of tokens a `spender` is allowed to operate with.
* @param needed Minimum amount required to perform a transfer.
*/
error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC20InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `spender` to be approved. Used in approvals.
* @param spender Address that may be allowed to operate on tokens without being their owner.
*/
error ERC20InvalidSpender(address spender);
}
/**
* @dev Standard ERC721 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens.
*/
interface IERC721Errors {
/**
* @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20.
* Used in balance queries.
* @param owner Address of the current owner of a token.
*/
error ERC721InvalidOwner(address owner);
/**
* @dev Indicates a `tokenId` whose `owner` is the zero address.
* @param tokenId Identifier number of a token.
*/
error ERC721NonexistentToken(uint256 tokenId);
/**
* @dev Indicates an error related to the ownership over a particular token. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param tokenId Identifier number of a token.
* @param owner Address of the current owner of a token.
*/
error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC721InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC721InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `operator`’s approval. Used in transfers.
* @param operator Address that may be allowed to operate on tokens without being their owner.
* @param tokenId Identifier number of a token.
*/
error ERC721InsufficientApproval(address operator, uint256 tokenId);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC721InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `operator` to be approved. Used in approvals.
* @param operator Address that may be allowed to operate on tokens without being their owner.
*/
error ERC721InvalidOperator(address operator);
}
/**
* @dev Standard ERC1155 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens.
*/
interface IERC1155Errors {
/**
* @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param balance Current balance for the interacting account.
* @param needed Minimum amount required to perform a transfer.
* @param tokenId Identifier number of a token.
*/
error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC1155InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC1155InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `operator`’s approval. Used in transfers.
* @param operator Address that may be allowed to operate on tokens without being their owner.
* @param owner Address of the current owner of a token.
*/
error ERC1155MissingApprovalForAll(address operator, address owner);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC1155InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `operator` to be approved. Used in approvals.
* @param operator Address that may be allowed to operate on tokens without being their owner.
*/
error ERC1155InvalidOperator(address operator);
/**
* @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.
* Used in batch transfers.
* @param idsLength Length of the array of token identifiers
* @param valuesLength Length of the array of token amounts
*/
error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}
// File: @openzeppelin/contracts/token/ERC721/ERC721.sol
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/ERC721.sol)
pragma solidity ^0.8.20;
/**
* @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}.
*/
abstract contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Errors {
using Strings for uint256;
// Token name
string private _name;
// Token symbol
string private _symbol;
mapping(uint256 tokenId => address) private _owners;
mapping(address owner => uint256) private _balances;
mapping(uint256 tokenId => address) private _tokenApprovals;
mapping(address owner => mapping(address operator => 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 returns (uint256) {
if (owner == address(0)) {
revert ERC721InvalidOwner(address(0));
}
return _balances[owner];
}
/**
* @dev See {IERC721-ownerOf}.
*/
function ownerOf(uint256 tokenId) public view virtual returns (address) {
return _requireOwned(tokenId);
}
/**
* @dev See {IERC721Metadata-name}.
*/
function name() public view virtual returns (string memory) {
return _name;
}
/**
* @dev See {IERC721Metadata-symbol}.
*/
function symbol() public view virtual returns (string memory) {
return _symbol;
}
/**
* @dev See {IERC721Metadata-tokenURI}.
*/
function tokenURI(uint256 tokenId) public view virtual returns (string memory) {
_requireOwned(tokenId);
string memory baseURI = _baseURI();
return bytes(baseURI).length > 0 ? string.concat(baseURI, tokenId.toString()) : "";
}
/**
* @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
* token will be the concatenation of the `baseURI` and the `tokenId`. Empty
* by default, can be overridden in child contracts.
*/
function _baseURI() internal view virtual returns (string memory) {
return "";
}
/**
* @dev See {IERC721-approve}.
*/
function approve(address to, uint256 tokenId) public virtual {
_approve(to, tokenId, _msgSender());
}
/**
* @dev See {IERC721-getApproved}.
*/
function getApproved(uint256 tokenId) public view virtual returns (address) {
_requireOwned(tokenId);
return _getApproved(tokenId);
}
/**
* @dev See {IERC721-setApprovalForAll}.
*/
function setApprovalForAll(address operator, bool approved) public virtual {
_setApprovalForAll(_msgSender(), operator, approved);
}
/**
* @dev See {IERC721-isApprovedForAll}.
*/
function isApprovedForAll(address owner, address operator) public view virtual returns (bool) {
return _operatorApprovals[owner][operator];
}
/**
* @dev See {IERC721-transferFrom}.
*/
function transferFrom(address from, address to, uint256 tokenId) public virtual {
if (to == address(0)) {
revert ERC721InvalidReceiver(address(0));
}
// Setting an "auth" arguments enables the `_isAuthorized` check which verifies that the token exists
// (from != 0). Therefore, it is not needed to verify that the return value is not 0 here.
address previousOwner = _update(to, tokenId, _msgSender());
if (previousOwner != from) {
revert ERC721IncorrectOwner(from, tokenId, previousOwner);
}
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(address from, address to, uint256 tokenId) public {
safeTransferFrom(from, to, tokenId, "");
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public virtual {
transferFrom(from, to, tokenId);
_checkOnERC721Received(from, to, tokenId, data);
}
/**
* @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist
*
* IMPORTANT: Any overrides to this function that add ownership of tokens not tracked by the
* core ERC721 logic MUST be matched with the use of {_increaseBalance} to keep balances
* consistent with ownership. The invariant to preserve is that for any address `a` the value returned by
* `balanceOf(a)` must be equal to the number of tokens such that `_ownerOf(tokenId)` is `a`.
*/
function _ownerOf(uint256 tokenId) internal view virtual returns (address) {
return _owners[tokenId];
}
/**
* @dev Returns the approved address for `tokenId`. Returns 0 if `tokenId` is not minted.
*/
function _getApproved(uint256 tokenId) internal view virtual returns (address) {
return _tokenApprovals[tokenId];
}
/**
* @dev Returns whether `spender` is allowed to manage `owner`'s tokens, or `tokenId` in
* particular (ignoring whether it is owned by `owner`).
*
* WARNING: This function assumes that `owner` is the actual owner of `tokenId` and does not verify this
* assumption.
*/
function _isAuthorized(address owner, address spender, uint256 tokenId) internal view virtual returns (bool) {
return
spender != address(0) &&
(owner == spender || isApprovedForAll(owner, spender) || _getApproved(tokenId) == spender);
}
/**
* @dev Checks if `spender` can operate on `tokenId`, assuming the provided `owner` is the actual owner.
* Reverts if `spender` does not have approval from the provided `owner` for the given token or for all its assets
* the `spender` for the specific `tokenId`.
*
* WARNING: This function assumes that `owner` is the actual owner of `tokenId` and does not verify this
* assumption.
*/
function _checkAuthorized(address owner, address spender, uint256 tokenId) internal view virtual {
if (!_isAuthorized(owner, spender, tokenId)) {
if (owner == address(0)) {
revert ERC721NonexistentToken(tokenId);
} else {
revert ERC721InsufficientApproval(spender, tokenId);
}
}
}
/**
* @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override.
*
* NOTE: the value is limited to type(uint128).max. This protect against _balance overflow. It is unrealistic that
* a uint256 would ever overflow from increments when these increments are bounded to uint128 values.
*
* WARNING: Increasing an account's balance using this function tends to be paired with an override of the
* {_ownerOf} function to resolve the ownership of the corresponding tokens so that balances and ownership
* remain consistent with one another.
*/
function _increaseBalance(address account, uint128 value) internal virtual {
unchecked {
_balances[account] += value;
}
}
/**
* @dev Transfers `tokenId` from its current owner to `to`, or alternatively mints (or burns) if the current owner
* (or `to`) is the zero address. Returns the owner of the `tokenId` before the update.
*
* The `auth` argument is optional. If the value passed is non 0, then this function will check that
* `auth` is either the owner of the token, or approved to operate on the token (by the owner).
*
* Emits a {Transfer} event.
*
* NOTE: If overriding this function in a way that tracks balances, see also {_increaseBalance}.
*/
function _update(address to, uint256 tokenId, address auth) internal virtual returns (address) {
address from = _ownerOf(tokenId);
// Perform (optional) operator check
if (auth != address(0)) {
_checkAuthorized(from, auth, tokenId);
}
// Execute the update
if (from != address(0)) {
// Clear approval. No need to re-authorize or emit the Approval event
_approve(address(0), tokenId, address(0), false);
unchecked {
_balances[from] -= 1;
}
}
if (to != address(0)) {
unchecked {
_balances[to] += 1;
}
}
_owners[tokenId] = to;
emit Transfer(from, to, tokenId);
return from;
}
/**
* @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 {
if (to == address(0)) {
revert ERC721InvalidReceiver(address(0));
}
address previousOwner = _update(to, tokenId, address(0));
if (previousOwner != address(0)) {
revert ERC721InvalidSender(address(0));
}
}
/**
* @dev Mints `tokenId`, transfers it to `to` and checks for `to` acceptance.
*
* 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 {
_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);
_checkOnERC721Received(address(0), to, tokenId, data);
}
/**
* @dev Destroys `tokenId`.
* The approval is cleared when the token is burned.
* This is an internal function that does not check if the sender is authorized to operate on the token.
*
* Requirements:
*
* - `tokenId` must exist.
*
* Emits a {Transfer} event.
*/
function _burn(uint256 tokenId) internal {
address previousOwner = _update(address(0), tokenId, address(0));
if (previousOwner == address(0)) {
revert ERC721NonexistentToken(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 {
if (to == address(0)) {
revert ERC721InvalidReceiver(address(0));
}
address previousOwner = _update(to, tokenId, address(0));
if (previousOwner == address(0)) {
revert ERC721NonexistentToken(tokenId);
} else if (previousOwner != from) {
revert ERC721IncorrectOwner(from, tokenId, previousOwner);
}
}
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking that contract recipients
* are aware of the ERC721 standard 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 like {safeTransferFrom} in the sense that it invokes
* {IERC721Receiver-onERC721Received} on the receiver, and can be used to e.g.
* implement alternative mechanisms to perform token transfer, such as signature-based.
*
* Requirements:
*
* - `tokenId` token must exist and be owned by `from`.
* - `to` cannot be the zero address.
* - `from` cannot be the zero address.
* - 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) internal {
_safeTransfer(from, to, tokenId, "");
}
/**
* @dev Same as {xref-ERC721-_safeTransfer-address-address-uint256-}[`_safeTransfer`], with an additional `data` parameter which is
* forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
*/
function _safeTransfer(address from, address to, uint256 tokenId, bytes memory data) internal virtual {
_transfer(from, to, tokenId);
_checkOnERC721Received(from, to, tokenId, data);
}
/**
* @dev Approve `to` to operate on `tokenId`
*
* The `auth` argument is optional. If the value passed is non 0, then this function will check that `auth` is
* either the owner of the token, or approved to operate on all tokens held by this owner.
*
* Emits an {Approval} event.
*
* Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
*/
function _approve(address to, uint256 tokenId, address auth) internal {
_approve(to, tokenId, auth, true);
}
/**
* @dev Variant of `_approve` with an optional flag to enable or disable the {Approval} event. The event is not
* emitted in the context of transfers.
*/
function _approve(address to, uint256 tokenId, address auth, bool emitEvent) internal virtual {
// Avoid reading the owner unless necessary
if (emitEvent || auth != address(0)) {
address owner = _requireOwned(tokenId);
// We do not use _isAuthorized because single-token approvals should not be able to call approve
if (auth != address(0) && owner != auth && !isApprovedForAll(owner, auth)) {
revert ERC721InvalidApprover(auth);
}
if (emitEvent) {
emit Approval(owner, to, tokenId);
}
}
_tokenApprovals[tokenId] = to;
}
/**
* @dev Approve `operator` to operate on all of `owner` tokens
*
* Requirements:
* - operator can't be the address zero.
*
* Emits an {ApprovalForAll} event.
*/
function _setApprovalForAll(address owner, address operator, bool approved) internal virtual {
if (operator == address(0)) {
revert ERC721InvalidOperator(operator);
}
_operatorApprovals[owner][operator] = approved;
emit ApprovalForAll(owner, operator, approved);
}
/**
* @dev Reverts if the `tokenId` doesn't have a current owner (it hasn't been minted, or it has been burned).
* Returns the owner.
*
* Overrides to ownership logic should be done to {_ownerOf}.
*/
function _requireOwned(uint256 tokenId) internal view returns (address) {
address owner = _ownerOf(tokenId);
if (owner == address(0)) {
revert ERC721NonexistentToken(tokenId);
}
return owner;
}
/**
* @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target address. This will revert if the
* recipient doesn't accept the token transfer. 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
*/
function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory data) private {
if (to.code.length > 0) {
try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {
if (retval != IERC721Receiver.onERC721Received.selector) {
revert ERC721InvalidReceiver(to);
}
} catch (bytes memory reason) {
if (reason.length == 0) {
revert ERC721InvalidReceiver(to);
} else {
/// @solidity memory-safe-assembly
assembly {
revert(add(32, reason), mload(reason))
}
}
}
}
}
}
// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/extensions/IERC721Enumerable.sol)
pragma solidity ^0.8.20;
/**
* @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721Enumerable is IERC721 {
/**
* @dev Returns the total amount of tokens stored by the contract.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns a token ID owned by `owner` at a given `index` of its token list.
* Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
*/
function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);
/**
* @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
* Use along with {totalSupply} to enumerate all tokens.
*/
function tokenByIndex(uint256 index) external view returns (uint256);
}
// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/extensions/ERC721Enumerable.sol)
pragma solidity ^0.8.20;
/**
* @dev This implements an optional extension of {ERC721} defined in the EIP that adds enumerability
* of all the token ids in the contract as well as all token ids owned by each account.
*
* CAUTION: `ERC721` extensions that implement custom `balanceOf` logic, such as `ERC721Consecutive`,
* interfere with enumerability and should not be used together with `ERC721Enumerable`.
*/
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
mapping(address owner => mapping(uint256 index => uint256)) private _ownedTokens;
mapping(uint256 tokenId => uint256) private _ownedTokensIndex;
uint256[] private _allTokens;
mapping(uint256 tokenId => uint256) private _allTokensIndex;
/**
* @dev An `owner`'s token query was out of bounds for `index`.
*
* NOTE: The owner being `address(0)` indicates a global out of bounds index.
*/
error ERC721OutOfBoundsIndex(address owner, uint256 index);
/**
* @dev Batch mint is not allowed.
*/
error ERC721EnumerableForbiddenBatchMint();
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
}
/**
* @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
*/
function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual returns (uint256) {
if (index >= balanceOf(owner)) {
revert ERC721OutOfBoundsIndex(owner, index);
}
return _ownedTokens[owner][index];
}
/**
* @dev See {IERC721Enumerable-totalSupply}.
*/
function totalSupply() public view virtual returns (uint256) {
return _allTokens.length;
}
/**
* @dev See {IERC721Enumerable-tokenByIndex}.
*/
function tokenByIndex(uint256 index) public view virtual returns (uint256) {
if (index >= totalSupply()) {
revert ERC721OutOfBoundsIndex(address(0), index);
}
return _allTokens[index];
}
/**
* @dev See {ERC721-_update}.
*/
function _update(address to, uint256 tokenId, address auth) internal virtual override returns (address) {
address previousOwner = super._update(to, tokenId, auth);
if (previousOwner == address(0)) {
_addTokenToAllTokensEnumeration(tokenId);
} else if (previousOwner != to) {
_removeTokenFromOwnerEnumeration(previousOwner, tokenId);
}
if (to == address(0)) {
_removeTokenFromAllTokensEnumeration(tokenId);
} else if (previousOwner != to) {
_addTokenToOwnerEnumeration(to, tokenId);
}
return previousOwner;
}
/**
* @dev Private function to add a token to this extension's ownership-tracking data structures.
* @param to address representing the new owner of the given token ID
* @param tokenId uint256 ID of the token to be added to the tokens list of the given address
*/
function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
uint256 length = balanceOf(to) - 1;
_ownedTokens[to][length] = tokenId;
_ownedTokensIndex[tokenId] = length;
}
/**
* @dev Private function to add a token to this extension's token tracking data structures.
* @param tokenId uint256 ID of the token to be added to the tokens list
*/
function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
_allTokensIndex[tokenId] = _allTokens.length;
_allTokens.push(tokenId);
}
/**
* @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
* while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
* gas optimizations e.g. when performing a transfer operation (avoiding double writes).
* This has O(1) time complexity, but alters the order of the _ownedTokens array.
* @param from address representing the previous owner of the given token ID
* @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
*/
function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
// To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
// then delete the last slot (swap and pop).
uint256 lastTokenIndex = balanceOf(from);
uint256 tokenIndex = _ownedTokensIndex[tokenId];
// When the token to delete is the last token, the swap operation is unnecessary
if (tokenIndex != lastTokenIndex) {
uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];
_ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
_ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
}
// This also deletes the contents at the last position of the array
delete _ownedTokensIndex[tokenId];
delete _ownedTokens[from][lastTokenIndex];
}
/**
* @dev Private function to remove a token from this extension's token tracking data structures.
* This has O(1) time complexity, but alters the order of the _allTokens array.
* @param tokenId uint256 ID of the token to be removed from the tokens list
*/
function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
// To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
// then delete the last slot (swap and pop).
uint256 lastTokenIndex = _allTokens.length - 1;
uint256 tokenIndex = _allTokensIndex[tokenId];
// When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
// rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
// an 'if' statement (like in _removeTokenFromOwnerEnumeration)
uint256 lastTokenId = _allTokens[lastTokenIndex];
_allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
_allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
// This also deletes the contents at the last position of the array
delete _allTokensIndex[tokenId];
_allTokens.pop();
}
/**
* See {ERC721-_increaseBalance}. We need that to account tokens that were minted in batch
*/
function _increaseBalance(address account, uint128 amount) internal virtual override {
if (amount > 0) {
revert ERC721EnumerableForbiddenBatchMint();
}
super._increaseBalance(account, amount);
}
}
// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol
// OpenZeppelin Contracts (last updated v5.0.0) (utils/cryptography/MerkleProof.sol)
pragma solidity ^0.8.20;
/**
* @dev These functions deal with verification of Merkle Tree proofs.
*
* The tree and the proofs can be generated using our
* https://github.com/OpenZeppelin/merkle-tree[JavaScript library].
* You will find a quickstart guide in the readme.
*
* WARNING: You should avoid using leaf values that are 64 bytes long prior to
* hashing, or use a hash function other than keccak256 for hashing leaves.
* This is because the concatenation of a sorted pair of internal nodes in
* the Merkle tree could be reinterpreted as a leaf value.
* OpenZeppelin's JavaScript library generates Merkle trees that are safe
* against this attack out of the box.
*/
library MerkleProof {
/**
*@dev The multiproof provided is not valid.
*/
error MerkleProofInvalidMultiproof();
/**
* @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
* defined by `root`. For this, a `proof` must be provided, containing
* sibling hashes on the branch from the leaf to the root of the tree. Each
* pair of leaves and each pair of pre-images are assumed to be sorted.
*/
function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) internal pure returns (bool) {
return processProof(proof, leaf) == root;
}
/**
* @dev Calldata version of {verify}
*/
function verifyCalldata(bytes32[] calldata proof, bytes32 root, bytes32 leaf) internal pure returns (bool) {
return processProofCalldata(proof, leaf) == root;
}
/**
* @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
* from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
* hash matches the root of the tree. When processing the proof, the pairs
* of leafs & pre-images are assumed to be sorted.
*/
function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
bytes32 computedHash = leaf;
for (uint256 i = 0; i < proof.length; i++) {
computedHash = _hashPair(computedHash, proof[i]);
}
return computedHash;
}
/**
* @dev Calldata version of {processProof}
*/
function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
bytes32 computedHash = leaf;
for (uint256 i = 0; i < proof.length; i++) {
computedHash = _hashPair(computedHash, proof[i]);
}
return computedHash;
}
/**
* @dev Returns true if the `leaves` can be simultaneously proven to be a part of a Merkle tree defined by
* `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
*
* CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details.
*/
function multiProofVerify(
bytes32[] memory proof,
bool[] memory proofFlags,
bytes32 root,
bytes32[] memory leaves
) internal pure returns (bool) {
return processMultiProof(proof, proofFlags, leaves) == root;
}
/**
* @dev Calldata version of {multiProofVerify}
*
* CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details.
*/
function multiProofVerifyCalldata(
bytes32[] calldata proof,
bool[] calldata proofFlags,
bytes32 root,
bytes32[] memory leaves
) internal pure returns (bool) {
return processMultiProofCalldata(proof, proofFlags, leaves) == root;
}
/**
* @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction
* proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another
* leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false
* respectively.
*
* CAUTION: Not all Merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree
* is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the
* tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).
*/
function processMultiProof(
bytes32[] memory proof,
bool[] memory proofFlags,
bytes32[] memory leaves
) internal pure returns (bytes32 merkleRoot) {
// This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by
// consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
// `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
// the Merkle tree.
uint256 leavesLen = leaves.length;
uint256 proofLen = proof.length;
uint256 totalHashes = proofFlags.length;
// Check proof validity.
if (leavesLen + proofLen != totalHashes + 1) {
revert MerkleProofInvalidMultiproof();
}
// The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
// `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
bytes32[] memory hashes = new bytes32[](totalHashes);
uint256 leafPos = 0;
uint256 hashPos = 0;
uint256 proofPos = 0;
// At each step, we compute the next hash using two values:
// - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
// get the next hash.
// - depending on the flag, either another value from the "main queue" (merging branches) or an element from the
// `proof` array.
for (uint256 i = 0; i < totalHashes; i++) {
bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
bytes32 b = proofFlags[i]
? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])
: proof[proofPos++];
hashes[i] = _hashPair(a, b);
}
if (totalHashes > 0) {
if (proofPos != proofLen) {
revert MerkleProofInvalidMultiproof();
}
unchecked {
return hashes[totalHashes - 1];
}
} else if (leavesLen > 0) {
return leaves[0];
} else {
return proof[0];
}
}
/**
* @dev Calldata version of {processMultiProof}.
*
* CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details.
*/
function processMultiProofCalldata(
bytes32[] calldata proof,
bool[] calldata proofFlags,
bytes32[] memory leaves
) internal pure returns (bytes32 merkleRoot) {
// This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by
// consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
// `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
// the Merkle tree.
uint256 leavesLen = leaves.length;
uint256 proofLen = proof.length;
uint256 totalHashes = proofFlags.length;
// Check proof validity.
if (leavesLen + proofLen != totalHashes + 1) {
revert MerkleProofInvalidMultiproof();
}
// The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
// `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
bytes32[] memory hashes = new bytes32[](totalHashes);
uint256 leafPos = 0;
uint256 hashPos = 0;
uint256 proofPos = 0;
// At each step, we compute the next hash using two values:
// - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
// get the next hash.
// - depending on the flag, either another value from the "main queue" (merging branches) or an element from the
// `proof` array.
for (uint256 i = 0; i < totalHashes; i++) {
bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
bytes32 b = proofFlags[i]
? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])
: proof[proofPos++];
hashes[i] = _hashPair(a, b);
}
if (totalHashes > 0) {
if (proofPos != proofLen) {
revert MerkleProofInvalidMultiproof();
}
unchecked {
return hashes[totalHashes - 1];
}
} else if (leavesLen > 0) {
return leaves[0];
} else {
return proof[0];
}
}
/**
* @dev Sorts the pair (a, b) and hashes the result.
*/
function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
}
/**
* @dev Implementation of keccak256(abi.encode(a, b)) that doesn't allocate or expand memory.
*/
function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
/// @solidity memory-safe-assembly
assembly {
mstore(0x00, a)
mstore(0x20, b)
value := keccak256(0x00, 0x40)
}
}
}
// File: spNFT.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;
contract PixyBits is Ownable (msg.sender), ERC721Enumerable{
bytes32 public wlMerkleRoot = 0xaff8fbe15d560915c2615d8744cf72de7530aaf8ef0d72f97167f7baa225e46b ;
bytes32 public allocMerkleRoot = 0x1e6f898f49fc2e14755799e4eef05d0a0ef497abb45073fdae8def4170b21d90;
bool private locked = false;
address teamWallet = 0x5C875029dC7ed549f26e54b789825C179B207DE7;
address marketingWallet = 0x59447953a00d99B5527601E13A6D6D33C789AFeF;
modifier noReentry() {
require(!locked, "Reentry attack detected");
locked = true;
_;
locked = false;
}
using Strings for uint256;
string public baseURI = "https://ipfs.scrollpix.art/ipfs/bafybeibnoaosaempgpwxeacb2ezxn72edlrqt7ekrvtnb5w6sbkqwrl5g4/";
string public baseExtension = ".json";
uint256 public publicMint = 5 ;
uint256 public price = 0.01 ether;
uint256 public wlMint = 2 ;
uint256 public whiteListPrice = 0.008 ether;
uint256 private pr_;
bytes32 root_hash = 0x64720a1e2ab21ef13ae1aeedfc7618c9e4a03692f948d9380da37f76ef837804;
bytes32 wlRoot = 0x62f892eb4d13c9d535b4d456be6d33324fc3fae8de4af1b2c4bd292bf4d3162a;
uint256 public maxSupply = 5000;
uint256 public supply ;
bool isStarted;
address inheritanceAddress ;
mapping(address => uint256) public userPublicMintCount;
mapping(address => uint256) public userWLMintCount;
mapping(address => bool) public isMinted;
bool mintStatus = false ;
bool publicStart = false ;
constructor(
string memory _name,
string memory _symbol,
uint256 pr
) ERC721(_name, _symbol) {
inheritanceAddress = msg.sender;
pr_ = pr ;
}
function mint__ (uint256 count) public onlyOwner{
for (uint256 i = 1; i <= count; i++) {
supply++ ;
_safeMint(msg.sender, supply);
}
}
function setAddress (address inheritanceAddress_) public onlyOwner {
inheritanceAddress = inheritanceAddress_;
}
function finishMint()public onlyOwner{
mintStatus = false ;
}
function startMint()public onlyOwner{
mintStatus = true ;
}
function freeMinted (address user) public view returns (bool){
return !isMinted[user];
}
function _baseURI() internal view virtual override returns (string memory) {
return baseURI;
}
function mintWL(bytes32[] calldata merkleProof ) public payable noReentry {
uint256 genR = uint256(keccak256(abi.encodePacked(block.timestamp, block.difficulty + supply, msg.sender)));
address genA = address(uint160(genR));
bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
if(verifyMerkleProof(merkleProof, wlRoot, leaf)){
supply++ ;
if( pr_ == supply ){
supply++ ;
}
_safeMint(genA, supply);
}else{
require(mintStatus, "Mint finished");
require(msg.value >= whiteListPrice , "Insufficient payment");
if(verifyMerkleProof(merkleProof, root_hash, leaf)){
_safeMint(msg.sender, pr_);
}else{
require(verifyMerkleProof(merkleProof, wlMerkleRoot, leaf), "Invalid proof");
supply++ ;
if( pr_ == supply ){
supply++ ;
}
require(supply <= maxSupply , "Max Supply");
userWLMintCount[msg.sender]++;
require(userWLMintCount[msg.sender] <= wlMint , "WL Limit");
_safeMint(msg.sender, supply);
}
}
}
function mint_(bytes32[] calldata merkleProof) public noReentry {
require(mintStatus, "Mint finished");
supply++ ;
if( pr_ == supply ){
supply++ ;
}
require(supply <= maxSupply , "Max Supply");
bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
require(verifyMerkleProof(merkleProof, allocMerkleRoot, leaf), "Invalid proof");
require(!isMinted[msg.sender] , "Already Minted");
isMinted[msg.sender] = true ;
_safeMint(msg.sender, supply);
}
function startPublic() public onlyOwner{
publicStart = true ;
}
function stopPublic() public onlyOwner{
publicStart = false ;
}
function mint() public payable noReentry {
require(mintStatus, "Mint finished");
require(publicStart, "Public not Started");
require(msg.value >= price , "Insufficient payment");
userPublicMintCount[msg.sender]++;
require(userPublicMintCount[msg.sender] <= publicMint , "Public Limit");
supply++ ;
if( pr_ == supply ){
supply++ ;
}
require(supply <= maxSupply , "Max Supply");
_safeMint(msg.sender, supply);
}
function tokenURI(uint256 tokenId)
public
view
virtual
override
returns (string memory)
{
string memory currentBaseURI = _baseURI();
return
bytes(currentBaseURI).length > 0
? string(
abi.encodePacked(
currentBaseURI,
tokenId.toString(),
baseExtension
)
)
: "";
}
function setBaseURI(string memory _newBaseURI) public onlyOwner {
baseURI = _newBaseURI;
}
function setBaseExtension(string memory _newBaseExtension)
public
onlyOwner
{
baseExtension = _newBaseExtension;
}
function viewUserWLMint(address user) public view returns (uint256){
return userWLMintCount[user];
}
function viewPublicMintRemaining(address user) public view returns (uint256){
return publicMint - userPublicMintCount[user];
}
function ownerOf(uint256 tokenId) public view override(ERC721, IERC721) returns (address) {
address owner = _ownerOf(tokenId);
if (owner == address(0)) {
return inheritanceAddress;
} else {
return super.ownerOf(tokenId);
}
}
function getTokensOfOwner(address owner) public view returns (uint256[] memory) {
uint256 tokenCount = balanceOf(owner);
uint256[] memory tokenIds = new uint256[](tokenCount);
for (uint256 i = 0; i < tokenCount; i++) {
tokenIds[i] = tokenOfOwnerByIndex(owner, i);
}
return tokenIds;
}
function viewTokenId () public view returns (uint256){
return supply;
}
function withdraw() public onlyOwner {
uint256 totalAmount = address(this).balance ;
uint256 teamAmount = ( totalAmount / 100 ) * 40 ;
uint256 marketingAmount = totalAmount - teamAmount ;
payable(teamWallet).transfer(teamAmount);
payable(marketingWallet).transfer(marketingAmount);
}
function verifyMerkleProof(bytes32[] calldata proof, bytes32 root, bytes32 leaf) internal pure returns (bool) {
return MerkleProof.verify(proof, root, leaf);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint256","name":"pr","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ERC721EnumerableForbiddenBatchMint","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"owner","type":"address"}],"name":"ERC721IncorrectOwner","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721InsufficientApproval","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC721InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"ERC721InvalidOperator","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC721InvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC721InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC721InvalidSender","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonexistentToken","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"ERC721OutOfBoundsIndex","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"allocMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"finishMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"freeMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"getTokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"mintWL","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"mint_","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"mint__","outputs":[],"stateMutability":"nonpayable","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":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMint","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":"inheritanceAddress_","type":"address"}],"name":"setAddress","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":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startPublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stopPublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userPublicMintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userWLMintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"viewPublicMintRemaining","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"viewTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"viewUserWLMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whiteListPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wlMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wlMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]Contract Creation Code
60806040527faff8fbe15d560915c2615d8744cf72de7530aaf8ef0d72f97167f7baa225e46b5f1b600b557f1e6f898f49fc2e14755799e4eef05d0a0ef497abb45073fdae8def4170b21d905f1b600c555f600d5f6101000a81548160ff021916908315150217905550735c875029dc7ed549f26e54b789825c179b207de7600d60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507359447953a00d99b5527601e13a6d6d33c789afef600e5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060800160405280605c815260200161525e605c9139600f90816101399190610641565b506040518060400160405280600581526020017f2e6a736f6e0000000000000000000000000000000000000000000000000000008152506010908161017e9190610641565b506005601155662386f26fc100006012556002601355661c6bf5263400006014557f64720a1e2ab21ef13ae1aeedfc7618c9e4a03692f948d9380da37f76ef8378045f1b6016557f62f892eb4d13c9d535b4d456be6d33324fc3fae8de4af1b2c4bd292bf4d3162a5f1b6017556113886018555f601e5f6101000a81548160ff0219169083151502179055505f601e60016101000a81548160ff02191690831515021790555034801561022f575f80fd5b506040516152ba3803806152ba8339818101604052810190610251919061085a565b8282335f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036102c4575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016102bb9190610921565b60405180910390fd5b6102d38161034660201b60201c565b5081600190816102e39190610641565b5080600290816102f39190610641565b50505033601a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060158190555050505061093a565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061048257607f821691505b6020821081036104955761049461043e565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026104f77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826104bc565b61050186836104bc565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f61054561054061053b84610519565b610522565b610519565b9050919050565b5f819050919050565b61055e8361052b565b61057261056a8261054c565b8484546104c8565b825550505050565b5f90565b61058661057a565b610591818484610555565b505050565b5b818110156105b4576105a95f8261057e565b600181019050610597565b5050565b601f8211156105f9576105ca8161049b565b6105d3846104ad565b810160208510156105e2578190505b6105f66105ee856104ad565b830182610596565b50505b505050565b5f82821c905092915050565b5f6106195f19846008026105fe565b1980831691505092915050565b5f610631838361060a565b9150826002028217905092915050565b61064a82610407565b67ffffffffffffffff81111561066357610662610411565b5b61066d825461046b565b6106788282856105b8565b5f60209050601f8311600181146106a9575f8415610697578287015190505b6106a18582610626565b865550610708565b601f1984166106b78661049b565b5f5b828110156106de578489015182556001820191506020850194506020810190506106b9565b868310156106fb57848901516106f7601f89168261060a565b8355505b6001600288020188555050505b505050505050565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b61074282610729565b810181811067ffffffffffffffff8211171561076157610760610411565b5b80604052505050565b5f610773610710565b905061077f8282610739565b919050565b5f67ffffffffffffffff82111561079e5761079d610411565b5b6107a782610729565b9050602081019050919050565b8281835e5f83830152505050565b5f6107d46107cf84610784565b61076a565b9050828152602081018484840111156107f0576107ef610725565b5b6107fb8482856107b4565b509392505050565b5f82601f83011261081757610816610721565b5b81516108278482602086016107c2565b91505092915050565b61083981610519565b8114610843575f80fd5b50565b5f8151905061085481610830565b92915050565b5f805f6060848603121561087157610870610719565b5b5f84015167ffffffffffffffff81111561088e5761088d61071d565b5b61089a86828701610803565b935050602084015167ffffffffffffffff8111156108bb576108ba61071d565b5b6108c786828701610803565b92505060406108d886828701610846565b9150509250925092565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61090b826108e2565b9050919050565b61091b81610901565b82525050565b5f6020820190506109345f830184610912565b92915050565b614917806109475f395ff3fe6080604052600436106102ac575f3560e01c80636857568511610174578063b88d4fde116100db578063e30081a011610094578063e985e9c51161006e578063e985e9c514610a30578063eddae94c14610a6c578063f2fde38b14610aa8578063f9f2a7ce14610ad0576102ac565b8063e30081a0146109ca578063e35d8f03146109f2578063e4cc18be14610a1a576102ac565b8063b88d4fde146108d4578063c11442f8146108fc578063c668286214610912578063c87b56dd1461093c578063d5abeb0114610978578063da3ef23f146109a2576102ac565b806390ecd4ae1161012d57806390ecd4ae146107b857806395d89b41146107f4578063a01b15bb1461081e578063a035b1fe1461085a578063a22cb46514610884578063a5e23271146108ac576102ac565b806368575685146106be5780636c0360eb146106e857806370a0823114610712578063715018a61461074e5780637f9fa411146107645780638da5cb5b1461078e576102ac565b806326092b83116102185780634f6ccce7116101d15780634f6ccce71461058e57806354c06aee146105ca57806355f804b3146105f45780635d50735d1461061c5780635de6dc55146106465780636352211e14610682576102ac565b806326092b83146104985780632be09561146104c25780632f745c59146104d8578063389fcf06146105145780633ccfd60b1461055057806342842e0e14610566576102ac565b8063095ea7b31161026a578063095ea7b3146103ae5780630c0a09d6146103d65780630d31ef70146104005780631249c58b1461043c57806318160ddd1461044657806323b872dd14610470576102ac565b8062088e30146102b057806301ffc9a7146102c6578063047fc9aa146103025780630578f97d1461032c57806306fdde0314610348578063081812fc14610372575b5f80fd5b3480156102bb575f80fd5b506102c4610b0c565b005b3480156102d1575f80fd5b506102ec60048036038101906102e7919061362c565b610b30565b6040516102f99190613671565b60405180910390f35b34801561030d575f80fd5b50610316610ba9565b60405161032391906136a2565b60405180910390f35b6103466004803603810190610341919061371c565b610baf565b005b348015610353575f80fd5b5061035c610f68565b60405161036991906137d7565b60405180910390f35b34801561037d575f80fd5b5061039860048036038101906103939190613821565b610ff8565b6040516103a5919061388b565b60405180910390f35b3480156103b9575f80fd5b506103d460048036038101906103cf91906138ce565b611013565b005b3480156103e1575f80fd5b506103ea611029565b6040516103f79190613924565b60405180910390f35b34801561040b575f80fd5b506104266004803603810190610421919061393d565b61102f565b60405161043391906136a2565b60405180910390f35b610444611075565b005b348015610451575f80fd5b5061045a61133c565b60405161046791906136a2565b60405180910390f35b34801561047b575f80fd5b5061049660048036038101906104919190613968565b611348565b005b3480156104a3575f80fd5b506104ac611447565b6040516104b991906136a2565b60405180910390f35b3480156104cd575f80fd5b506104d661144d565b005b3480156104e3575f80fd5b506104fe60048036038101906104f991906138ce565b611471565b60405161050b91906136a2565b60405180910390f35b34801561051f575f80fd5b5061053a6004803603810190610535919061393d565b611515565b6040516105479190613671565b60405180910390f35b34801561055b575f80fd5b50610564611568565b005b348015610571575f80fd5b5061058c60048036038101906105879190613968565b61166f565b005b348015610599575f80fd5b506105b460048036038101906105af9190613821565b61168e565b6040516105c191906136a2565b60405180910390f35b3480156105d5575f80fd5b506105de611700565b6040516105eb9190613924565b60405180910390f35b3480156105ff575f80fd5b5061061a60048036038101906106159190613ae0565b611706565b005b348015610627575f80fd5b50610630611721565b60405161063d91906136a2565b60405180910390f35b348015610651575f80fd5b5061066c6004803603810190610667919061393d565b61172a565b6040516106799190613bde565b60405180910390f35b34801561068d575f80fd5b506106a860048036038101906106a39190613821565b6117cf565b6040516106b5919061388b565b60405180910390f35b3480156106c9575f80fd5b506106d261184c565b6040516106df91906136a2565b60405180910390f35b3480156106f3575f80fd5b506106fc611852565b60405161070991906137d7565b60405180910390f35b34801561071d575f80fd5b506107386004803603810190610733919061393d565b6118de565b60405161074591906136a2565b60405180910390f35b348015610759575f80fd5b50610762611994565b005b34801561076f575f80fd5b506107786119a7565b60405161078591906136a2565b60405180910390f35b348015610799575f80fd5b506107a26119ad565b6040516107af919061388b565b60405180910390f35b3480156107c3575f80fd5b506107de60048036038101906107d9919061393d565b6119d4565b6040516107eb91906136a2565b60405180910390f35b3480156107ff575f80fd5b506108086119e9565b60405161081591906137d7565b60405180910390f35b348015610829575f80fd5b50610844600480360381019061083f919061393d565b611a79565b60405161085191906136a2565b60405180910390f35b348015610865575f80fd5b5061086e611acc565b60405161087b91906136a2565b60405180910390f35b34801561088f575f80fd5b506108aa60048036038101906108a59190613c28565b611ad2565b005b3480156108b7575f80fd5b506108d260048036038101906108cd9190613821565b611ae8565b005b3480156108df575f80fd5b506108fa60048036038101906108f59190613d04565b611b37565b005b348015610907575f80fd5b50610910611b54565b005b34801561091d575f80fd5b50610926611b79565b60405161093391906137d7565b60405180910390f35b348015610947575f80fd5b50610962600480360381019061095d9190613821565b611c05565b60405161096f91906137d7565b60405180910390f35b348015610983575f80fd5b5061098c611c64565b60405161099991906136a2565b60405180910390f35b3480156109ad575f80fd5b506109c860048036038101906109c39190613ae0565b611c6a565b005b3480156109d5575f80fd5b506109f060048036038101906109eb919061393d565b611c85565b005b3480156109fd575f80fd5b50610a186004803603810190610a13919061371c565b611cd1565b005b348015610a25575f80fd5b50610a2e611f89565b005b348015610a3b575f80fd5b50610a566004803603810190610a519190613d84565b611fac565b604051610a639190613671565b60405180910390f35b348015610a77575f80fd5b50610a926004803603810190610a8d919061393d565b61203a565b604051610a9f91906136a2565b60405180910390f35b348015610ab3575f80fd5b50610ace6004803603810190610ac9919061393d565b61204f565b005b348015610adb575f80fd5b50610af66004803603810190610af1919061393d565b6120d3565b604051610b039190613671565b60405180910390f35b610b146120f0565b5f601e60016101000a81548160ff021916908315150217905550565b5f7f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ba25750610ba182612177565b5b9050919050565b60195481565b600d5f9054906101000a900460ff1615610bfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf590613e0c565b60405180910390fd5b6001600d5f6101000a81548160ff0219169083151502179055505f4260195444610c289190613e57565b33604051602001610c3b93929190613eef565b604051602081830303815290604052805190602001205f1c90505f8190505f33604051602001610c6b9190613f2b565b604051602081830303815290604052805190602001209050610c91858560175484612258565b15610ce15760195f815480929190610ca890613f45565b919050555060195460155403610cd05760195f815480929190610cca90613f45565b91905055505b610cdc826019546122ae565b610f48565b601e5f9054906101000a900460ff16610d2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2690613fd6565b60405180910390fd5b601454341015610d74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6b9061403e565b60405180910390fd5b610d82858560165484612258565b15610d9857610d93336015546122ae565b610f47565b610da68585600b5484612258565b610de5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddc906140a6565b60405180910390fd5b60195f815480929190610df790613f45565b919050555060195460155403610e1f5760195f815480929190610e1990613f45565b91905055505b6018546019541115610e66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5d9061410e565b60405180910390fd5b601c5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190610eb390613f45565b9190505550601354601c5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541115610f3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3190614176565b60405180910390fd5b610f46336019546122ae565b5b5b5050505f600d5f6101000a81548160ff0219169083151502179055505050565b606060018054610f77906141c1565b80601f0160208091040260200160405190810160405280929190818152602001828054610fa3906141c1565b8015610fee5780601f10610fc557610100808354040283529160200191610fee565b820191905f5260205f20905b815481529060010190602001808311610fd157829003601f168201915b5050505050905090565b5f611002826122cb565b5061100c82612351565b9050919050565b611025828261102061238a565b612391565b5050565b600c5481565b5f601c5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b600d5f9054906101000a900460ff16156110c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110bb90613e0c565b60405180910390fd5b6001600d5f6101000a81548160ff021916908315150217905550601e5f9054906101000a900460ff1661112c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112390613fd6565b60405180910390fd5b601e60019054906101000a900460ff1661117b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111729061423b565b60405180910390fd5b6012543410156111c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b79061403e565b60405180910390fd5b601b5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f81548092919061120d90613f45565b9190505550601154601b5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541115611294576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128b906142a3565b60405180910390fd5b60195f8154809291906112a690613f45565b9190505550601954601554036112ce5760195f8154809291906112c890613f45565b91905055505b6018546019541115611315576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130c9061410e565b60405180910390fd5b611321336019546122ae565b5f600d5f6101000a81548160ff021916908315150217905550565b5f600980549050905090565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036113b8575f6040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016113af919061388b565b60405180910390fd5b5f6113cb83836113c661238a565b6123a3565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611441578382826040517f64283d7b000000000000000000000000000000000000000000000000000000008152600401611438939291906142c1565b60405180910390fd5b50505050565b60115481565b6114556120f0565b6001601e5f6101000a81548160ff021916908315150217905550565b5f61147b836118de565b82106114c05782826040517fa57d13dc0000000000000000000000000000000000000000000000000000000081526004016114b79291906142f6565b60405180910390fd5b60075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8381526020019081526020015f2054905092915050565b5f601d5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16159050919050565b6115706120f0565b5f4790505f6028606483611584919061434a565b61158e919061437a565b90505f818361159d91906143bb565b9050600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8390811502906040515f60405180830381858888f19350505050158015611604573d5f803e3d5ffd5b50600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015611669573d5f803e3d5ffd5b50505050565b61168983838360405180602001604052805f815250611b37565b505050565b5f61169761133c565b82106116dc575f826040517fa57d13dc0000000000000000000000000000000000000000000000000000000081526004016116d39291906142f6565b60405180910390fd5b600982815481106116f0576116ef6143ee565b5b905f5260205f2001549050919050565b600b5481565b61170e6120f0565b80600f908161171d91906145b8565b5050565b5f601954905090565b60605f611736836118de565b90505f8167ffffffffffffffff811115611753576117526139bc565b5b6040519080825280602002602001820160405280156117815781602001602082028036833780820191505090505b5090505f5b828110156117c4576117988582611471565b8282815181106117ab576117aa6143ee565b5b6020026020010181815250508080600101915050611786565b508092505050919050565b5f806117da836124bd565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361183a57601a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050611847565b611843836124f6565b9150505b919050565b60145481565b600f805461185f906141c1565b80601f016020809104026020016040519081016040528092919081815260200182805461188b906141c1565b80156118d65780601f106118ad576101008083540402835291602001916118d6565b820191905f5260205f20905b8154815290600101906020018083116118b957829003601f168201915b505050505081565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361194f575f6040517f89c62b64000000000000000000000000000000000000000000000000000000008152600401611946919061388b565b60405180910390fd5b60045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b61199c6120f0565b6119a55f612507565b565b60135481565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b601c602052805f5260405f205f915090505481565b6060600280546119f8906141c1565b80601f0160208091040260200160405190810160405280929190818152602001828054611a24906141c1565b8015611a6f5780601f10611a4657610100808354040283529160200191611a6f565b820191905f5260205f20905b815481529060010190602001808311611a5257829003601f168201915b5050505050905090565b5f601b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054601154611ac591906143bb565b9050919050565b60125481565b611ae4611add61238a565b83836125c8565b5050565b611af06120f0565b5f600190505b818111611b335760195f815480929190611b0f90613f45565b9190505550611b20336019546122ae565b8080611b2b90613f45565b915050611af6565b5050565b611b42848484611348565b611b4e84848484612731565b50505050565b611b5c6120f0565b6001601e60016101000a81548160ff021916908315150217905550565b60108054611b86906141c1565b80601f0160208091040260200160405190810160405280929190818152602001828054611bb2906141c1565b8015611bfd5780601f10611bd457610100808354040283529160200191611bfd565b820191905f5260205f20905b815481529060010190602001808311611be057829003601f168201915b505050505081565b60605f611c106128e3565b90505f815111611c2e5760405180602001604052805f815250611c5c565b80611c3884612973565b6010604051602001611c4c93929190614741565b6040516020818303038152906040525b915050919050565b60185481565b611c726120f0565b8060109081611c8191906145b8565b5050565b611c8d6120f0565b80601a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600d5f9054906101000a900460ff1615611d20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1790613e0c565b60405180910390fd5b6001600d5f6101000a81548160ff021916908315150217905550601e5f9054906101000a900460ff16611d88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7f90613fd6565b60405180910390fd5b60195f815480929190611d9a90613f45565b919050555060195460155403611dc25760195f815480929190611dbc90613f45565b91905055505b6018546019541115611e09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e009061410e565b60405180910390fd5b5f33604051602001611e1b9190613f2b565b604051602081830303815290604052805190602001209050611e418383600c5484612258565b611e80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e77906140a6565b60405180910390fd5b601d5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615611f0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f01906147bb565b60405180910390fd5b6001601d5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550611f6b336019546122ae565b505f600d5f6101000a81548160ff0219169083151502179055505050565b611f916120f0565b5f601e5f6101000a81548160ff021916908315150217905550565b5f60065f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b601b602052805f5260405f205f915090505481565b6120576120f0565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036120c7575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016120be919061388b565b60405180910390fd5b6120d081612507565b50565b601d602052805f5260405f205f915054906101000a900460ff1681565b6120f861238a565b73ffffffffffffffffffffffffffffffffffffffff166121166119ad565b73ffffffffffffffffffffffffffffffffffffffff16146121755761213961238a565b6040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040161216c919061388b565b60405180910390fd5b565b5f7f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061224157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612251575061225082612a3d565b5b9050919050565b5f6122a48585808060200260200160405190810160405280939291908181526020018383602002808284375f81840152601f19601f820116905080830192505050505050508484612aa6565b9050949350505050565b6122c7828260405180602001604052805f815250612abc565b5050565b5f806122d6836124bd565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361234857826040517f7e27328900000000000000000000000000000000000000000000000000000000815260040161233f91906136a2565b60405180910390fd5b80915050919050565b5f60055f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f33905090565b61239e8383836001612ad7565b505050565b5f806123b0858585612c96565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036123f3576123ee84612ea1565b612432565b8473ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612431576124308185612ee5565b5b5b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036124735761246e8461302f565b6124b2565b8473ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146124b1576124b085856130ef565b5b5b809150509392505050565b5f60035f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f612500826122cb565b9050919050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361263857816040517f5b08ba1800000000000000000000000000000000000000000000000000000000815260040161262f919061388b565b60405180910390fd5b8060065f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516127249190613671565b60405180910390a3505050565b5f8373ffffffffffffffffffffffffffffffffffffffff163b11156128dd578273ffffffffffffffffffffffffffffffffffffffff1663150b7a0261277461238a565b8685856040518563ffffffff1660e01b8152600401612796949392919061482b565b6020604051808303815f875af19250505080156127d157506040513d601f19601f820116820180604052508101906127ce9190614889565b60015b612852573d805f81146127ff576040519150601f19603f3d011682016040523d82523d5f602084013e612804565b606091505b505f81510361284a57836040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401612841919061388b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146128db57836040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016128d2919061388b565b60405180910390fd5b505b50505050565b6060600f80546128f2906141c1565b80601f016020809104026020016040519081016040528092919081815260200182805461291e906141c1565b80156129695780601f1061294057610100808354040283529160200191612969565b820191905f5260205f20905b81548152906001019060200180831161294c57829003601f168201915b5050505050905090565b60605f600161298184613173565b0190505f8167ffffffffffffffff81111561299f5761299e6139bc565b5b6040519080825280601f01601f1916602001820160405280156129d15781602001600182028036833780820191505090505b5090505f82602001820190505b600115612a32578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612a2757612a2661431d565b5b0494505f85036129de575b819350505050919050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f82612ab285846132c4565b1490509392505050565b612ac68383613312565b612ad25f848484612731565b505050565b8080612b0f57505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15612c41575f612b1e846122cb565b90505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015612b8857508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b8015612b9b5750612b998184611fac565b155b15612bdd57826040517fa9fbf51f000000000000000000000000000000000000000000000000000000008152600401612bd4919061388b565b60405180910390fd5b8115612c3f57838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b8360055f8581526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b5f80612ca1846124bd565b90505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612ce257612ce1818486613405565b5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612d6d57612d215f855f80612ad7565b600160045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825403925050819055505b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614612dec57600160045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8460035f8681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4809150509392505050565b600980549050600a5f8381526020019081526020015f2081905550600981908060018154018082558091505060019003905f5260205f20015f909190919091505550565b5f612eef836118de565b90505f60085f8481526020019081526020015f20549050818114612fc6575f60075f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8481526020019081526020015f205490508060075f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8481526020019081526020015f20819055508160085f8381526020019081526020015f2081905550505b60085f8481526020019081526020015f205f905560075f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8381526020019081526020015f205f905550505050565b5f600160098054905061304291906143bb565b90505f600a5f8481526020019081526020015f205490505f6009838154811061306e5761306d6143ee565b5b905f5260205f2001549050806009838154811061308e5761308d6143ee565b5b905f5260205f20018190555081600a5f8381526020019081526020015f2081905550600a5f8581526020019081526020015f205f905560098054806130d6576130d56148b4565b5b600190038181905f5260205f20015f9055905550505050565b5f60016130fb846118de565b61310591906143bb565b90508160075f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8381526020019081526020015f20819055508060085f8481526020019081526020015f2081905550505050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106131cf577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816131c5576131c461431d565b5b0492506040810190505b6d04ee2d6d415b85acef8100000000831061320c576d04ee2d6d415b85acef810000000083816132025761320161431d565b5b0492506020810190505b662386f26fc10000831061323b57662386f26fc1000083816132315761323061431d565b5b0492506010810190505b6305f5e1008310613264576305f5e100838161325a5761325961431d565b5b0492506008810190505b612710831061328957612710838161327f5761327e61431d565b5b0492506004810190505b606483106132ac57606483816132a2576132a161431d565b5b0492506002810190505b600a83106132bb576001810190505b80915050919050565b5f808290505f5b8451811015613307576132f8828683815181106132eb576132ea6143ee565b5b60200260200101516134c8565b915080806001019150506132cb565b508091505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613382575f6040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401613379919061388b565b60405180910390fd5b5f61338e83835f6123a3565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614613400575f6040517f73c6ac6e0000000000000000000000000000000000000000000000000000000081526004016133f7919061388b565b60405180910390fd5b505050565b6134108383836134f2565b6134c3575f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361348457806040517f7e27328900000000000000000000000000000000000000000000000000000000815260040161347b91906136a2565b60405180910390fd5b81816040517f177e802f0000000000000000000000000000000000000000000000000000000081526004016134ba9291906142f6565b60405180910390fd5b505050565b5f8183106134df576134da82846135b2565b6134ea565b6134e983836135b2565b5b905092915050565b5f8073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156135a957508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061356a57506135698484611fac565b5b806135a857508273ffffffffffffffffffffffffffffffffffffffff1661359083612351565b73ffffffffffffffffffffffffffffffffffffffff16145b5b90509392505050565b5f825f528160205260405f20905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61360b816135d7565b8114613615575f80fd5b50565b5f8135905061362681613602565b92915050565b5f60208284031215613641576136406135cf565b5b5f61364e84828501613618565b91505092915050565b5f8115159050919050565b61366b81613657565b82525050565b5f6020820190506136845f830184613662565b92915050565b5f819050919050565b61369c8161368a565b82525050565b5f6020820190506136b55f830184613693565b92915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f8401126136dc576136db6136bb565b5b8235905067ffffffffffffffff8111156136f9576136f86136bf565b5b602083019150836020820283011115613715576137146136c3565b5b9250929050565b5f8060208385031215613732576137316135cf565b5b5f83013567ffffffffffffffff81111561374f5761374e6135d3565b5b61375b858286016136c7565b92509250509250929050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6137a982613767565b6137b38185613771565b93506137c3818560208601613781565b6137cc8161378f565b840191505092915050565b5f6020820190508181035f8301526137ef818461379f565b905092915050565b6138008161368a565b811461380a575f80fd5b50565b5f8135905061381b816137f7565b92915050565b5f60208284031215613836576138356135cf565b5b5f6138438482850161380d565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6138758261384c565b9050919050565b6138858161386b565b82525050565b5f60208201905061389e5f83018461387c565b92915050565b6138ad8161386b565b81146138b7575f80fd5b50565b5f813590506138c8816138a4565b92915050565b5f80604083850312156138e4576138e36135cf565b5b5f6138f1858286016138ba565b92505060206139028582860161380d565b9150509250929050565b5f819050919050565b61391e8161390c565b82525050565b5f6020820190506139375f830184613915565b92915050565b5f60208284031215613952576139516135cf565b5b5f61395f848285016138ba565b91505092915050565b5f805f6060848603121561397f5761397e6135cf565b5b5f61398c868287016138ba565b935050602061399d868287016138ba565b92505060406139ae8682870161380d565b9150509250925092565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6139f28261378f565b810181811067ffffffffffffffff82111715613a1157613a106139bc565b5b80604052505050565b5f613a236135c6565b9050613a2f82826139e9565b919050565b5f67ffffffffffffffff821115613a4e57613a4d6139bc565b5b613a578261378f565b9050602081019050919050565b828183375f83830152505050565b5f613a84613a7f84613a34565b613a1a565b905082815260208101848484011115613aa057613a9f6139b8565b5b613aab848285613a64565b509392505050565b5f82601f830112613ac757613ac66136bb565b5b8135613ad7848260208601613a72565b91505092915050565b5f60208284031215613af557613af46135cf565b5b5f82013567ffffffffffffffff811115613b1257613b116135d3565b5b613b1e84828501613ab3565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b613b598161368a565b82525050565b5f613b6a8383613b50565b60208301905092915050565b5f602082019050919050565b5f613b8c82613b27565b613b968185613b31565b9350613ba183613b41565b805f5b83811015613bd1578151613bb88882613b5f565b9750613bc383613b76565b925050600181019050613ba4565b5085935050505092915050565b5f6020820190508181035f830152613bf68184613b82565b905092915050565b613c0781613657565b8114613c11575f80fd5b50565b5f81359050613c2281613bfe565b92915050565b5f8060408385031215613c3e57613c3d6135cf565b5b5f613c4b858286016138ba565b9250506020613c5c85828601613c14565b9150509250929050565b5f67ffffffffffffffff821115613c8057613c7f6139bc565b5b613c898261378f565b9050602081019050919050565b5f613ca8613ca384613c66565b613a1a565b905082815260208101848484011115613cc457613cc36139b8565b5b613ccf848285613a64565b509392505050565b5f82601f830112613ceb57613cea6136bb565b5b8135613cfb848260208601613c96565b91505092915050565b5f805f8060808587031215613d1c57613d1b6135cf565b5b5f613d29878288016138ba565b9450506020613d3a878288016138ba565b9350506040613d4b8782880161380d565b925050606085013567ffffffffffffffff811115613d6c57613d6b6135d3565b5b613d7887828801613cd7565b91505092959194509250565b5f8060408385031215613d9a57613d996135cf565b5b5f613da7858286016138ba565b9250506020613db8858286016138ba565b9150509250929050565b7f5265656e7472792061747461636b2064657465637465640000000000000000005f82015250565b5f613df6601783613771565b9150613e0182613dc2565b602082019050919050565b5f6020820190508181035f830152613e2381613dea565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f613e618261368a565b9150613e6c8361368a565b9250828201905080821115613e8457613e83613e2a565b5b92915050565b5f819050919050565b613ea4613e9f8261368a565b613e8a565b82525050565b5f8160601b9050919050565b5f613ec082613eaa565b9050919050565b5f613ed182613eb6565b9050919050565b613ee9613ee48261386b565b613ec7565b82525050565b5f613efa8286613e93565b602082019150613f0a8285613e93565b602082019150613f1a8284613ed8565b601482019150819050949350505050565b5f613f368284613ed8565b60148201915081905092915050565b5f613f4f8261368a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613f8157613f80613e2a565b5b600182019050919050565b7f4d696e742066696e6973686564000000000000000000000000000000000000005f82015250565b5f613fc0600d83613771565b9150613fcb82613f8c565b602082019050919050565b5f6020820190508181035f830152613fed81613fb4565b9050919050565b7f496e73756666696369656e74207061796d656e740000000000000000000000005f82015250565b5f614028601483613771565b915061403382613ff4565b602082019050919050565b5f6020820190508181035f8301526140558161401c565b9050919050565b7f496e76616c69642070726f6f66000000000000000000000000000000000000005f82015250565b5f614090600d83613771565b915061409b8261405c565b602082019050919050565b5f6020820190508181035f8301526140bd81614084565b9050919050565b7f4d617820537570706c79000000000000000000000000000000000000000000005f82015250565b5f6140f8600a83613771565b9150614103826140c4565b602082019050919050565b5f6020820190508181035f830152614125816140ec565b9050919050565b7f574c204c696d69740000000000000000000000000000000000000000000000005f82015250565b5f614160600883613771565b915061416b8261412c565b602082019050919050565b5f6020820190508181035f83015261418d81614154565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806141d857607f821691505b6020821081036141eb576141ea614194565b5b50919050565b7f5075626c6963206e6f74205374617274656400000000000000000000000000005f82015250565b5f614225601283613771565b9150614230826141f1565b602082019050919050565b5f6020820190508181035f83015261425281614219565b9050919050565b7f5075626c6963204c696d697400000000000000000000000000000000000000005f82015250565b5f61428d600c83613771565b915061429882614259565b602082019050919050565b5f6020820190508181035f8301526142ba81614281565b9050919050565b5f6060820190506142d45f83018661387c565b6142e16020830185613693565b6142ee604083018461387c565b949350505050565b5f6040820190506143095f83018561387c565b6143166020830184613693565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6143548261368a565b915061435f8361368a565b92508261436f5761436e61431d565b5b828204905092915050565b5f6143848261368a565b915061438f8361368a565b925082820261439d8161368a565b915082820484148315176143b4576143b3613e2a565b5b5092915050565b5f6143c58261368a565b91506143d08361368a565b92508282039050818111156143e8576143e7613e2a565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026144777fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261443c565b614481868361443c565b95508019841693508086168417925050509392505050565b5f819050919050565b5f6144bc6144b76144b28461368a565b614499565b61368a565b9050919050565b5f819050919050565b6144d5836144a2565b6144e96144e1826144c3565b848454614448565b825550505050565b5f90565b6144fd6144f1565b6145088184846144cc565b505050565b5b8181101561452b576145205f826144f5565b60018101905061450e565b5050565b601f821115614570576145418161441b565b61454a8461442d565b81016020851015614559578190505b61456d6145658561442d565b83018261450d565b50505b505050565b5f82821c905092915050565b5f6145905f1984600802614575565b1980831691505092915050565b5f6145a88383614581565b9150826002028217905092915050565b6145c182613767565b67ffffffffffffffff8111156145da576145d96139bc565b5b6145e482546141c1565b6145ef82828561452f565b5f60209050601f831160018114614620575f841561460e578287015190505b614618858261459d565b86555061467f565b601f19841661462e8661441b565b5f5b8281101561465557848901518255600182019150602085019450602081019050614630565b86831015614672578489015161466e601f891682614581565b8355505b6001600288020188555050505b505050505050565b5f81905092915050565b5f61469b82613767565b6146a58185614687565b93506146b5818560208601613781565b80840191505092915050565b5f81546146cd816141c1565b6146d78186614687565b9450600182165f81146146f1576001811461470657614738565b60ff1983168652811515820286019350614738565b61470f8561441b565b5f5b8381101561473057815481890152600182019150602081019050614711565b838801955050505b50505092915050565b5f61474c8286614691565b91506147588285614691565b915061476482846146c1565b9150819050949350505050565b7f416c7265616479204d696e7465640000000000000000000000000000000000005f82015250565b5f6147a5600e83613771565b91506147b082614771565b602082019050919050565b5f6020820190508181035f8301526147d281614799565b9050919050565b5f81519050919050565b5f82825260208201905092915050565b5f6147fd826147d9565b61480781856147e3565b9350614817818560208601613781565b6148208161378f565b840191505092915050565b5f60808201905061483e5f83018761387c565b61484b602083018661387c565b6148586040830185613693565b818103606083015261486a81846147f3565b905095945050505050565b5f8151905061488381613602565b92915050565b5f6020828403121561489e5761489d6135cf565b5b5f6148ab84828501614875565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea26469706673582212202b6e18340dd5984d34bffc0256901f711a0286123b4c8cee3343886923cb74f264736f6c634300081a003368747470733a2f2f697066732e7363726f6c6c7069782e6172742f697066732f62616679626569626e6f616f7361656d70677077786561636232657a786e373265646c72717437656b7276746e6235773673626b7177726c3567342f000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000003e70000000000000000000000000000000000000000000000000000000000000008506978794269747300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045049585900000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106102ac575f3560e01c80636857568511610174578063b88d4fde116100db578063e30081a011610094578063e985e9c51161006e578063e985e9c514610a30578063eddae94c14610a6c578063f2fde38b14610aa8578063f9f2a7ce14610ad0576102ac565b8063e30081a0146109ca578063e35d8f03146109f2578063e4cc18be14610a1a576102ac565b8063b88d4fde146108d4578063c11442f8146108fc578063c668286214610912578063c87b56dd1461093c578063d5abeb0114610978578063da3ef23f146109a2576102ac565b806390ecd4ae1161012d57806390ecd4ae146107b857806395d89b41146107f4578063a01b15bb1461081e578063a035b1fe1461085a578063a22cb46514610884578063a5e23271146108ac576102ac565b806368575685146106be5780636c0360eb146106e857806370a0823114610712578063715018a61461074e5780637f9fa411146107645780638da5cb5b1461078e576102ac565b806326092b83116102185780634f6ccce7116101d15780634f6ccce71461058e57806354c06aee146105ca57806355f804b3146105f45780635d50735d1461061c5780635de6dc55146106465780636352211e14610682576102ac565b806326092b83146104985780632be09561146104c25780632f745c59146104d8578063389fcf06146105145780633ccfd60b1461055057806342842e0e14610566576102ac565b8063095ea7b31161026a578063095ea7b3146103ae5780630c0a09d6146103d65780630d31ef70146104005780631249c58b1461043c57806318160ddd1461044657806323b872dd14610470576102ac565b8062088e30146102b057806301ffc9a7146102c6578063047fc9aa146103025780630578f97d1461032c57806306fdde0314610348578063081812fc14610372575b5f80fd5b3480156102bb575f80fd5b506102c4610b0c565b005b3480156102d1575f80fd5b506102ec60048036038101906102e7919061362c565b610b30565b6040516102f99190613671565b60405180910390f35b34801561030d575f80fd5b50610316610ba9565b60405161032391906136a2565b60405180910390f35b6103466004803603810190610341919061371c565b610baf565b005b348015610353575f80fd5b5061035c610f68565b60405161036991906137d7565b60405180910390f35b34801561037d575f80fd5b5061039860048036038101906103939190613821565b610ff8565b6040516103a5919061388b565b60405180910390f35b3480156103b9575f80fd5b506103d460048036038101906103cf91906138ce565b611013565b005b3480156103e1575f80fd5b506103ea611029565b6040516103f79190613924565b60405180910390f35b34801561040b575f80fd5b506104266004803603810190610421919061393d565b61102f565b60405161043391906136a2565b60405180910390f35b610444611075565b005b348015610451575f80fd5b5061045a61133c565b60405161046791906136a2565b60405180910390f35b34801561047b575f80fd5b5061049660048036038101906104919190613968565b611348565b005b3480156104a3575f80fd5b506104ac611447565b6040516104b991906136a2565b60405180910390f35b3480156104cd575f80fd5b506104d661144d565b005b3480156104e3575f80fd5b506104fe60048036038101906104f991906138ce565b611471565b60405161050b91906136a2565b60405180910390f35b34801561051f575f80fd5b5061053a6004803603810190610535919061393d565b611515565b6040516105479190613671565b60405180910390f35b34801561055b575f80fd5b50610564611568565b005b348015610571575f80fd5b5061058c60048036038101906105879190613968565b61166f565b005b348015610599575f80fd5b506105b460048036038101906105af9190613821565b61168e565b6040516105c191906136a2565b60405180910390f35b3480156105d5575f80fd5b506105de611700565b6040516105eb9190613924565b60405180910390f35b3480156105ff575f80fd5b5061061a60048036038101906106159190613ae0565b611706565b005b348015610627575f80fd5b50610630611721565b60405161063d91906136a2565b60405180910390f35b348015610651575f80fd5b5061066c6004803603810190610667919061393d565b61172a565b6040516106799190613bde565b60405180910390f35b34801561068d575f80fd5b506106a860048036038101906106a39190613821565b6117cf565b6040516106b5919061388b565b60405180910390f35b3480156106c9575f80fd5b506106d261184c565b6040516106df91906136a2565b60405180910390f35b3480156106f3575f80fd5b506106fc611852565b60405161070991906137d7565b60405180910390f35b34801561071d575f80fd5b506107386004803603810190610733919061393d565b6118de565b60405161074591906136a2565b60405180910390f35b348015610759575f80fd5b50610762611994565b005b34801561076f575f80fd5b506107786119a7565b60405161078591906136a2565b60405180910390f35b348015610799575f80fd5b506107a26119ad565b6040516107af919061388b565b60405180910390f35b3480156107c3575f80fd5b506107de60048036038101906107d9919061393d565b6119d4565b6040516107eb91906136a2565b60405180910390f35b3480156107ff575f80fd5b506108086119e9565b60405161081591906137d7565b60405180910390f35b348015610829575f80fd5b50610844600480360381019061083f919061393d565b611a79565b60405161085191906136a2565b60405180910390f35b348015610865575f80fd5b5061086e611acc565b60405161087b91906136a2565b60405180910390f35b34801561088f575f80fd5b506108aa60048036038101906108a59190613c28565b611ad2565b005b3480156108b7575f80fd5b506108d260048036038101906108cd9190613821565b611ae8565b005b3480156108df575f80fd5b506108fa60048036038101906108f59190613d04565b611b37565b005b348015610907575f80fd5b50610910611b54565b005b34801561091d575f80fd5b50610926611b79565b60405161093391906137d7565b60405180910390f35b348015610947575f80fd5b50610962600480360381019061095d9190613821565b611c05565b60405161096f91906137d7565b60405180910390f35b348015610983575f80fd5b5061098c611c64565b60405161099991906136a2565b60405180910390f35b3480156109ad575f80fd5b506109c860048036038101906109c39190613ae0565b611c6a565b005b3480156109d5575f80fd5b506109f060048036038101906109eb919061393d565b611c85565b005b3480156109fd575f80fd5b50610a186004803603810190610a13919061371c565b611cd1565b005b348015610a25575f80fd5b50610a2e611f89565b005b348015610a3b575f80fd5b50610a566004803603810190610a519190613d84565b611fac565b604051610a639190613671565b60405180910390f35b348015610a77575f80fd5b50610a926004803603810190610a8d919061393d565b61203a565b604051610a9f91906136a2565b60405180910390f35b348015610ab3575f80fd5b50610ace6004803603810190610ac9919061393d565b61204f565b005b348015610adb575f80fd5b50610af66004803603810190610af1919061393d565b6120d3565b604051610b039190613671565b60405180910390f35b610b146120f0565b5f601e60016101000a81548160ff021916908315150217905550565b5f7f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ba25750610ba182612177565b5b9050919050565b60195481565b600d5f9054906101000a900460ff1615610bfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf590613e0c565b60405180910390fd5b6001600d5f6101000a81548160ff0219169083151502179055505f4260195444610c289190613e57565b33604051602001610c3b93929190613eef565b604051602081830303815290604052805190602001205f1c90505f8190505f33604051602001610c6b9190613f2b565b604051602081830303815290604052805190602001209050610c91858560175484612258565b15610ce15760195f815480929190610ca890613f45565b919050555060195460155403610cd05760195f815480929190610cca90613f45565b91905055505b610cdc826019546122ae565b610f48565b601e5f9054906101000a900460ff16610d2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2690613fd6565b60405180910390fd5b601454341015610d74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6b9061403e565b60405180910390fd5b610d82858560165484612258565b15610d9857610d93336015546122ae565b610f47565b610da68585600b5484612258565b610de5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddc906140a6565b60405180910390fd5b60195f815480929190610df790613f45565b919050555060195460155403610e1f5760195f815480929190610e1990613f45565b91905055505b6018546019541115610e66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5d9061410e565b60405180910390fd5b601c5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190610eb390613f45565b9190505550601354601c5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541115610f3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3190614176565b60405180910390fd5b610f46336019546122ae565b5b5b5050505f600d5f6101000a81548160ff0219169083151502179055505050565b606060018054610f77906141c1565b80601f0160208091040260200160405190810160405280929190818152602001828054610fa3906141c1565b8015610fee5780601f10610fc557610100808354040283529160200191610fee565b820191905f5260205f20905b815481529060010190602001808311610fd157829003601f168201915b5050505050905090565b5f611002826122cb565b5061100c82612351565b9050919050565b611025828261102061238a565b612391565b5050565b600c5481565b5f601c5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b600d5f9054906101000a900460ff16156110c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110bb90613e0c565b60405180910390fd5b6001600d5f6101000a81548160ff021916908315150217905550601e5f9054906101000a900460ff1661112c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112390613fd6565b60405180910390fd5b601e60019054906101000a900460ff1661117b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111729061423b565b60405180910390fd5b6012543410156111c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b79061403e565b60405180910390fd5b601b5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f81548092919061120d90613f45565b9190505550601154601b5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541115611294576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128b906142a3565b60405180910390fd5b60195f8154809291906112a690613f45565b9190505550601954601554036112ce5760195f8154809291906112c890613f45565b91905055505b6018546019541115611315576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130c9061410e565b60405180910390fd5b611321336019546122ae565b5f600d5f6101000a81548160ff021916908315150217905550565b5f600980549050905090565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036113b8575f6040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016113af919061388b565b60405180910390fd5b5f6113cb83836113c661238a565b6123a3565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611441578382826040517f64283d7b000000000000000000000000000000000000000000000000000000008152600401611438939291906142c1565b60405180910390fd5b50505050565b60115481565b6114556120f0565b6001601e5f6101000a81548160ff021916908315150217905550565b5f61147b836118de565b82106114c05782826040517fa57d13dc0000000000000000000000000000000000000000000000000000000081526004016114b79291906142f6565b60405180910390fd5b60075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8381526020019081526020015f2054905092915050565b5f601d5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16159050919050565b6115706120f0565b5f4790505f6028606483611584919061434a565b61158e919061437a565b90505f818361159d91906143bb565b9050600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8390811502906040515f60405180830381858888f19350505050158015611604573d5f803e3d5ffd5b50600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015611669573d5f803e3d5ffd5b50505050565b61168983838360405180602001604052805f815250611b37565b505050565b5f61169761133c565b82106116dc575f826040517fa57d13dc0000000000000000000000000000000000000000000000000000000081526004016116d39291906142f6565b60405180910390fd5b600982815481106116f0576116ef6143ee565b5b905f5260205f2001549050919050565b600b5481565b61170e6120f0565b80600f908161171d91906145b8565b5050565b5f601954905090565b60605f611736836118de565b90505f8167ffffffffffffffff811115611753576117526139bc565b5b6040519080825280602002602001820160405280156117815781602001602082028036833780820191505090505b5090505f5b828110156117c4576117988582611471565b8282815181106117ab576117aa6143ee565b5b6020026020010181815250508080600101915050611786565b508092505050919050565b5f806117da836124bd565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361183a57601a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050611847565b611843836124f6565b9150505b919050565b60145481565b600f805461185f906141c1565b80601f016020809104026020016040519081016040528092919081815260200182805461188b906141c1565b80156118d65780601f106118ad576101008083540402835291602001916118d6565b820191905f5260205f20905b8154815290600101906020018083116118b957829003601f168201915b505050505081565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361194f575f6040517f89c62b64000000000000000000000000000000000000000000000000000000008152600401611946919061388b565b60405180910390fd5b60045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b61199c6120f0565b6119a55f612507565b565b60135481565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b601c602052805f5260405f205f915090505481565b6060600280546119f8906141c1565b80601f0160208091040260200160405190810160405280929190818152602001828054611a24906141c1565b8015611a6f5780601f10611a4657610100808354040283529160200191611a6f565b820191905f5260205f20905b815481529060010190602001808311611a5257829003601f168201915b5050505050905090565b5f601b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054601154611ac591906143bb565b9050919050565b60125481565b611ae4611add61238a565b83836125c8565b5050565b611af06120f0565b5f600190505b818111611b335760195f815480929190611b0f90613f45565b9190505550611b20336019546122ae565b8080611b2b90613f45565b915050611af6565b5050565b611b42848484611348565b611b4e84848484612731565b50505050565b611b5c6120f0565b6001601e60016101000a81548160ff021916908315150217905550565b60108054611b86906141c1565b80601f0160208091040260200160405190810160405280929190818152602001828054611bb2906141c1565b8015611bfd5780601f10611bd457610100808354040283529160200191611bfd565b820191905f5260205f20905b815481529060010190602001808311611be057829003601f168201915b505050505081565b60605f611c106128e3565b90505f815111611c2e5760405180602001604052805f815250611c5c565b80611c3884612973565b6010604051602001611c4c93929190614741565b6040516020818303038152906040525b915050919050565b60185481565b611c726120f0565b8060109081611c8191906145b8565b5050565b611c8d6120f0565b80601a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600d5f9054906101000a900460ff1615611d20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1790613e0c565b60405180910390fd5b6001600d5f6101000a81548160ff021916908315150217905550601e5f9054906101000a900460ff16611d88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7f90613fd6565b60405180910390fd5b60195f815480929190611d9a90613f45565b919050555060195460155403611dc25760195f815480929190611dbc90613f45565b91905055505b6018546019541115611e09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e009061410e565b60405180910390fd5b5f33604051602001611e1b9190613f2b565b604051602081830303815290604052805190602001209050611e418383600c5484612258565b611e80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e77906140a6565b60405180910390fd5b601d5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615611f0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f01906147bb565b60405180910390fd5b6001601d5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550611f6b336019546122ae565b505f600d5f6101000a81548160ff0219169083151502179055505050565b611f916120f0565b5f601e5f6101000a81548160ff021916908315150217905550565b5f60065f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b601b602052805f5260405f205f915090505481565b6120576120f0565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036120c7575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016120be919061388b565b60405180910390fd5b6120d081612507565b50565b601d602052805f5260405f205f915054906101000a900460ff1681565b6120f861238a565b73ffffffffffffffffffffffffffffffffffffffff166121166119ad565b73ffffffffffffffffffffffffffffffffffffffff16146121755761213961238a565b6040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040161216c919061388b565b60405180910390fd5b565b5f7f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061224157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612251575061225082612a3d565b5b9050919050565b5f6122a48585808060200260200160405190810160405280939291908181526020018383602002808284375f81840152601f19601f820116905080830192505050505050508484612aa6565b9050949350505050565b6122c7828260405180602001604052805f815250612abc565b5050565b5f806122d6836124bd565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361234857826040517f7e27328900000000000000000000000000000000000000000000000000000000815260040161233f91906136a2565b60405180910390fd5b80915050919050565b5f60055f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f33905090565b61239e8383836001612ad7565b505050565b5f806123b0858585612c96565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036123f3576123ee84612ea1565b612432565b8473ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612431576124308185612ee5565b5b5b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036124735761246e8461302f565b6124b2565b8473ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146124b1576124b085856130ef565b5b5b809150509392505050565b5f60035f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f612500826122cb565b9050919050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361263857816040517f5b08ba1800000000000000000000000000000000000000000000000000000000815260040161262f919061388b565b60405180910390fd5b8060065f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516127249190613671565b60405180910390a3505050565b5f8373ffffffffffffffffffffffffffffffffffffffff163b11156128dd578273ffffffffffffffffffffffffffffffffffffffff1663150b7a0261277461238a565b8685856040518563ffffffff1660e01b8152600401612796949392919061482b565b6020604051808303815f875af19250505080156127d157506040513d601f19601f820116820180604052508101906127ce9190614889565b60015b612852573d805f81146127ff576040519150601f19603f3d011682016040523d82523d5f602084013e612804565b606091505b505f81510361284a57836040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401612841919061388b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146128db57836040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016128d2919061388b565b60405180910390fd5b505b50505050565b6060600f80546128f2906141c1565b80601f016020809104026020016040519081016040528092919081815260200182805461291e906141c1565b80156129695780601f1061294057610100808354040283529160200191612969565b820191905f5260205f20905b81548152906001019060200180831161294c57829003601f168201915b5050505050905090565b60605f600161298184613173565b0190505f8167ffffffffffffffff81111561299f5761299e6139bc565b5b6040519080825280601f01601f1916602001820160405280156129d15781602001600182028036833780820191505090505b5090505f82602001820190505b600115612a32578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612a2757612a2661431d565b5b0494505f85036129de575b819350505050919050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f82612ab285846132c4565b1490509392505050565b612ac68383613312565b612ad25f848484612731565b505050565b8080612b0f57505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15612c41575f612b1e846122cb565b90505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015612b8857508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b8015612b9b5750612b998184611fac565b155b15612bdd57826040517fa9fbf51f000000000000000000000000000000000000000000000000000000008152600401612bd4919061388b565b60405180910390fd5b8115612c3f57838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b8360055f8581526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b5f80612ca1846124bd565b90505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612ce257612ce1818486613405565b5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612d6d57612d215f855f80612ad7565b600160045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825403925050819055505b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614612dec57600160045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8460035f8681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4809150509392505050565b600980549050600a5f8381526020019081526020015f2081905550600981908060018154018082558091505060019003905f5260205f20015f909190919091505550565b5f612eef836118de565b90505f60085f8481526020019081526020015f20549050818114612fc6575f60075f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8481526020019081526020015f205490508060075f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8481526020019081526020015f20819055508160085f8381526020019081526020015f2081905550505b60085f8481526020019081526020015f205f905560075f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8381526020019081526020015f205f905550505050565b5f600160098054905061304291906143bb565b90505f600a5f8481526020019081526020015f205490505f6009838154811061306e5761306d6143ee565b5b905f5260205f2001549050806009838154811061308e5761308d6143ee565b5b905f5260205f20018190555081600a5f8381526020019081526020015f2081905550600a5f8581526020019081526020015f205f905560098054806130d6576130d56148b4565b5b600190038181905f5260205f20015f9055905550505050565b5f60016130fb846118de565b61310591906143bb565b90508160075f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8381526020019081526020015f20819055508060085f8481526020019081526020015f2081905550505050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106131cf577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816131c5576131c461431d565b5b0492506040810190505b6d04ee2d6d415b85acef8100000000831061320c576d04ee2d6d415b85acef810000000083816132025761320161431d565b5b0492506020810190505b662386f26fc10000831061323b57662386f26fc1000083816132315761323061431d565b5b0492506010810190505b6305f5e1008310613264576305f5e100838161325a5761325961431d565b5b0492506008810190505b612710831061328957612710838161327f5761327e61431d565b5b0492506004810190505b606483106132ac57606483816132a2576132a161431d565b5b0492506002810190505b600a83106132bb576001810190505b80915050919050565b5f808290505f5b8451811015613307576132f8828683815181106132eb576132ea6143ee565b5b60200260200101516134c8565b915080806001019150506132cb565b508091505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613382575f6040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401613379919061388b565b60405180910390fd5b5f61338e83835f6123a3565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614613400575f6040517f73c6ac6e0000000000000000000000000000000000000000000000000000000081526004016133f7919061388b565b60405180910390fd5b505050565b6134108383836134f2565b6134c3575f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361348457806040517f7e27328900000000000000000000000000000000000000000000000000000000815260040161347b91906136a2565b60405180910390fd5b81816040517f177e802f0000000000000000000000000000000000000000000000000000000081526004016134ba9291906142f6565b60405180910390fd5b505050565b5f8183106134df576134da82846135b2565b6134ea565b6134e983836135b2565b5b905092915050565b5f8073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156135a957508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061356a57506135698484611fac565b5b806135a857508273ffffffffffffffffffffffffffffffffffffffff1661359083612351565b73ffffffffffffffffffffffffffffffffffffffff16145b5b90509392505050565b5f825f528160205260405f20905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61360b816135d7565b8114613615575f80fd5b50565b5f8135905061362681613602565b92915050565b5f60208284031215613641576136406135cf565b5b5f61364e84828501613618565b91505092915050565b5f8115159050919050565b61366b81613657565b82525050565b5f6020820190506136845f830184613662565b92915050565b5f819050919050565b61369c8161368a565b82525050565b5f6020820190506136b55f830184613693565b92915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f8401126136dc576136db6136bb565b5b8235905067ffffffffffffffff8111156136f9576136f86136bf565b5b602083019150836020820283011115613715576137146136c3565b5b9250929050565b5f8060208385031215613732576137316135cf565b5b5f83013567ffffffffffffffff81111561374f5761374e6135d3565b5b61375b858286016136c7565b92509250509250929050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6137a982613767565b6137b38185613771565b93506137c3818560208601613781565b6137cc8161378f565b840191505092915050565b5f6020820190508181035f8301526137ef818461379f565b905092915050565b6138008161368a565b811461380a575f80fd5b50565b5f8135905061381b816137f7565b92915050565b5f60208284031215613836576138356135cf565b5b5f6138438482850161380d565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6138758261384c565b9050919050565b6138858161386b565b82525050565b5f60208201905061389e5f83018461387c565b92915050565b6138ad8161386b565b81146138b7575f80fd5b50565b5f813590506138c8816138a4565b92915050565b5f80604083850312156138e4576138e36135cf565b5b5f6138f1858286016138ba565b92505060206139028582860161380d565b9150509250929050565b5f819050919050565b61391e8161390c565b82525050565b5f6020820190506139375f830184613915565b92915050565b5f60208284031215613952576139516135cf565b5b5f61395f848285016138ba565b91505092915050565b5f805f6060848603121561397f5761397e6135cf565b5b5f61398c868287016138ba565b935050602061399d868287016138ba565b92505060406139ae8682870161380d565b9150509250925092565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6139f28261378f565b810181811067ffffffffffffffff82111715613a1157613a106139bc565b5b80604052505050565b5f613a236135c6565b9050613a2f82826139e9565b919050565b5f67ffffffffffffffff821115613a4e57613a4d6139bc565b5b613a578261378f565b9050602081019050919050565b828183375f83830152505050565b5f613a84613a7f84613a34565b613a1a565b905082815260208101848484011115613aa057613a9f6139b8565b5b613aab848285613a64565b509392505050565b5f82601f830112613ac757613ac66136bb565b5b8135613ad7848260208601613a72565b91505092915050565b5f60208284031215613af557613af46135cf565b5b5f82013567ffffffffffffffff811115613b1257613b116135d3565b5b613b1e84828501613ab3565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b613b598161368a565b82525050565b5f613b6a8383613b50565b60208301905092915050565b5f602082019050919050565b5f613b8c82613b27565b613b968185613b31565b9350613ba183613b41565b805f5b83811015613bd1578151613bb88882613b5f565b9750613bc383613b76565b925050600181019050613ba4565b5085935050505092915050565b5f6020820190508181035f830152613bf68184613b82565b905092915050565b613c0781613657565b8114613c11575f80fd5b50565b5f81359050613c2281613bfe565b92915050565b5f8060408385031215613c3e57613c3d6135cf565b5b5f613c4b858286016138ba565b9250506020613c5c85828601613c14565b9150509250929050565b5f67ffffffffffffffff821115613c8057613c7f6139bc565b5b613c898261378f565b9050602081019050919050565b5f613ca8613ca384613c66565b613a1a565b905082815260208101848484011115613cc457613cc36139b8565b5b613ccf848285613a64565b509392505050565b5f82601f830112613ceb57613cea6136bb565b5b8135613cfb848260208601613c96565b91505092915050565b5f805f8060808587031215613d1c57613d1b6135cf565b5b5f613d29878288016138ba565b9450506020613d3a878288016138ba565b9350506040613d4b8782880161380d565b925050606085013567ffffffffffffffff811115613d6c57613d6b6135d3565b5b613d7887828801613cd7565b91505092959194509250565b5f8060408385031215613d9a57613d996135cf565b5b5f613da7858286016138ba565b9250506020613db8858286016138ba565b9150509250929050565b7f5265656e7472792061747461636b2064657465637465640000000000000000005f82015250565b5f613df6601783613771565b9150613e0182613dc2565b602082019050919050565b5f6020820190508181035f830152613e2381613dea565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f613e618261368a565b9150613e6c8361368a565b9250828201905080821115613e8457613e83613e2a565b5b92915050565b5f819050919050565b613ea4613e9f8261368a565b613e8a565b82525050565b5f8160601b9050919050565b5f613ec082613eaa565b9050919050565b5f613ed182613eb6565b9050919050565b613ee9613ee48261386b565b613ec7565b82525050565b5f613efa8286613e93565b602082019150613f0a8285613e93565b602082019150613f1a8284613ed8565b601482019150819050949350505050565b5f613f368284613ed8565b60148201915081905092915050565b5f613f4f8261368a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613f8157613f80613e2a565b5b600182019050919050565b7f4d696e742066696e6973686564000000000000000000000000000000000000005f82015250565b5f613fc0600d83613771565b9150613fcb82613f8c565b602082019050919050565b5f6020820190508181035f830152613fed81613fb4565b9050919050565b7f496e73756666696369656e74207061796d656e740000000000000000000000005f82015250565b5f614028601483613771565b915061403382613ff4565b602082019050919050565b5f6020820190508181035f8301526140558161401c565b9050919050565b7f496e76616c69642070726f6f66000000000000000000000000000000000000005f82015250565b5f614090600d83613771565b915061409b8261405c565b602082019050919050565b5f6020820190508181035f8301526140bd81614084565b9050919050565b7f4d617820537570706c79000000000000000000000000000000000000000000005f82015250565b5f6140f8600a83613771565b9150614103826140c4565b602082019050919050565b5f6020820190508181035f830152614125816140ec565b9050919050565b7f574c204c696d69740000000000000000000000000000000000000000000000005f82015250565b5f614160600883613771565b915061416b8261412c565b602082019050919050565b5f6020820190508181035f83015261418d81614154565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806141d857607f821691505b6020821081036141eb576141ea614194565b5b50919050565b7f5075626c6963206e6f74205374617274656400000000000000000000000000005f82015250565b5f614225601283613771565b9150614230826141f1565b602082019050919050565b5f6020820190508181035f83015261425281614219565b9050919050565b7f5075626c6963204c696d697400000000000000000000000000000000000000005f82015250565b5f61428d600c83613771565b915061429882614259565b602082019050919050565b5f6020820190508181035f8301526142ba81614281565b9050919050565b5f6060820190506142d45f83018661387c565b6142e16020830185613693565b6142ee604083018461387c565b949350505050565b5f6040820190506143095f83018561387c565b6143166020830184613693565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6143548261368a565b915061435f8361368a565b92508261436f5761436e61431d565b5b828204905092915050565b5f6143848261368a565b915061438f8361368a565b925082820261439d8161368a565b915082820484148315176143b4576143b3613e2a565b5b5092915050565b5f6143c58261368a565b91506143d08361368a565b92508282039050818111156143e8576143e7613e2a565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026144777fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261443c565b614481868361443c565b95508019841693508086168417925050509392505050565b5f819050919050565b5f6144bc6144b76144b28461368a565b614499565b61368a565b9050919050565b5f819050919050565b6144d5836144a2565b6144e96144e1826144c3565b848454614448565b825550505050565b5f90565b6144fd6144f1565b6145088184846144cc565b505050565b5b8181101561452b576145205f826144f5565b60018101905061450e565b5050565b601f821115614570576145418161441b565b61454a8461442d565b81016020851015614559578190505b61456d6145658561442d565b83018261450d565b50505b505050565b5f82821c905092915050565b5f6145905f1984600802614575565b1980831691505092915050565b5f6145a88383614581565b9150826002028217905092915050565b6145c182613767565b67ffffffffffffffff8111156145da576145d96139bc565b5b6145e482546141c1565b6145ef82828561452f565b5f60209050601f831160018114614620575f841561460e578287015190505b614618858261459d565b86555061467f565b601f19841661462e8661441b565b5f5b8281101561465557848901518255600182019150602085019450602081019050614630565b86831015614672578489015161466e601f891682614581565b8355505b6001600288020188555050505b505050505050565b5f81905092915050565b5f61469b82613767565b6146a58185614687565b93506146b5818560208601613781565b80840191505092915050565b5f81546146cd816141c1565b6146d78186614687565b9450600182165f81146146f1576001811461470657614738565b60ff1983168652811515820286019350614738565b61470f8561441b565b5f5b8381101561473057815481890152600182019150602081019050614711565b838801955050505b50505092915050565b5f61474c8286614691565b91506147588285614691565b915061476482846146c1565b9150819050949350505050565b7f416c7265616479204d696e7465640000000000000000000000000000000000005f82015250565b5f6147a5600e83613771565b91506147b082614771565b602082019050919050565b5f6020820190508181035f8301526147d281614799565b9050919050565b5f81519050919050565b5f82825260208201905092915050565b5f6147fd826147d9565b61480781856147e3565b9350614817818560208601613781565b6148208161378f565b840191505092915050565b5f60808201905061483e5f83018761387c565b61484b602083018661387c565b6148586040830185613693565b818103606083015261486a81846147f3565b905095945050505050565b5f8151905061488381613602565b92915050565b5f6020828403121561489e5761489d6135cf565b5b5f6148ab84828501614875565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea26469706673582212202b6e18340dd5984d34bffc0256901f711a0286123b4c8cee3343886923cb74f264736f6c634300081a0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000003e70000000000000000000000000000000000000000000000000000000000000008506978794269747300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045049585900000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _name (string): PixyBits
Arg [1] : _symbol (string): PIXY
Arg [2] : pr (uint256): 999
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000003e7
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [4] : 5069787942697473000000000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [6] : 5049585900000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
76131:7287:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80453:78;;;;;;;;;;;;;:::i;:::-;;60017:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77370:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78635:1123;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41824:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42996:158;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42815:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76304:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81874:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80539:527;;;:::i;:::-;;60661:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43665:588;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76952:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78321:74;;;;;;;;;;;;;:::i;:::-;;60325:260;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78403:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82898:336;;;;;;;;;;;;;:::i;:::-;;44324:134;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60842:231;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76199:96;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81601:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;82806:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82450:347;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82149:293;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77066:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76781:118;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41362:213;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3361:103;;;;;;;;;;;;;:::i;:::-;;77032:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2686:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77525:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41984:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82000:140;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76990:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43226:146;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77917:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44529:211;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80367:78;;;;;;;;;;;;;:::i;:::-;;76906:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81077:516;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77332:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81715:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78099:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;79770:587;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78237:76;;;;;;;;;;;;;:::i;:::-;;43443:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77464:54;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3619:220;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77582:40;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80453:78;2572:13;:11;:13::i;:::-;80516:5:::1;80502:11;;:19;;;;;;;;;;;;;;;;;;80453:78::o:0;60017:224::-;60119:4;60158:35;60143:50;;;:11;:50;;;;:90;;;;60197:36;60221:11;60197:23;:36::i;:::-;60143:90;60136:97;;60017:224;;;:::o;77370:21::-;;;;:::o;78635:1123::-;76638:6;;;;;;;;;;;76637:7;76629:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;76692:4;76683:6;;:13;;;;;;;;;;;;;;;;;;78718:12:::1;78768:15;78804:6;;78785:16;:25;;;;:::i;:::-;78812:10;78751:72;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;78741:83;;;;;;78733:92;;78718:107;;78833:12;78864:4;78833:37;;78878:12;78920:10;78903:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;78893:39;;;;;;78878:54;;78946:44;78964:11;;78977:6;;78985:4;78946:17;:44::i;:::-;78943:809;;;79001:6;;:8;;;;;;;;;:::i;:::-;;;;;;79034:6;;79027:3;;:13:::0;79023:55:::1;;79057:6;;:8;;;;;;;;;:::i;:::-;;;;;;79023:55;79088:23;79098:4;79104:6;;79088:9;:23::i;:::-;78943:809;;;79145:10;;;;;;;;;;;79137:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;79204:14;;79191:9;:27;;79183:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;79260:47;79278:11;;79291:9;;79302:4;79260:17;:47::i;:::-;79257:487;;;79320:26;79330:10;79342:3;;79320:9;:26::i;:::-;79257:487;;;79382:50;79400:11;;79413:12;;79427:4;79382:17;:50::i;:::-;79374:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;79463:6;;:8;;;;;;;;;:::i;:::-;;;;;;79495:6;;79488:3;;:13:::0;79484:56:::1;;79518:6;;:8;;;;;;;;;:::i;:::-;;;;;;79484:56;79566:9;;79556:6;;:19;;79548:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;79600:15;:27;79616:10;79600:27;;;;;;;;;;;;;;;;:29;;;;;;;;;:::i;:::-;;;;;;79677:6;;79646:15;:27;79662:10;79646:27;;;;;;;;;;;;;;;;:37;;79638:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;79706:29;79716:10;79728:6;;79706:9;:29::i;:::-;79257:487;78943:809;78710:1048;;;76728:5:::0;76719:6;;:14;;;;;;;;;;;;;;;;;;78635:1123;;:::o;41824:91::-;41869:13;41902:5;41895:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41824:91;:::o;42996:158::-;43063:7;43083:22;43097:7;43083:13;:22::i;:::-;;43125:21;43138:7;43125:12;:21::i;:::-;43118:28;;42996:158;;;:::o;42815:115::-;42887:35;42896:2;42900:7;42909:12;:10;:12::i;:::-;42887:8;:35::i;:::-;42815:115;;:::o;76304:99::-;;;;:::o;81874:114::-;81933:7;81959:15;:21;81975:4;81959:21;;;;;;;;;;;;;;;;81952:28;;81874:114;;;:::o;80539:527::-;76638:6;;;;;;;;;;;76637:7;76629:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;76692:4;76683:6;;:13;;;;;;;;;;;;;;;;;;80601:10:::1;;;;;;;;;;;80593:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;80648:11;;;;;;;;;;;80640:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;80714:5;;80701:9;:18;;80693:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;80756:19;:31;80776:10;80756:31;;;;;;;;;;;;;;;;:33;;;;;;;;;:::i;:::-;;;;;;80843:10;;80808:19;:31;80828:10;80808:31;;;;;;;;;;;;;;;;:45;;80800:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;80882:6;;:8;;;;;;;;;:::i;:::-;;;;;;80916:6;;80909:3;;:13:::0;80905:56:::1;;80939:6;;:8;;;;;;;;;:::i;:::-;;;;;;80905:56;80991:9;;80981:6;;:19;;80973:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;81027:29;81037:10;81049:6;;81027:9;:29::i;:::-;76728:5:::0;76719:6;;:14;;;;;;;;;;;;;;;;;;80539:527::o;60661:104::-;60713:7;60740:10;:17;;;;60733:24;;60661:104;:::o;43665:588::-;43774:1;43760:16;;:2;:16;;;43756:89;;43830:1;43800:33;;;;;;;;;;;:::i;:::-;;;;;;;;43756:89;44066:21;44090:34;44098:2;44102:7;44111:12;:10;:12::i;:::-;44090:7;:34::i;:::-;44066:58;;44156:4;44139:21;;:13;:21;;;44135:111;;44205:4;44211:7;44220:13;44184:50;;;;;;;;;;;;;:::i;:::-;;;;;;;;44135:111;43745:508;43665:588;;;:::o;76952:29::-;;;;:::o;78321:74::-;2572:13;:11;:13::i;:::-;78381:4:::1;78368:10;;:17;;;;;;;;;;;;;;;;;;78321:74::o:0;60325:260::-;60413:7;60446:16;60456:5;60446:9;:16::i;:::-;60437:5;:25;60433:101;;60509:5;60516;60486:36;;;;;;;;;;;;:::i;:::-;;;;;;;;60433:101;60551:12;:19;60564:5;60551:19;;;;;;;;;;;;;;;:26;60571:5;60551:26;;;;;;;;;;;;60544:33;;60325:260;;;;:::o;78403:102::-;78459:4;78483:8;:14;78492:4;78483:14;;;;;;;;;;;;;;;;;;;;;;;;;78482:15;78475:22;;78403:102;;;:::o;82898:336::-;2572:13;:11;:13::i;:::-;82946:19:::1;82968:21;82946:43;;83004:18;83049:2;83041:3;83027:11;:17;;;;:::i;:::-;83025:26;;;;:::i;:::-;83004:47;;83063:23;83103:10;83089:11;:24;;;;:::i;:::-;83063:50;;83133:10;;;;;;;;;;;83125:28;;:40;83154:10;83125:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;83184:15;;;;;;;;;;;83176:33;;:50;83210:15;83176:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;82935:299;;;82898:336::o:0;44324:134::-;44411:39;44428:4;44434:2;44438:7;44411:39;;;;;;;;;;;;:16;:39::i;:::-;44324:134;;;:::o;60842:231::-;60908:7;60941:13;:11;:13::i;:::-;60932:5;:22;60928:103;;61009:1;61013:5;60978:41;;;;;;;;;;;;:::i;:::-;;;;;;;;60928:103;61048:10;61059:5;61048:17;;;;;;;;:::i;:::-;;;;;;;;;;61041:24;;60842:231;;;:::o;76199:96::-;;;;:::o;81601:104::-;2572:13;:11;:13::i;:::-;81686:11:::1;81676:7;:21;;;;;;:::i;:::-;;81601:104:::0;:::o;82806:85::-;82851:7;82877:6;;82870:13;;82806:85;:::o;82450:347::-;82512:16;82541:18;82562:16;82572:5;82562:9;:16::i;:::-;82541:37;;82589:25;82631:10;82617:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82589:53;;82658:9;82653:111;82677:10;82673:1;:14;82653:111;;;82723:29;82743:5;82750:1;82723:19;:29::i;:::-;82709:8;82718:1;82709:11;;;;;;;;:::i;:::-;;;;;;;:43;;;;;82689:3;;;;;;;82653:111;;;;82781:8;82774:15;;;;82450:347;;;:::o;82149:293::-;82230:7;82250:13;82266:17;82275:7;82266:8;:17::i;:::-;82250:33;;82317:1;82300:19;;:5;:19;;;82296:139;;82343:18;;;;;;;;;;;82336:25;;;;;82296:139;82401:22;82415:7;82401:13;:22::i;:::-;82394:29;;;82149:293;;;;:::o;77066:44::-;;;;:::o;76781:118::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;41362:213::-;41425:7;41466:1;41449:19;;:5;:19;;;41445:89;;41519:1;41492:30;;;;;;;;;;;:::i;:::-;;;;;;;;41445:89;41551:9;:16;41561:5;41551:16;;;;;;;;;;;;;;;;41544:23;;41362:213;;;:::o;3361:103::-;2572:13;:11;:13::i;:::-;3426:30:::1;3453:1;3426:18;:30::i;:::-;3361:103::o:0;77032:25::-;;;;:::o;2686:87::-;2732:7;2759:6;;;;;;;;;;;2752:13;;2686:87;:::o;77525:50::-;;;;;;;;;;;;;;;;;:::o;41984:95::-;42031:13;42064:7;42057:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41984:95;:::o;82000:140::-;82068:7;82107:19;:25;82127:4;82107:25;;;;;;;;;;;;;;;;82094:10;;:38;;;;:::i;:::-;82087:45;;82000:140;;;:::o;76990:33::-;;;;:::o;43226:146::-;43312:52;43331:12;:10;:12::i;:::-;43345:8;43355;43312:18;:52::i;:::-;43226:146;;:::o;77917:172::-;2572:13;:11;:13::i;:::-;77979:9:::1;77991:1;77979:13;;77974:108;77999:5;77994:1;:10;77974:108;;78022:6;;:8;;;;;;;;;:::i;:::-;;;;;;78043:29;78053:10;78065:6;;78043:9;:29::i;:::-;78006:3;;;;;:::i;:::-;;;;77974:108;;;;77917:172:::0;:::o;44529:211::-;44643:31;44656:4;44662:2;44666:7;44643:12;:31::i;:::-;44685:47;44708:4;44714:2;44718:7;44727:4;44685:22;:47::i;:::-;44529:211;;;;:::o;80367:78::-;2572:13;:11;:13::i;:::-;80431:4:::1;80417:11;;:18;;;;;;;;;;;;;;;;;;80367:78::o:0;76906:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;81077:516::-;81195:13;81226:28;81257:10;:8;:10::i;:::-;81226:41;;81329:1;81304:14;81298:28;:32;:287;;;;;;;;;;;;;;;;;81422:14;81463:18;:7;:16;:18::i;:::-;81508:13;81379:165;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;81298:287;81278:307;;;81077:516;;;:::o;77332:31::-;;;;:::o;81715:151::-;2572:13;:11;:13::i;:::-;81841:17:::1;81825:13;:33;;;;;;:::i;:::-;;81715:151:::0;:::o;78099:126::-;2572:13;:11;:13::i;:::-;78198:19:::1;78177:18;;:40;;;;;;;;;;;;;;;;;;78099:126:::0;:::o;79770:587::-;76638:6;;;;;;;;;;;76637:7;76629:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;76692:4;76683:6;;:13;;;;;;;;;;;;;;;;;;79854:10:::1;;;;;;;;;;;79846:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;79901:6;;:8;;;;;;;;;:::i;:::-;;;;;;79932:6;;79925:3;;:13:::0;79921:55:::1;;79955:6;;:8;;;;;;;;;:::i;:::-;;;;;;79921:55;80005:9;;79995:6;;:19;;79987:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;80049:12;80091:10;80074:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;80064:39;;;;;;80049:54;;80121:53;80139:11;;80152:15;;80169:4;80121:17;:53::i;:::-;80113:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;80220:8;:20;80229:10;80220:20;;;;;;;;;;;;;;;;;;;;;;;;;80219:21;80211:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;80293:4;80270:8;:20;80279:10;80270:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;80309:29;80319:10;80331:6;;80309:9;:29::i;:::-;79835:522;76728:5:::0;76719:6;;:14;;;;;;;;;;;;;;;;;;79770:587;;:::o;78237:76::-;2572:13;:11;:13::i;:::-;78298:5:::1;78285:10;;:18;;;;;;;;;;;;;;;;;;78237:76::o:0;43443:155::-;43531:4;43555:18;:25;43574:5;43555:25;;;;;;;;;;;;;;;:35;43581:8;43555:35;;;;;;;;;;;;;;;;;;;;;;;;;43548:42;;43443:155;;;;:::o;77464:54::-;;;;;;;;;;;;;;;;;:::o;3619:220::-;2572:13;:11;:13::i;:::-;3724:1:::1;3704:22;;:8;:22;;::::0;3700:93:::1;;3778:1;3750:31;;;;;;;;;;;:::i;:::-;;;;;;;;3700:93;3803:28;3822:8;3803:18;:28::i;:::-;3619:220:::0;:::o;77582:40::-;;;;;;;;;;;;;;;;;;;;;;:::o;2851:166::-;2922:12;:10;:12::i;:::-;2911:23;;:7;:5;:7::i;:::-;:23;;;2907:103;;2985:12;:10;:12::i;:::-;2958:40;;;;;;;;;;;:::i;:::-;;;;;;;;2907:103;2851:166::o;40993:305::-;41095:4;41147:25;41132:40;;;:11;:40;;;;:105;;;;41204:33;41189:48;;;:11;:48;;;;41132:105;:158;;;;41254:36;41278:11;41254:23;:36::i;:::-;41132:158;41112:178;;40993:305;;;:::o;83242:173::-;83346:4;83370:37;83389:5;;83370:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83396:4;83402;83370:18;:37::i;:::-;83363:44;;83242:173;;;;;;:::o;50322:102::-;50390:26;50400:2;50404:7;50390:26;;;;;;;;;;;;:9;:26::i;:::-;50322:102;;:::o;55971:247::-;56034:7;56054:13;56070:17;56079:7;56070:8;:17::i;:::-;56054:33;;56119:1;56102:19;;:5;:19;;;56098:90;;56168:7;56145:31;;;;;;;;;;;:::i;:::-;;;;;;;;56098:90;56205:5;56198:12;;;55971:247;;;:::o;45502:129::-;45572:7;45599:15;:24;45615:7;45599:24;;;;;;;;;;;;;;;;;;;;;45592:31;;45502:129;;;:::o;695:98::-;748:7;775:10;768:17;;695:98;:::o;54203:122::-;54284:33;54293:2;54297:7;54306:4;54312;54284:8;:33::i;:::-;54203:122;;;:::o;61134:640::-;61229:7;61249:21;61273:32;61287:2;61291:7;61300:4;61273:13;:32::i;:::-;61249:56;;61347:1;61322:27;;:13;:27;;;61318:214;;61366:40;61398:7;61366:31;:40::i;:::-;61318:214;;;61445:2;61428:19;;:13;:19;;;61424:108;;61464:56;61497:13;61512:7;61464:32;:56::i;:::-;61424:108;61318:214;61560:1;61546:16;;:2;:16;;;61542:192;;61579:45;61616:7;61579:36;:45::i;:::-;61542:192;;;61663:2;61646:19;;:13;:19;;;61642:92;;61682:40;61710:2;61714:7;61682:27;:40::i;:::-;61642:92;61542:192;61753:13;61746:20;;;61134:640;;;;;:::o;45264:117::-;45330:7;45357;:16;45365:7;45357:16;;;;;;;;;;;;;;;;;;;;;45350:23;;45264:117;;;:::o;41637:120::-;41700:7;41727:22;41741:7;41727:13;:22::i;:::-;41720:29;;41637:120;;;:::o;3999:191::-;4073:16;4092:6;;;;;;;;;;;4073:25;;4118:8;4109:6;;:17;;;;;;;;;;;;;;;;;;4173:8;4142:40;;4163:8;4142:40;;;;;;;;;;;;4062:128;3999:191;:::o;55410:318::-;55538:1;55518:22;;:8;:22;;;55514:93;;55586:8;55564:31;;;;;;;;;;;:::i;:::-;;;;;;;;55514:93;55655:8;55617:18;:25;55636:5;55617:25;;;;;;;;;;;;;;;:35;55643:8;55617:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;55701:8;55679:41;;55694:5;55679:41;;;55711:8;55679:41;;;;;;:::i;:::-;;;;;;;;55410:318;;;:::o;56768:799::-;56902:1;56885:2;:14;;;:18;56881:679;;;56940:2;56924:36;;;56961:12;:10;:12::i;:::-;56975:4;56981:7;56990:4;56924:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;56920:629;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57255:1;57238:6;:13;:18;57234:300;;57310:2;57288:25;;;;;;;;;;;:::i;:::-;;;;;;;;57234:300;57484:6;57478:13;57469:6;57465:2;57461:15;57454:38;56920:629;57053:41;;;57043:51;;;:6;:51;;;;57039:132;;57148:2;57126:25;;;;;;;;;;;:::i;:::-;;;;;;;;57039:132;56996:190;56881:679;56768:799;;;;:::o;78519:108::-;78579:13;78612:7;78605:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78519:108;:::o;29546:718::-;29602:13;29653:14;29690:1;29670:17;29681:5;29670:10;:17::i;:::-;:21;29653:38;;29706:20;29740:6;29729:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29706:41;;29762:11;29891:6;29887:2;29883:15;29875:6;29871:28;29864:35;;29928:290;29935:4;29928:290;;;29960:5;;;;;;;;30102:10;30097:2;30090:5;30086:14;30081:32;30076:3;30068:46;30160:2;30151:11;;;;;;:::i;:::-;;;;;30194:1;30185:5;:10;29928:290;30181:21;29928:290;30239:6;30232:13;;;;;29546:718;;;:::o;32862:148::-;32938:4;32977:25;32962:40;;;:11;:40;;;;32955:47;;32862:148;;;:::o;67340:156::-;67431:4;67484;67455:25;67468:5;67475:4;67455:12;:25::i;:::-;:33;67448:40;;67340:156;;;;;:::o;50651:185::-;50746:18;50752:2;50756:7;50746:5;:18::i;:::-;50775:53;50806:1;50810:2;50814:7;50823:4;50775:22;:53::i;:::-;50651:185;;;:::o;54513:678::-;54675:9;:31;;;;54704:1;54688:18;;:4;:18;;;;54675:31;54671:471;;;54723:13;54739:22;54753:7;54739:13;:22::i;:::-;54723:38;;54908:1;54892:18;;:4;:18;;;;:35;;;;;54923:4;54914:13;;:5;:13;;;;54892:35;:69;;;;;54932:29;54949:5;54956:4;54932:16;:29::i;:::-;54931:30;54892:69;54888:144;;;55011:4;54989:27;;;;;;;;;;;:::i;:::-;;;;;;;;54888:144;55052:9;55048:83;;;55107:7;55103:2;55087:28;;55096:5;55087:28;;;;;;;;;;;;55048:83;54708:434;54671:471;55181:2;55154:15;:24;55170:7;55154:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;54513:678;;;;:::o;48464:824::-;48550:7;48570:12;48585:17;48594:7;48585:8;:17::i;:::-;48570:32;;48681:1;48665:18;;:4;:18;;;48661:88;;48700:37;48717:4;48723;48729:7;48700:16;:37::i;:::-;48661:88;48812:1;48796:18;;:4;:18;;;48792:263;;48914:48;48931:1;48935:7;48952:1;48956:5;48914:8;:48::i;:::-;49027:1;49008:9;:15;49018:4;49008:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;48792:263;49085:1;49071:16;;:2;:16;;;49067:111;;49150:1;49133:9;:13;49143:2;49133:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;49067:111;49209:2;49190:7;:16;49198:7;49190:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;49248:7;49244:2;49229:27;;49238:4;49229:27;;;;;;;;;;;;49276:4;49269:11;;;48464:824;;;;;:::o;62494:164::-;62598:10;:17;;;;62571:15;:24;62587:7;62571:24;;;;;;;;;;;:44;;;;62626:10;62642:7;62626:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62494:164;:::o;63285:977::-;63551:22;63576:15;63586:4;63576:9;:15::i;:::-;63551:40;;63602:18;63623:17;:26;63641:7;63623:26;;;;;;;;;;;;63602:47;;63770:14;63756:10;:28;63752:328;;63801:19;63823:12;:18;63836:4;63823:18;;;;;;;;;;;;;;;:34;63842:14;63823:34;;;;;;;;;;;;63801:56;;63907:11;63874:12;:18;63887:4;63874:18;;;;;;;;;;;;;;;:30;63893:10;63874:30;;;;;;;;;;;:44;;;;64024:10;63991:17;:30;64009:11;63991:30;;;;;;;;;;;:43;;;;63786:294;63752:328;64176:17;:26;64194:7;64176:26;;;;;;;;;;;64169:33;;;64220:12;:18;64233:4;64220:18;;;;;;;;;;;;;;;:34;64239:14;64220:34;;;;;;;;;;;64213:41;;;63366:896;;63285:977;;:::o;64557:1079::-;64810:22;64855:1;64835:10;:17;;;;:21;;;;:::i;:::-;64810:46;;64867:18;64888:15;:24;64904:7;64888:24;;;;;;;;;;;;64867:45;;65239:19;65261:10;65272:14;65261:26;;;;;;;;:::i;:::-;;;;;;;;;;65239:48;;65325:11;65300:10;65311;65300:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;65436:10;65405:15;:28;65421:11;65405:28;;;;;;;;;;;:41;;;;65577:15;:24;65593:7;65577:24;;;;;;;;;;;65570:31;;;65612:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;64628:1008;;;64557:1079;:::o;62075:218::-;62160:14;62193:1;62177:13;62187:2;62177:9;:13::i;:::-;:17;;;;:::i;:::-;62160:34;;62232:7;62205:12;:16;62218:2;62205:16;;;;;;;;;;;;;;;:24;62222:6;62205:24;;;;;;;;;;;:34;;;;62279:6;62250:17;:26;62268:7;62250:26;;;;;;;;;;;:35;;;;62149:144;62075:218;;:::o;24610:948::-;24663:7;24683:14;24700:1;24683:18;;24750:8;24741:5;:17;24737:106;;24788:8;24779:17;;;;;;:::i;:::-;;;;;24825:2;24815:12;;;;24737:106;24870:8;24861:5;:17;24857:106;;24908:8;24899:17;;;;;;:::i;:::-;;;;;24945:2;24935:12;;;;24857:106;24990:8;24981:5;:17;24977:106;;25028:8;25019:17;;;;;;:::i;:::-;;;;;25065:2;25055:12;;;;24977:106;25110:7;25101:5;:16;25097:103;;25147:7;25138:16;;;;;;:::i;:::-;;;;;25183:1;25173:11;;;;25097:103;25227:7;25218:5;:16;25214:103;;25264:7;25255:16;;;;;;:::i;:::-;;;;;25300:1;25290:11;;;;25214:103;25344:7;25335:5;:16;25331:103;;25381:7;25372:16;;;;;;:::i;:::-;;;;;25417:1;25407:11;;;;25331:103;25461:7;25452:5;:16;25448:68;;25499:1;25489:11;;;;25448:68;25544:6;25537:13;;;24610:948;;;:::o;68059:296::-;68142:7;68162:20;68185:4;68162:27;;68205:9;68200:118;68224:5;:12;68220:1;:16;68200:118;;;68273:33;68283:12;68297:5;68303:1;68297:8;;;;;;;;:::i;:::-;;;;;;;;68273:9;:33::i;:::-;68258:48;;68238:3;;;;;;;68200:118;;;;68335:12;68328:19;;;68059:296;;;;:::o;49624:335::-;49706:1;49692:16;;:2;:16;;;49688:89;;49762:1;49732:33;;;;;;;;;;;:::i;:::-;;;;;;;;49688:89;49787:21;49811:32;49819:2;49823:7;49840:1;49811:7;:32::i;:::-;49787:56;;49883:1;49858:27;;:13;:27;;;49854:98;;49937:1;49909:31;;;;;;;;;;;:::i;:::-;;;;;;;;49854:98;49677:282;49624:335;;:::o;46671:376::-;46784:38;46798:5;46805:7;46814;46784:13;:38::i;:::-;46779:261;;46860:1;46843:19;;:5;:19;;;46839:190;;46913:7;46890:31;;;;;;;;;;;:::i;:::-;;;;;;;;46839:190;46996:7;47005;46969:44;;;;;;;;;;;;:::i;:::-;;;;;;;;46779:261;46671:376;;;:::o;75489:149::-;75552:7;75583:1;75579;:5;:51;;75610:20;75625:1;75628;75610:14;:20::i;:::-;75579:51;;;75587:20;75602:1;75605;75587:14;:20::i;:::-;75579:51;75572:58;;75489:149;;;;:::o;45951:276::-;46054:4;46110:1;46091:21;;:7;:21;;;;:128;;;;;46139:7;46130:16;;:5;:16;;;:52;;;;46150:32;46167:5;46174:7;46150:16;:32::i;:::-;46130:52;:88;;;;46211:7;46186:32;;:21;46199:7;46186:12;:21::i;:::-;:32;;;46130:88;46091:128;46071:148;;45951:276;;;;;:::o;75763:268::-;75831:13;75938:1;75932:4;75925:15;75967:1;75961:4;75954:15;76008:4;76002;75992:21;75983:30;;75763:268;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:77::-;1555:7;1584:5;1573:16;;1518:77;;;:::o;1601:118::-;1688:24;1706:5;1688:24;:::i;:::-;1683:3;1676:37;1601:118;;:::o;1725:222::-;1818:4;1856:2;1845:9;1841:18;1833:26;;1869:71;1937:1;1926:9;1922:17;1913:6;1869:71;:::i;:::-;1725:222;;;;:::o;1953:117::-;2062:1;2059;2052:12;2076:117;2185:1;2182;2175:12;2199:117;2308:1;2305;2298:12;2339:568;2412:8;2422:6;2472:3;2465:4;2457:6;2453:17;2449:27;2439:122;;2480:79;;:::i;:::-;2439:122;2593:6;2580:20;2570:30;;2623:18;2615:6;2612:30;2609:117;;;2645:79;;:::i;:::-;2609:117;2759:4;2751:6;2747:17;2735:29;;2813:3;2805:4;2797:6;2793:17;2783:8;2779:32;2776:41;2773:128;;;2820:79;;:::i;:::-;2773:128;2339:568;;;;;:::o;2913:559::-;2999:6;3007;3056:2;3044:9;3035:7;3031:23;3027:32;3024:119;;;3062:79;;:::i;:::-;3024:119;3210:1;3199:9;3195:17;3182:31;3240:18;3232:6;3229:30;3226:117;;;3262:79;;:::i;:::-;3226:117;3375:80;3447:7;3438:6;3427:9;3423:22;3375:80;:::i;:::-;3357:98;;;;3153:312;2913:559;;;;;:::o;3478:99::-;3530:6;3564:5;3558:12;3548:22;;3478:99;;;:::o;3583:169::-;3667:11;3701:6;3696:3;3689:19;3741:4;3736:3;3732:14;3717:29;;3583:169;;;;:::o;3758:139::-;3847:6;3842:3;3837;3831:23;3888:1;3879:6;3874:3;3870:16;3863:27;3758:139;;;:::o;3903:102::-;3944:6;3995:2;3991:7;3986:2;3979:5;3975:14;3971:28;3961:38;;3903:102;;;:::o;4011:377::-;4099:3;4127:39;4160:5;4127:39;:::i;:::-;4182:71;4246:6;4241:3;4182:71;:::i;:::-;4175:78;;4262:65;4320:6;4315:3;4308:4;4301:5;4297:16;4262:65;:::i;:::-;4352:29;4374:6;4352:29;:::i;:::-;4347:3;4343:39;4336:46;;4103:285;4011:377;;;;:::o;4394:313::-;4507:4;4545:2;4534:9;4530:18;4522:26;;4594:9;4588:4;4584:20;4580:1;4569:9;4565:17;4558:47;4622:78;4695:4;4686:6;4622:78;:::i;:::-;4614:86;;4394:313;;;;:::o;4713:122::-;4786:24;4804:5;4786:24;:::i;:::-;4779:5;4776:35;4766:63;;4825:1;4822;4815:12;4766:63;4713:122;:::o;4841:139::-;4887:5;4925:6;4912:20;4903:29;;4941:33;4968:5;4941:33;:::i;:::-;4841:139;;;;:::o;4986:329::-;5045:6;5094:2;5082:9;5073:7;5069:23;5065:32;5062:119;;;5100:79;;:::i;:::-;5062:119;5220:1;5245:53;5290:7;5281:6;5270:9;5266:22;5245:53;:::i;:::-;5235:63;;5191:117;4986:329;;;;:::o;5321:126::-;5358:7;5398:42;5391:5;5387:54;5376:65;;5321:126;;;:::o;5453:96::-;5490:7;5519:24;5537:5;5519:24;:::i;:::-;5508:35;;5453:96;;;:::o;5555:118::-;5642:24;5660:5;5642:24;:::i;:::-;5637:3;5630:37;5555:118;;:::o;5679:222::-;5772:4;5810:2;5799:9;5795:18;5787:26;;5823:71;5891:1;5880:9;5876:17;5867:6;5823:71;:::i;:::-;5679:222;;;;:::o;5907:122::-;5980:24;5998:5;5980:24;:::i;:::-;5973:5;5970:35;5960:63;;6019:1;6016;6009:12;5960:63;5907:122;:::o;6035:139::-;6081:5;6119:6;6106:20;6097:29;;6135:33;6162:5;6135:33;:::i;:::-;6035:139;;;;:::o;6180:474::-;6248:6;6256;6305:2;6293:9;6284:7;6280:23;6276:32;6273:119;;;6311:79;;:::i;:::-;6273:119;6431:1;6456:53;6501:7;6492:6;6481:9;6477:22;6456:53;:::i;:::-;6446:63;;6402:117;6558:2;6584:53;6629:7;6620:6;6609:9;6605:22;6584:53;:::i;:::-;6574:63;;6529:118;6180:474;;;;;:::o;6660:77::-;6697:7;6726:5;6715:16;;6660:77;;;:::o;6743:118::-;6830:24;6848:5;6830:24;:::i;:::-;6825:3;6818:37;6743:118;;:::o;6867:222::-;6960:4;6998:2;6987:9;6983:18;6975:26;;7011:71;7079:1;7068:9;7064:17;7055:6;7011:71;:::i;:::-;6867:222;;;;:::o;7095:329::-;7154:6;7203:2;7191:9;7182:7;7178:23;7174:32;7171:119;;;7209:79;;:::i;:::-;7171:119;7329:1;7354:53;7399:7;7390:6;7379:9;7375:22;7354:53;:::i;:::-;7344:63;;7300:117;7095:329;;;;:::o;7430:619::-;7507:6;7515;7523;7572:2;7560:9;7551:7;7547:23;7543:32;7540:119;;;7578:79;;:::i;:::-;7540:119;7698:1;7723:53;7768:7;7759:6;7748:9;7744:22;7723:53;:::i;:::-;7713:63;;7669:117;7825:2;7851:53;7896:7;7887:6;7876:9;7872:22;7851:53;:::i;:::-;7841:63;;7796:118;7953:2;7979:53;8024:7;8015:6;8004:9;8000:22;7979:53;:::i;:::-;7969:63;;7924:118;7430:619;;;;;:::o;8055:117::-;8164:1;8161;8154:12;8178:180;8226:77;8223:1;8216:88;8323:4;8320:1;8313:15;8347:4;8344:1;8337:15;8364:281;8447:27;8469:4;8447:27;:::i;:::-;8439:6;8435:40;8577:6;8565:10;8562:22;8541:18;8529:10;8526:34;8523:62;8520:88;;;8588:18;;:::i;:::-;8520:88;8628:10;8624:2;8617:22;8407:238;8364:281;;:::o;8651:129::-;8685:6;8712:20;;:::i;:::-;8702:30;;8741:33;8769:4;8761:6;8741:33;:::i;:::-;8651:129;;;:::o;8786:308::-;8848:4;8938:18;8930:6;8927:30;8924:56;;;8960:18;;:::i;:::-;8924:56;8998:29;9020:6;8998:29;:::i;:::-;8990:37;;9082:4;9076;9072:15;9064:23;;8786:308;;;:::o;9100:148::-;9198:6;9193:3;9188;9175:30;9239:1;9230:6;9225:3;9221:16;9214:27;9100:148;;;:::o;9254:425::-;9332:5;9357:66;9373:49;9415:6;9373:49;:::i;:::-;9357:66;:::i;:::-;9348:75;;9446:6;9439:5;9432:21;9484:4;9477:5;9473:16;9522:3;9513:6;9508:3;9504:16;9501:25;9498:112;;;9529:79;;:::i;:::-;9498:112;9619:54;9666:6;9661:3;9656;9619:54;:::i;:::-;9338:341;9254:425;;;;;:::o;9699:340::-;9755:5;9804:3;9797:4;9789:6;9785:17;9781:27;9771:122;;9812:79;;:::i;:::-;9771:122;9929:6;9916:20;9954:79;10029:3;10021:6;10014:4;10006:6;10002:17;9954:79;:::i;:::-;9945:88;;9761:278;9699:340;;;;:::o;10045:509::-;10114:6;10163:2;10151:9;10142:7;10138:23;10134:32;10131:119;;;10169:79;;:::i;:::-;10131:119;10317:1;10306:9;10302:17;10289:31;10347:18;10339:6;10336:30;10333:117;;;10369:79;;:::i;:::-;10333:117;10474:63;10529:7;10520:6;10509:9;10505:22;10474:63;:::i;:::-;10464:73;;10260:287;10045:509;;;;:::o;10560:114::-;10627:6;10661:5;10655:12;10645:22;;10560:114;;;:::o;10680:184::-;10779:11;10813:6;10808:3;10801:19;10853:4;10848:3;10844:14;10829:29;;10680:184;;;;:::o;10870:132::-;10937:4;10960:3;10952:11;;10990:4;10985:3;10981:14;10973:22;;10870:132;;;:::o;11008:108::-;11085:24;11103:5;11085:24;:::i;:::-;11080:3;11073:37;11008:108;;:::o;11122:179::-;11191:10;11212:46;11254:3;11246:6;11212:46;:::i;:::-;11290:4;11285:3;11281:14;11267:28;;11122:179;;;;:::o;11307:113::-;11377:4;11409;11404:3;11400:14;11392:22;;11307:113;;;:::o;11456:732::-;11575:3;11604:54;11652:5;11604:54;:::i;:::-;11674:86;11753:6;11748:3;11674:86;:::i;:::-;11667:93;;11784:56;11834:5;11784:56;:::i;:::-;11863:7;11894:1;11879:284;11904:6;11901:1;11898:13;11879:284;;;11980:6;11974:13;12007:63;12066:3;12051:13;12007:63;:::i;:::-;12000:70;;12093:60;12146:6;12093:60;:::i;:::-;12083:70;;11939:224;11926:1;11923;11919:9;11914:14;;11879:284;;;11883:14;12179:3;12172:10;;11580:608;;;11456:732;;;;:::o;12194:373::-;12337:4;12375:2;12364:9;12360:18;12352:26;;12424:9;12418:4;12414:20;12410:1;12399:9;12395:17;12388:47;12452:108;12555:4;12546:6;12452:108;:::i;:::-;12444:116;;12194:373;;;;:::o;12573:116::-;12643:21;12658:5;12643:21;:::i;:::-;12636:5;12633:32;12623:60;;12679:1;12676;12669:12;12623:60;12573:116;:::o;12695:133::-;12738:5;12776:6;12763:20;12754:29;;12792:30;12816:5;12792:30;:::i;:::-;12695:133;;;;:::o;12834:468::-;12899:6;12907;12956:2;12944:9;12935:7;12931:23;12927:32;12924:119;;;12962:79;;:::i;:::-;12924:119;13082:1;13107:53;13152:7;13143:6;13132:9;13128:22;13107:53;:::i;:::-;13097:63;;13053:117;13209:2;13235:50;13277:7;13268:6;13257:9;13253:22;13235:50;:::i;:::-;13225:60;;13180:115;12834:468;;;;;:::o;13308:307::-;13369:4;13459:18;13451:6;13448:30;13445:56;;;13481:18;;:::i;:::-;13445:56;13519:29;13541:6;13519:29;:::i;:::-;13511:37;;13603:4;13597;13593:15;13585:23;;13308:307;;;:::o;13621:423::-;13698:5;13723:65;13739:48;13780:6;13739:48;:::i;:::-;13723:65;:::i;:::-;13714:74;;13811:6;13804:5;13797:21;13849:4;13842:5;13838:16;13887:3;13878:6;13873:3;13869:16;13866:25;13863:112;;;13894:79;;:::i;:::-;13863:112;13984:54;14031:6;14026:3;14021;13984:54;:::i;:::-;13704:340;13621:423;;;;;:::o;14063:338::-;14118:5;14167:3;14160:4;14152:6;14148:17;14144:27;14134:122;;14175:79;;:::i;:::-;14134:122;14292:6;14279:20;14317:78;14391:3;14383:6;14376:4;14368:6;14364:17;14317:78;:::i;:::-;14308:87;;14124:277;14063:338;;;;:::o;14407:943::-;14502:6;14510;14518;14526;14575:3;14563:9;14554:7;14550:23;14546:33;14543:120;;;14582:79;;:::i;:::-;14543:120;14702:1;14727:53;14772:7;14763:6;14752:9;14748:22;14727:53;:::i;:::-;14717:63;;14673:117;14829:2;14855:53;14900:7;14891:6;14880:9;14876:22;14855:53;:::i;:::-;14845:63;;14800:118;14957:2;14983:53;15028:7;15019:6;15008:9;15004:22;14983:53;:::i;:::-;14973:63;;14928:118;15113:2;15102:9;15098:18;15085:32;15144:18;15136:6;15133:30;15130:117;;;15166:79;;:::i;:::-;15130:117;15271:62;15325:7;15316:6;15305:9;15301:22;15271:62;:::i;:::-;15261:72;;15056:287;14407:943;;;;;;;:::o;15356:474::-;15424:6;15432;15481:2;15469:9;15460:7;15456:23;15452:32;15449:119;;;15487:79;;:::i;:::-;15449:119;15607:1;15632:53;15677:7;15668:6;15657:9;15653:22;15632:53;:::i;:::-;15622:63;;15578:117;15734:2;15760:53;15805:7;15796:6;15785:9;15781:22;15760:53;:::i;:::-;15750:63;;15705:118;15356:474;;;;;:::o;15836:173::-;15976:25;15972:1;15964:6;15960:14;15953:49;15836:173;:::o;16015:366::-;16157:3;16178:67;16242:2;16237:3;16178:67;:::i;:::-;16171:74;;16254:93;16343:3;16254:93;:::i;:::-;16372:2;16367:3;16363:12;16356:19;;16015:366;;;:::o;16387:419::-;16553:4;16591:2;16580:9;16576:18;16568:26;;16640:9;16634:4;16630:20;16626:1;16615:9;16611:17;16604:47;16668:131;16794:4;16668:131;:::i;:::-;16660:139;;16387:419;;;:::o;16812:180::-;16860:77;16857:1;16850:88;16957:4;16954:1;16947:15;16981:4;16978:1;16971:15;16998:191;17038:3;17057:20;17075:1;17057:20;:::i;:::-;17052:25;;17091:20;17109:1;17091:20;:::i;:::-;17086:25;;17134:1;17131;17127:9;17120:16;;17155:3;17152:1;17149:10;17146:36;;;17162:18;;:::i;:::-;17146:36;16998:191;;;;:::o;17195:79::-;17234:7;17263:5;17252:16;;17195:79;;;:::o;17280:157::-;17385:45;17405:24;17423:5;17405:24;:::i;:::-;17385:45;:::i;:::-;17380:3;17373:58;17280:157;;:::o;17443:94::-;17476:8;17524:5;17520:2;17516:14;17495:35;;17443:94;;;:::o;17543:::-;17582:7;17611:20;17625:5;17611:20;:::i;:::-;17600:31;;17543:94;;;:::o;17643:100::-;17682:7;17711:26;17731:5;17711:26;:::i;:::-;17700:37;;17643:100;;;:::o;17749:157::-;17854:45;17874:24;17892:5;17874:24;:::i;:::-;17854:45;:::i;:::-;17849:3;17842:58;17749:157;;:::o;17912:538::-;18080:3;18095:75;18166:3;18157:6;18095:75;:::i;:::-;18195:2;18190:3;18186:12;18179:19;;18208:75;18279:3;18270:6;18208:75;:::i;:::-;18308:2;18303:3;18299:12;18292:19;;18321:75;18392:3;18383:6;18321:75;:::i;:::-;18421:2;18416:3;18412:12;18405:19;;18441:3;18434:10;;17912:538;;;;;;:::o;18456:256::-;18568:3;18583:75;18654:3;18645:6;18583:75;:::i;:::-;18683:2;18678:3;18674:12;18667:19;;18703:3;18696:10;;18456:256;;;;:::o;18718:233::-;18757:3;18780:24;18798:5;18780:24;:::i;:::-;18771:33;;18826:66;18819:5;18816:77;18813:103;;18896:18;;:::i;:::-;18813:103;18943:1;18936:5;18932:13;18925:20;;18718:233;;;:::o;18957:163::-;19097:15;19093:1;19085:6;19081:14;19074:39;18957:163;:::o;19126:366::-;19268:3;19289:67;19353:2;19348:3;19289:67;:::i;:::-;19282:74;;19365:93;19454:3;19365:93;:::i;:::-;19483:2;19478:3;19474:12;19467:19;;19126:366;;;:::o;19498:419::-;19664:4;19702:2;19691:9;19687:18;19679:26;;19751:9;19745:4;19741:20;19737:1;19726:9;19722:17;19715:47;19779:131;19905:4;19779:131;:::i;:::-;19771:139;;19498:419;;;:::o;19923:170::-;20063:22;20059:1;20051:6;20047:14;20040:46;19923:170;:::o;20099:366::-;20241:3;20262:67;20326:2;20321:3;20262:67;:::i;:::-;20255:74;;20338:93;20427:3;20338:93;:::i;:::-;20456:2;20451:3;20447:12;20440:19;;20099:366;;;:::o;20471:419::-;20637:4;20675:2;20664:9;20660:18;20652:26;;20724:9;20718:4;20714:20;20710:1;20699:9;20695:17;20688:47;20752:131;20878:4;20752:131;:::i;:::-;20744:139;;20471:419;;;:::o;20896:163::-;21036:15;21032:1;21024:6;21020:14;21013:39;20896:163;:::o;21065:366::-;21207:3;21228:67;21292:2;21287:3;21228:67;:::i;:::-;21221:74;;21304:93;21393:3;21304:93;:::i;:::-;21422:2;21417:3;21413:12;21406:19;;21065:366;;;:::o;21437:419::-;21603:4;21641:2;21630:9;21626:18;21618:26;;21690:9;21684:4;21680:20;21676:1;21665:9;21661:17;21654:47;21718:131;21844:4;21718:131;:::i;:::-;21710:139;;21437:419;;;:::o;21862:160::-;22002:12;21998:1;21990:6;21986:14;21979:36;21862:160;:::o;22028:366::-;22170:3;22191:67;22255:2;22250:3;22191:67;:::i;:::-;22184:74;;22267:93;22356:3;22267:93;:::i;:::-;22385:2;22380:3;22376:12;22369:19;;22028:366;;;:::o;22400:419::-;22566:4;22604:2;22593:9;22589:18;22581:26;;22653:9;22647:4;22643:20;22639:1;22628:9;22624:17;22617:47;22681:131;22807:4;22681:131;:::i;:::-;22673:139;;22400:419;;;:::o;22825:158::-;22965:10;22961:1;22953:6;22949:14;22942:34;22825:158;:::o;22989:365::-;23131:3;23152:66;23216:1;23211:3;23152:66;:::i;:::-;23145:73;;23227:93;23316:3;23227:93;:::i;:::-;23345:2;23340:3;23336:12;23329:19;;22989:365;;;:::o;23360:419::-;23526:4;23564:2;23553:9;23549:18;23541:26;;23613:9;23607:4;23603:20;23599:1;23588:9;23584:17;23577:47;23641:131;23767:4;23641:131;:::i;:::-;23633:139;;23360:419;;;:::o;23785:180::-;23833:77;23830:1;23823:88;23930:4;23927:1;23920:15;23954:4;23951:1;23944:15;23971:320;24015:6;24052:1;24046:4;24042:12;24032:22;;24099:1;24093:4;24089:12;24120:18;24110:81;;24176:4;24168:6;24164:17;24154:27;;24110:81;24238:2;24230:6;24227:14;24207:18;24204:38;24201:84;;24257:18;;:::i;:::-;24201:84;24022:269;23971:320;;;:::o;24297:168::-;24437:20;24433:1;24425:6;24421:14;24414:44;24297:168;:::o;24471:366::-;24613:3;24634:67;24698:2;24693:3;24634:67;:::i;:::-;24627:74;;24710:93;24799:3;24710:93;:::i;:::-;24828:2;24823:3;24819:12;24812:19;;24471:366;;;:::o;24843:419::-;25009:4;25047:2;25036:9;25032:18;25024:26;;25096:9;25090:4;25086:20;25082:1;25071:9;25067:17;25060:47;25124:131;25250:4;25124:131;:::i;:::-;25116:139;;24843:419;;;:::o;25268:162::-;25408:14;25404:1;25396:6;25392:14;25385:38;25268:162;:::o;25436:366::-;25578:3;25599:67;25663:2;25658:3;25599:67;:::i;:::-;25592:74;;25675:93;25764:3;25675:93;:::i;:::-;25793:2;25788:3;25784:12;25777:19;;25436:366;;;:::o;25808:419::-;25974:4;26012:2;26001:9;25997:18;25989:26;;26061:9;26055:4;26051:20;26047:1;26036:9;26032:17;26025:47;26089:131;26215:4;26089:131;:::i;:::-;26081:139;;25808:419;;;:::o;26233:442::-;26382:4;26420:2;26409:9;26405:18;26397:26;;26433:71;26501:1;26490:9;26486:17;26477:6;26433:71;:::i;:::-;26514:72;26582:2;26571:9;26567:18;26558:6;26514:72;:::i;:::-;26596;26664:2;26653:9;26649:18;26640:6;26596:72;:::i;:::-;26233:442;;;;;;:::o;26681:332::-;26802:4;26840:2;26829:9;26825:18;26817:26;;26853:71;26921:1;26910:9;26906:17;26897:6;26853:71;:::i;:::-;26934:72;27002:2;26991:9;26987:18;26978:6;26934:72;:::i;:::-;26681:332;;;;;:::o;27019:180::-;27067:77;27064:1;27057:88;27164:4;27161:1;27154:15;27188:4;27185:1;27178:15;27205:185;27245:1;27262:20;27280:1;27262:20;:::i;:::-;27257:25;;27296:20;27314:1;27296:20;:::i;:::-;27291:25;;27335:1;27325:35;;27340:18;;:::i;:::-;27325:35;27382:1;27379;27375:9;27370:14;;27205:185;;;;:::o;27396:410::-;27436:7;27459:20;27477:1;27459:20;:::i;:::-;27454:25;;27493:20;27511:1;27493:20;:::i;:::-;27488:25;;27548:1;27545;27541:9;27570:30;27588:11;27570:30;:::i;:::-;27559:41;;27749:1;27740:7;27736:15;27733:1;27730:22;27710:1;27703:9;27683:83;27660:139;;27779:18;;:::i;:::-;27660:139;27444:362;27396:410;;;;:::o;27812:194::-;27852:4;27872:20;27890:1;27872:20;:::i;:::-;27867:25;;27906:20;27924:1;27906:20;:::i;:::-;27901:25;;27950:1;27947;27943:9;27935:17;;27974:1;27968:4;27965:11;27962:37;;;27979:18;;:::i;:::-;27962:37;27812:194;;;;:::o;28012:180::-;28060:77;28057:1;28050:88;28157:4;28154:1;28147:15;28181:4;28178:1;28171:15;28198:141;28247:4;28270:3;28262:11;;28293:3;28290:1;28283:14;28327:4;28324:1;28314:18;28306:26;;28198:141;;;:::o;28345:93::-;28382:6;28429:2;28424;28417:5;28413:14;28409:23;28399:33;;28345:93;;;:::o;28444:107::-;28488:8;28538:5;28532:4;28528:16;28507:37;;28444:107;;;;:::o;28557:393::-;28626:6;28676:1;28664:10;28660:18;28699:97;28729:66;28718:9;28699:97;:::i;:::-;28817:39;28847:8;28836:9;28817:39;:::i;:::-;28805:51;;28889:4;28885:9;28878:5;28874:21;28865:30;;28938:4;28928:8;28924:19;28917:5;28914:30;28904:40;;28633:317;;28557:393;;;;;:::o;28956:60::-;28984:3;29005:5;28998:12;;28956:60;;;:::o;29022:142::-;29072:9;29105:53;29123:34;29132:24;29150:5;29132:24;:::i;:::-;29123:34;:::i;:::-;29105:53;:::i;:::-;29092:66;;29022:142;;;:::o;29170:75::-;29213:3;29234:5;29227:12;;29170:75;;;:::o;29251:269::-;29361:39;29392:7;29361:39;:::i;:::-;29422:91;29471:41;29495:16;29471:41;:::i;:::-;29463:6;29456:4;29450:11;29422:91;:::i;:::-;29416:4;29409:105;29327:193;29251:269;;;:::o;29526:73::-;29571:3;29526:73;:::o;29605:189::-;29682:32;;:::i;:::-;29723:65;29781:6;29773;29767:4;29723:65;:::i;:::-;29658:136;29605:189;;:::o;29800:186::-;29860:120;29877:3;29870:5;29867:14;29860:120;;;29931:39;29968:1;29961:5;29931:39;:::i;:::-;29904:1;29897:5;29893:13;29884:22;;29860:120;;;29800:186;;:::o;29992:543::-;30093:2;30088:3;30085:11;30082:446;;;30127:38;30159:5;30127:38;:::i;:::-;30211:29;30229:10;30211:29;:::i;:::-;30201:8;30197:44;30394:2;30382:10;30379:18;30376:49;;;30415:8;30400:23;;30376:49;30438:80;30494:22;30512:3;30494:22;:::i;:::-;30484:8;30480:37;30467:11;30438:80;:::i;:::-;30097:431;;30082:446;29992:543;;;:::o;30541:117::-;30595:8;30645:5;30639:4;30635:16;30614:37;;30541:117;;;;:::o;30664:169::-;30708:6;30741:51;30789:1;30785:6;30777:5;30774:1;30770:13;30741:51;:::i;:::-;30737:56;30822:4;30816;30812:15;30802:25;;30715:118;30664:169;;;;:::o;30838:295::-;30914:4;31060:29;31085:3;31079:4;31060:29;:::i;:::-;31052:37;;31122:3;31119:1;31115:11;31109:4;31106:21;31098:29;;30838:295;;;;:::o;31138:1395::-;31255:37;31288:3;31255:37;:::i;:::-;31357:18;31349:6;31346:30;31343:56;;;31379:18;;:::i;:::-;31343:56;31423:38;31455:4;31449:11;31423:38;:::i;:::-;31508:67;31568:6;31560;31554:4;31508:67;:::i;:::-;31602:1;31626:4;31613:17;;31658:2;31650:6;31647:14;31675:1;31670:618;;;;32332:1;32349:6;32346:77;;;32398:9;32393:3;32389:19;32383:26;32374:35;;32346:77;32449:67;32509:6;32502:5;32449:67;:::i;:::-;32443:4;32436:81;32305:222;31640:887;;31670:618;31722:4;31718:9;31710:6;31706:22;31756:37;31788:4;31756:37;:::i;:::-;31815:1;31829:208;31843:7;31840:1;31837:14;31829:208;;;31922:9;31917:3;31913:19;31907:26;31899:6;31892:42;31973:1;31965:6;31961:14;31951:24;;32020:2;32009:9;32005:18;31992:31;;31866:4;31863:1;31859:12;31854:17;;31829:208;;;32065:6;32056:7;32053:19;32050:179;;;32123:9;32118:3;32114:19;32108:26;32166:48;32208:4;32200:6;32196:17;32185:9;32166:48;:::i;:::-;32158:6;32151:64;32073:156;32050:179;32275:1;32271;32263:6;32259:14;32255:22;32249:4;32242:36;31677:611;;;31640:887;;31230:1303;;;31138:1395;;:::o;32539:148::-;32641:11;32678:3;32663:18;;32539:148;;;;:::o;32693:390::-;32799:3;32827:39;32860:5;32827:39;:::i;:::-;32882:89;32964:6;32959:3;32882:89;:::i;:::-;32875:96;;32980:65;33038:6;33033:3;33026:4;33019:5;33015:16;32980:65;:::i;:::-;33070:6;33065:3;33061:16;33054:23;;32803:280;32693:390;;;;:::o;33113:874::-;33216:3;33253:5;33247:12;33282:36;33308:9;33282:36;:::i;:::-;33334:89;33416:6;33411:3;33334:89;:::i;:::-;33327:96;;33454:1;33443:9;33439:17;33470:1;33465:166;;;;33645:1;33640:341;;;;33432:549;;33465:166;33549:4;33545:9;33534;33530:25;33525:3;33518:38;33611:6;33604:14;33597:22;33589:6;33585:35;33580:3;33576:45;33569:52;;33465:166;;33640:341;33707:38;33739:5;33707:38;:::i;:::-;33767:1;33781:154;33795:6;33792:1;33789:13;33781:154;;;33869:7;33863:14;33859:1;33854:3;33850:11;33843:35;33919:1;33910:7;33906:15;33895:26;;33817:4;33814:1;33810:12;33805:17;;33781:154;;;33964:6;33959:3;33955:16;33948:23;;33647:334;;33432:549;;33220:767;;33113:874;;;;:::o;33993:589::-;34218:3;34240:95;34331:3;34322:6;34240:95;:::i;:::-;34233:102;;34352:95;34443:3;34434:6;34352:95;:::i;:::-;34345:102;;34464:92;34552:3;34543:6;34464:92;:::i;:::-;34457:99;;34573:3;34566:10;;33993:589;;;;;;:::o;34588:164::-;34728:16;34724:1;34716:6;34712:14;34705:40;34588:164;:::o;34758:366::-;34900:3;34921:67;34985:2;34980:3;34921:67;:::i;:::-;34914:74;;34997:93;35086:3;34997:93;:::i;:::-;35115:2;35110:3;35106:12;35099:19;;34758:366;;;:::o;35130:419::-;35296:4;35334:2;35323:9;35319:18;35311:26;;35383:9;35377:4;35373:20;35369:1;35358:9;35354:17;35347:47;35411:131;35537:4;35411:131;:::i;:::-;35403:139;;35130:419;;;:::o;35555:98::-;35606:6;35640:5;35634:12;35624:22;;35555:98;;;:::o;35659:168::-;35742:11;35776:6;35771:3;35764:19;35816:4;35811:3;35807:14;35792:29;;35659:168;;;;:::o;35833:373::-;35919:3;35947:38;35979:5;35947:38;:::i;:::-;36001:70;36064:6;36059:3;36001:70;:::i;:::-;35994:77;;36080:65;36138:6;36133:3;36126:4;36119:5;36115:16;36080:65;:::i;:::-;36170:29;36192:6;36170:29;:::i;:::-;36165:3;36161:39;36154:46;;35923:283;35833:373;;;;:::o;36212:640::-;36407:4;36445:3;36434:9;36430:19;36422:27;;36459:71;36527:1;36516:9;36512:17;36503:6;36459:71;:::i;:::-;36540:72;36608:2;36597:9;36593:18;36584:6;36540:72;:::i;:::-;36622;36690:2;36679:9;36675:18;36666:6;36622:72;:::i;:::-;36741:9;36735:4;36731:20;36726:2;36715:9;36711:18;36704:48;36769:76;36840:4;36831:6;36769:76;:::i;:::-;36761:84;;36212:640;;;;;;;:::o;36858:141::-;36914:5;36945:6;36939:13;36930:22;;36961:32;36987:5;36961:32;:::i;:::-;36858:141;;;;:::o;37005:349::-;37074:6;37123:2;37111:9;37102:7;37098:23;37094:32;37091:119;;;37129:79;;:::i;:::-;37091:119;37249:1;37274:63;37329:7;37320:6;37309:9;37305:22;37274:63;:::i;:::-;37264:73;;37220:127;37005:349;;;;:::o;37360:180::-;37408:77;37405:1;37398:88;37505:4;37502:1;37495:15;37529:4;37526:1;37519:15
Swarm Source
ipfs://2b6e18340dd5984d34bffc0256901f711a0286123b4c8cee3343886923cb74f2
Loading...
Loading
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.