Source Code
Overview
ETH Balance
0.00001 ETH
More Info
ContractCreator
TokenTracker
Multichain Info
N/A
Latest 21 from a total of 21 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Transfer From | 7192460 | 111 days ago | IN | 0 ETH | 0.00005562 | ||||
Create Token | 7191603 | 111 days ago | IN | 0.00003 ETH | 0.00215394 | ||||
Create Token | 7191563 | 111 days ago | IN | 0.00004 ETH | 0.00245868 | ||||
Create Token | 7191422 | 111 days ago | IN | 0.00003 ETH | 0.00159958 | ||||
Set Approval For... | 7185033 | 112 days ago | IN | 0 ETH | 0.00020203 | ||||
Set Approval For... | 7184903 | 112 days ago | IN | 0 ETH | 0.00024949 | ||||
Set Default Roya... | 7180534 | 113 days ago | IN | 0 ETH | 0.00006308 | ||||
Set Approval For... | 7180490 | 113 days ago | IN | 0 ETH | 0.00016426 | ||||
Create Token | 7180410 | 113 days ago | IN | 0.00001 ETH | 0.00250289 | ||||
Create Token | 7180339 | 113 days ago | IN | 0.097892 ETH | 0.00267306 | ||||
Create Token | 7180264 | 113 days ago | IN | 0.00004 ETH | 0.00317098 | ||||
Create Token | 7180165 | 113 days ago | IN | 0.00001 ETH | 0.00209279 | ||||
Set Marketplace ... | 7180100 | 113 days ago | IN | 0 ETH | 0.00025512 | ||||
Set Wallet Recei... | 7180025 | 113 days ago | IN | 0 ETH | 0.00003709 | ||||
Set Price | 7179975 | 113 days ago | IN | 0 ETH | 0.00003685 | ||||
Set Price | 7179974 | 113 days ago | IN | 0 ETH | 0.00003762 | ||||
Set Price | 7179972 | 113 days ago | IN | 0 ETH | 0.00003688 | ||||
Set Price | 7179971 | 113 days ago | IN | 0 ETH | 0.00003674 | ||||
Set Price | 7179970 | 113 days ago | IN | 0 ETH | 0.00003347 | ||||
Set Minting Secr... | 7179960 | 113 days ago | IN | 0 ETH | 0.00004295 | ||||
Set Allow Postal... | 7179951 | 113 days ago | IN | 0 ETH | 0.00003657 |
Latest 24 internal transactions
Advanced mode:
Parent Transaction Hash | Method | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|---|
Transfer | 7191603 | 111 days ago | 0.000024 ETH | ||||
Transfer | 7191603 | 111 days ago | 0.000003 ETH | ||||
Transfer | 7191563 | 111 days ago | 0.000026 ETH | ||||
Transfer | 7191563 | 111 days ago | 0.000004 ETH | ||||
Transfer | 7191563 | 111 days ago | 0.000004 ETH | ||||
Transfer | 7191563 | 111 days ago | 0.000002 ETH | ||||
Transfer | 7191422 | 111 days ago | 0.0000225 ETH | ||||
Transfer | 7191422 | 111 days ago | 0.000003 ETH | ||||
Transfer | 7191422 | 111 days ago | 0.0000015 ETH | ||||
Transfer | 7180410 | 113 days ago | 0.0000075 ETH | ||||
Transfer | 7180410 | 113 days ago | 0.000001 ETH | ||||
Transfer | 7180410 | 113 days ago | 0.000001 ETH | ||||
Transfer | 7180410 | 113 days ago | 0.0000005 ETH | ||||
Transfer | 7180339 | 113 days ago | 0.0832082 ETH | ||||
Transfer | 7180339 | 113 days ago | 0.0097892 ETH | ||||
Transfer | 7180339 | 113 days ago | 0.000005 ETH | ||||
Transfer | 7180339 | 113 days ago | 0.0048946 ETH | ||||
Transfer | 7180264 | 113 days ago | 0.000026 ETH | ||||
Transfer | 7180264 | 113 days ago | 0.000004 ETH | ||||
Transfer | 7180264 | 113 days ago | 0.000004 ETH | ||||
Transfer | 7180264 | 113 days ago | 0.000002 ETH | ||||
Transfer | 7180165 | 113 days ago | 0.0000075 ETH | ||||
Transfer | 7180165 | 113 days ago | 0.000001 ETH | ||||
Transfer | 7180165 | 113 days ago | 0.0000005 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
EASNFT
Compiler Version
v0.8.26+commit.8a97fa7a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-11-29 */ // SPDX-License-Identifier: MIT // 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/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/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/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/interfaces/IERC165.sol // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC165.sol) pragma solidity ^0.8.20; // File: @openzeppelin/contracts/interfaces/IERC721.sol // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC721.sol) pragma solidity ^0.8.20; // File: @openzeppelin/contracts/interfaces/IERC4906.sol // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC4906.sol) pragma solidity ^0.8.20; /// @title EIP-721 Metadata Update Extension interface IERC4906 is IERC165, IERC721 { /// @dev This event emits when the metadata of a token is changed. /// So that the third-party platforms such as NFT market could /// timely update the images and related attributes of the NFT. event MetadataUpdate(uint256 _tokenId); /// @dev This event emits when the metadata of a range of tokens is changed. /// So that the third-party platforms such as NFT market could /// timely update the images and related attributes of the NFTs. event BatchMetadataUpdate(uint256 _fromTokenId, uint256 _toTokenId); } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/extensions/ERC721URIStorage.sol) pragma solidity ^0.8.20; /** * @dev ERC721 token with storage based token URI management. */ abstract contract ERC721URIStorage is IERC4906, ERC721 { using Strings for uint256; // Interface ID as defined in ERC-4906. This does not correspond to a traditional interface ID as ERC-4906 only // defines events and does not include any external function. bytes4 private constant ERC4906_INTERFACE_ID = bytes4(0x49064906); // Optional mapping for token URIs mapping(uint256 tokenId => string) private _tokenURIs; /** * @dev See {IERC165-supportsInterface} */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, IERC165) returns (bool) { return interfaceId == ERC4906_INTERFACE_ID || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireOwned(tokenId); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = _baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via string.concat). if (bytes(_tokenURI).length > 0) { return string.concat(base, _tokenURI); } return super.tokenURI(tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Emits {MetadataUpdate}. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { _tokenURIs[tokenId] = _tokenURI; emit MetadataUpdate(tokenId); } } // File: @openzeppelin/contracts/interfaces/IERC2981.sol // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.20; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo( uint256 tokenId, uint256 salePrice ) external view returns (address receiver, uint256 royaltyAmount); } // File: @openzeppelin/contracts/token/common/ERC2981.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/common/ERC2981.sol) pragma solidity ^0.8.20; /** * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the * fee is specified in basis points by default. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. */ abstract contract ERC2981 is IERC2981, ERC165 { struct RoyaltyInfo { address receiver; uint96 royaltyFraction; } RoyaltyInfo private _defaultRoyaltyInfo; mapping(uint256 tokenId => RoyaltyInfo) private _tokenRoyaltyInfo; /** * @dev The default royalty set is invalid (eg. (numerator / denominator) >= 1). */ error ERC2981InvalidDefaultRoyalty(uint256 numerator, uint256 denominator); /** * @dev The default royalty receiver is invalid. */ error ERC2981InvalidDefaultRoyaltyReceiver(address receiver); /** * @dev The royalty set for an specific `tokenId` is invalid (eg. (numerator / denominator) >= 1). */ error ERC2981InvalidTokenRoyalty(uint256 tokenId, uint256 numerator, uint256 denominator); /** * @dev The royalty receiver for `tokenId` is invalid. */ error ERC2981InvalidTokenRoyaltyReceiver(uint256 tokenId, address receiver); /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981 */ function royaltyInfo(uint256 tokenId, uint256 salePrice) public view virtual returns (address, uint256) { RoyaltyInfo memory royalty = _tokenRoyaltyInfo[tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } uint256 royaltyAmount = (salePrice * royalty.royaltyFraction) / _feeDenominator(); return (royalty.receiver, royaltyAmount); } /** * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an * override. */ function _feeDenominator() internal pure virtual returns (uint96) { return 10000; } /** * @dev Sets the royalty information that all ids in this contract will default to. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual { uint256 denominator = _feeDenominator(); if (feeNumerator > denominator) { // Royalty fee will exceed the sale price revert ERC2981InvalidDefaultRoyalty(feeNumerator, denominator); } if (receiver == address(0)) { revert ERC2981InvalidDefaultRoyaltyReceiver(address(0)); } _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Removes default royalty information. */ function _deleteDefaultRoyalty() internal virtual { delete _defaultRoyaltyInfo; } /** * @dev Sets the royalty information for a specific token id, overriding the global default. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setTokenRoyalty(uint256 tokenId, address receiver, uint96 feeNumerator) internal virtual { uint256 denominator = _feeDenominator(); if (feeNumerator > denominator) { // Royalty fee will exceed the sale price revert ERC2981InvalidTokenRoyalty(tokenId, feeNumerator, denominator); } if (receiver == address(0)) { revert ERC2981InvalidTokenRoyaltyReceiver(tokenId, address(0)); } _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Resets royalty information for the token id back to the global default. */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; } } // 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/Counters.sol // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Burnable.sol // OpenZeppelin Contracts (last updated v5.1.0) (token/ERC721/extensions/ERC721Burnable.sol) pragma solidity ^0.8.20; /** * @title ERC-721 Burnable Token * @dev ERC-721 Token that can be burned (destroyed). */ abstract contract ERC721Burnable is Context, ERC721 { /** * @dev Burns `tokenId`. See {ERC721-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual { // 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. _update(address(0), tokenId, _msgSender()); } } // File: contracts/EASNFT-11-29-2024.sol pragma solidity ^0.8.20; // Import extensions // Main contract contract EASNFT is ERC721, Ownable, ERC721URIStorage, ERC2981, ERC721Enumerable, ERC721Burnable { // Errors error NFT_PRICE_ZERO(); error Postal_already_exists(); error PRICE_NOT_ZERO(); // Generate next token IDs using Counters for Counters.Counter; Counters.Counter private _nextTokenId; Counters.Counter private _nextOfferId; uint256 public constant Fee_Denominator = 10000; // Owner can pause any function bool public pause = false; // NFT types string private constant Standard = "Standard"; string private constant Gold = "Gold"; string private constant Platinum = "Platinum"; string private constant Charity = "Charity"; string private constant Neighborhood = "Neighborhood"; // Wallets address payable private charityReceiver; address payable private addressQuestReceiver; address payable private ownerSubReceiver; address payable private refAndNeighborhoodReceiver; address payable private marketplaceFeeReceiver; address payable private royaltyReceiver; uint256 public Royalty = 500; // 5% // Minting percentages uint256 public neighborhoodPercentageByMint = 1000; // 10% uint256 public charityPercentageByMint = 1000; // 10% uint256 public addressQuestPercentageByMint = 1000; // 10% uint256 public referralPercentage = 500; // 5% // Marketplace percentages uint256 public neighborhoodPercentageByMarketplace = 100; // 1% uint256 public charityPercentageByMarketplace = 100; // 1% uint256 public addressQuestPercentageByMarketplace = 100; // 1% uint256 public marketplaceFeePercentage = 200; // 2% // struct for marketplace allocation details struct AllocationDetails { uint256 amount; uint256 percentage; address receiver; } struct MarketplaceAllocations { AllocationDetails marketplaceFee; AllocationDetails royalty; AllocationDetails addressQuest; AllocationDetails neighborhoodOwner; AllocationDetails charity; uint256 totalSellerEarningsAmount; uint256 totalAdjustedRoyaltyAmount; } // Neighborhood struct struct neighborhood { uint256 tokenId; address nftOwner; uint256 commission; uint256 time; } struct nonNeighborhoodPostalCode { string country; string postalCode; } // allow country struct struct allowCountry { string country; } // store nft postal codes struct PostalCode { uint256 tokenId; string country; string postal; } // nft referral struct struct referral { uint256 _tokenId; uint256 price; address referr; uint256 mintTime; } // get minted nft type struct mintedType { string nfttype; uint256 tokenId; } // get marketplace trades within each neighborhood struct NeighborhoodHistory { uint256 tokenId; address NeiOwner; uint256 price; uint256 time; } // Neighborhood mint earnings event event NeighborhoodMintPercentage( uint256 indexed tokenId, address receiver, string postalcode, uint256 value, string status ); // Other royalties event event RoyaltyPercentage( address receiver, string status, uint256 value, uint256 indexed tokenId, string postalCode ); // Referral earnings event event ReferralPercentage( uint256 indexed tokenId, uint256 amount, address ref, string status ); // Minting secret key change event event MintingSecretKeyUpdated(string message); event RequireSecretKeyUpdated(bool isRequired); // Events for wallet address changes event WalletReceiverUpdated( string receiverType, address indexed newAddress ); // Percentage allocation change events event DefaultRoyaltyUpdated( address indexed newRoyaltyReceiver, uint256 newRoyaltyPercentage ); event MintingPercentageUpdated( string percentageType, uint256 newPercentage ); event MarketplacePercentageUpdated( string percentageType, uint256 newPercentage ); // Event for price changes event PriceUpdated(string nftType, uint256 newPrice); // Event for pause state changes event ContractPaused(bool isPaused); // Event for allowed postal codes or countries event AllowPostalCodesUpdated(string country); // mapping minted non neighborhoods country and postalcode mapping(uint256 => nonNeighborhoodPostalCode) public nonNeighborhoodPostalCodeMapping; // mapping Reserve balance mapping(string => mapping(string => uint256[])) private ReserveMapping; // mapping allow country mapping(string => allowCountry) private allowCountries; // mapping neighborhood mapping(uint256 => neighborhood) private neighborhoods; // mapping referral mapping(uint256 => referral) private referrals; // mapping nft postal code mapping(string => mapping(string => PostalCode)) public PostalCodes; // mapping mint struct to get nft type mapping(uint256 => mintedType) private minteds; // mapping neighborhood history mapping(uint256 => NeighborhoodHistory[]) private NeighborhoodHistorys; // nftPrices mapping(bytes32 => uint256) private nftPrices; constructor( address initialOwner, address payable _royaltyReceiver, address payable _ownerSubReceiver, address payable _refAndNeighborhoodReceiver, address payable _addressQuestReceiver, address payable _charityReceiver, address payable _marketplaceFeeReceiver, uint96 _royaltyFee // 1000 = 10% ) ERC721("EASNFT", "EAS") Ownable(initialOwner) ERC721URIStorage() ERC721Enumerable() { ownerSubReceiver = _ownerSubReceiver; refAndNeighborhoodReceiver = _refAndNeighborhoodReceiver; addressQuestReceiver = _addressQuestReceiver; charityReceiver = _charityReceiver; marketplaceFeeReceiver = _marketplaceFeeReceiver; if (_royaltyReceiver != address(0)) { _setDefaultRoyalty(_royaltyReceiver, _royaltyFee); royaltyReceiver = _royaltyReceiver; Royalty = _royaltyFee; } // Initialize NFT prices nftPrices[keccak256(bytes(Standard))] = 0.00001 ether; nftPrices[keccak256(bytes(Gold))] = 0.00001 ether; nftPrices[keccak256(bytes(Platinum))] = 0.00001 ether; nftPrices[keccak256(bytes(Charity))] = 0.00001 ether; nftPrices[keccak256(bytes(Neighborhood))] = 0.00001 ether; } // get nft mint price function getPrice(string memory nft_type) public view returns (uint256) { bytes32 nftHash = keccak256(bytes(nft_type)); if (nftPrices[nftHash] == 0) { revert NFT_PRICE_ZERO(); } return nftPrices[nftHash]; } // nft mint helper function function processToken( string memory nft_type, uint256 tokenId, string memory _country, string memory _postalCode ) internal { if (isNeighborhoodType(nft_type) && isAllowed(_country)) { if (postalCodeExists(_country, _postalCode)) { revert Postal_already_exists(); } addPostalCode(_country, _postalCode, tokenId); } } // Helper function to check if the NFT type is Neighborhood function isNeighborhoodType( string memory nft_type ) internal pure returns (bool) { return keccak256(bytes(nft_type)) == keccak256(bytes(Neighborhood)); } // Helper function to check if a postal code already exists for a specified country function postalCodeExists( string memory _country, string memory _postalCode ) internal view returns (bool) { return keccak256( abi.encodePacked(PostalCodes[_country][_postalCode].postal) ) == keccak256(bytes(_postalCode)); } // Helper function to add a new postal code function addPostalCode( string memory _country, string memory _postalCode, uint256 tokenId ) internal { PostalCodes[_country][_postalCode] = PostalCode( tokenId, _country, _postalCode ); } // check if country is true function isAllowed(string memory _country) internal view returns (bool) { // Ensure the country exists in the allowCountries mapping if (bytes(allowCountries[_country].country).length == 0) { return false; // Country is not in the allowed list } // Compare the keccak256 hashes of the country names return keccak256(bytes(allowCountries[_country].country)) == keccak256(bytes(_country)); } function isStandardGoldPlatinumCharity( string memory nft_type ) internal pure returns (bool) { return keccak256(bytes(nft_type)) == keccak256(bytes(Standard)) || keccak256(bytes(nft_type)) == keccak256(bytes(Gold)) || keccak256(bytes(nft_type)) == keccak256(bytes(Platinum)) || keccak256(bytes(nft_type)) == keccak256(bytes(Charity)); } // Helper function to calculate referral fee function calculateAndTransferReferralFee( address ref, uint256 msgValue, uint256 tokenId ) internal returns (uint256) { uint256 feeAmount = 0; if (ref != address(0)) { feeAmount = (msgValue * referralPercentage) / Fee_Denominator; payable(refAndNeighborhoodReceiver).transfer(feeAmount); emit ReferralPercentage( tokenId, feeAmount, refAndNeighborhoodReceiver, "Referral Percentage - Mints" ); } referrals[tokenId] = referral(tokenId, feeAmount, ref, block.timestamp); return feeAmount; } // Neighborhood owner mint earnings function handleNeighborhoodFee( string memory nftType, string memory _country, string memory _postalCode, uint256 _tokenId, uint256 msgValue ) internal returns (uint256) { uint256 neighborhoodFee = 0; if (isStandardGoldPlatinumCharity(nftType)) { nonNeighborhoodPostalCodeMapping[ _tokenId ] = nonNeighborhoodPostalCode(_country, _postalCode); neighborhoodFee = (msgValue * neighborhoodPercentageByMint) / Fee_Denominator; if (postalCodeExists(_country, _postalCode)) { payable(refAndNeighborhoodReceiver).transfer(neighborhoodFee); uint256 tokenId = PostalCodes[_country][_postalCode].tokenId; address tokenOwner = ownerOf(tokenId); neighborhoods[_tokenId] = neighborhood( _tokenId, tokenOwner, neighborhoodFee, block.timestamp ); emit NeighborhoodMintPercentage( _tokenId, tokenOwner, _postalCode, neighborhoodFee, "Neighborhood Percentage - Mints" ); } else { ReserveMapping[_country][_postalCode].push(neighborhoodFee); } } else { uint256 totalReserves = getReserves(_country, _postalCode); payable(refAndNeighborhoodReceiver).transfer(totalReserves); delete ReserveMapping[_country][_postalCode]; neighborhoods[_tokenId] = neighborhood( _tokenId, msg.sender, totalReserves, block.timestamp ); emit RoyaltyPercentage( msg.sender, "Reserved Neighborhood Percentage - Mints", totalReserves, _tokenId, _postalCode ); } return neighborhoodFee; } // Calculate and transfer charity fee function calculateAndTransferCharityFee( string memory nftType, uint256 msgValue, uint256 charityPercentage ) internal returns (uint256) { uint256 charityAmount = 0; if (keccak256(bytes(nftType)) == keccak256(bytes(Charity))) { charityAmount = (msgValue * charityPercentage) / Fee_Denominator; payable(charityReceiver).transfer(charityAmount); } return charityAmount; } // Calculate and transfer AddressQuest fee function calculateAndTransferAddressQuestFee( uint256 msgValue, uint256 AddressQuestPercentage ) internal returns (uint256) { uint256 addressQuestFee = (msgValue * AddressQuestPercentage) / Fee_Denominator; payable(addressQuestReceiver).transfer(addressQuestFee); return addressQuestFee; } // Main function function refAndWallet( address ref, string memory nftType, string memory _country, string memory _postalCode, uint256 _tokenId ) internal { uint256 msgValue = msg.value; uint256 feeAmount = calculateAndTransferReferralFee( ref, msgValue, _tokenId ); uint256 neighborhoodFee = handleNeighborhoodFee( nftType, _country, _postalCode, _tokenId, msgValue ); uint256 charityAmount = calculateAndTransferCharityFee( nftType, msgValue, charityPercentageByMint ); emit RoyaltyPercentage( charityReceiver, "Charity Percentage - Mints", charityAmount, _tokenId, _postalCode ); uint256 addressQuestFee = calculateAndTransferAddressQuestFee( msgValue, addressQuestPercentageByMint ); emit RoyaltyPercentage( addressQuestReceiver, "Address Quest Percentage - Mints", addressQuestFee, _tokenId, _postalCode ); uint256 transferAmount = msgValue - feeAmount - addressQuestFee - neighborhoodFee - charityAmount; payable(ownerSubReceiver).transfer(transferAmount); } // Store the minting hashed key bytes32 private mintingSecretKeyHash; // Toggle for requiring secret key bool public requireSecretKey = true; // Set, hash and store the secret key function setMintingSecretKey(string memory secretKey) external onlyOwner { mintingSecretKeyHash = keccak256(abi.encodePacked(secretKey)); emit MintingSecretKeyUpdated("Secret key updated"); } // Enable or disable secret key requirement function setRequireSecretKey(bool _require) external onlyOwner { requireSecretKey = _require; emit RequireSecretKeyUpdated(_require); } // External mint function function createToken( string memory URI, string memory nft_type, address ref, string memory _country, string memory _postalCode, string memory providedKey ) external payable returns (uint256) { require(!pause, "Contract paused"); require(msg.sender != ref, "Sender cannot refer themselves"); require(msg.value >= getPrice(nft_type), "Invalid type price"); if (requireSecretKey) { require( keccak256(abi.encodePacked(providedKey)) == mintingSecretKeyHash, "Invalid secret key" ); } uint256 tokenId = _nextTokenId.current(); // Process the token based on its type processToken(nft_type, tokenId, _country, _postalCode); // Calculate and transfer referral and sub wallet fees refAndWallet(ref, nft_type, _country, _postalCode, tokenId); minteds[tokenId] = mintedType(nft_type, tokenId); _safeMint(msg.sender, tokenId); _setTokenURI(tokenId, URI); _nextTokenId.increment(); return tokenId; } // get referrals by user address function getReferralsByAddress( address user ) external view returns (referral[] memory) { uint256 totalTokens = _nextTokenId.current(); uint256 userReferralsCount = 0; // Count the number of referrals for the user for (uint256 i = 0; i <= totalTokens; i++) { if (referrals[i].referr == user) { userReferralsCount++; } } // Create an array to store the user's referrals referral[] memory userReferrals = new referral[](userReferralsCount); uint256 index = 0; // Populate the user's referrals array for (uint256 i = 0; i <= totalTokens; i++) { if (referrals[i].referr == user) { userReferrals[index] = referrals[i]; index++; } } return userReferrals; } function getMintEarningsByNeighborhoodOwner( address user ) external view returns (neighborhood[] memory) { uint256 totalTokens = _nextTokenId.current(); uint256 userNeighborhoodsCount = 0; // Count the number of neighborhoods for the user for (uint256 i = 0; i <= totalTokens; i++) { if (neighborhoods[i].nftOwner == user) { userNeighborhoodsCount++; } } // Create an array to store the user's neighborhoods neighborhood[] memory userNeighborhoods = new neighborhood[]( userNeighborhoodsCount ); uint256 index = 0; // Populate the user's neighborhoods array for (uint256 i = 0; i <= totalTokens; i++) { if (neighborhoods[i].nftOwner == user) { userNeighborhoods[index] = neighborhoods[i]; index++; } } return userNeighborhoods; } // Function to set AllowPostalCode and update keys array function setAllowPostalCodes(string memory _country) external onlyOwner { require( keccak256(bytes(allowCountries[_country].country)) != keccak256(bytes(_country)), "Type already exists" ); allowCountries[_country] = allowCountry(_country); emit AllowPostalCodesUpdated(_country); } // Get Reserve balance by postalCode & country function getReserves( string memory country, string memory postalCode ) public view returns (uint256) { uint256[] memory reserves = ReserveMapping[country][postalCode]; uint256 total = 0; for (uint256 i = 0; i < reserves.length; i++) { total += reserves[i]; } return total; } // Set price by nft type function setPrice(string memory nft_type, uint256 price) public onlyOwner { if (price == 0) { revert PRICE_NOT_ZERO(); } nftPrices[keccak256(bytes(nft_type))] = price; emit PriceUpdated(nft_type, price); } // Set paused state with an event function setPaused(bool _paused) external onlyOwner { pause = _paused; emit ContractPaused(_paused); } // Set wallet addresses function setWalletReceiver( string calldata receiverType, address payable _address ) external onlyOwner { if (keccak256(bytes(receiverType)) == keccak256("Charity")) { charityReceiver = _address; } else if ( keccak256(bytes(receiverType)) == keccak256("AddressQuest") ) { addressQuestReceiver = _address; } else if (keccak256(bytes(receiverType)) == keccak256("OwnerSub")) { ownerSubReceiver = _address; } else if ( keccak256(bytes(receiverType)) == keccak256("ReferralAndNeighborhood") ) { refAndNeighborhoodReceiver = _address; } else if ( keccak256(bytes(receiverType)) == keccak256("MarketplaceFee") ) { marketplaceFeeReceiver = _address; } else { revert("Invalid receiver type"); } emit WalletReceiverUpdated(receiverType, _address); } // Set total royalty percentage function setDefaultRoyalty( address payable _royalty, uint256 _fee ) external onlyOwner { royaltyReceiver = _royalty; Royalty = _fee; emit DefaultRoyaltyUpdated(_royalty, _fee); } // Set minting percentages function setMintingPercentage( string calldata percentageType, uint256 _percentage ) external onlyOwner { if (keccak256(bytes(percentageType)) == keccak256("Referral")) { referralPercentage = _percentage; } else if ( keccak256(bytes(percentageType)) == keccak256("Neighborhood") ) { neighborhoodPercentageByMint = _percentage; } else if (keccak256(bytes(percentageType)) == keccak256("Charity")) { charityPercentageByMint = _percentage; } else if ( keccak256(bytes(percentageType)) == keccak256("AddressQuest") ) { addressQuestPercentageByMint = _percentage; } else { revert("Invalid percentage type"); } emit MintingPercentageUpdated(percentageType, _percentage); } // Set marketplace percentages function setMarketplacePercentage( string calldata percentageType, uint256 _percentage ) external onlyOwner { if (keccak256(bytes(percentageType)) == keccak256("Neighborhood")) { neighborhoodPercentageByMarketplace = _percentage; } else if (keccak256(bytes(percentageType)) == keccak256("Charity")) { charityPercentageByMarketplace = _percentage; } else if ( keccak256(bytes(percentageType)) == keccak256("AddressQuest") ) { addressQuestPercentageByMarketplace = _percentage; } else if ( keccak256(bytes(percentageType)) == keccak256("MarketplaceFee") ) { marketplaceFeePercentage = _percentage; } else { revert("Invalid percentage type"); } emit MarketplacePercentageUpdated(percentageType, _percentage); } // Disable default renounceOwnership function function renounceOwnership() public view override onlyOwner { revert("renounceOwnership is disabled"); } // Fetch the neighborhood owner by country and postal code function getNeighborhoodOwner( string memory country, string memory postalCode ) public view returns (address) { // Fetch the token ID from the PostalCodes mapping uint256 neighborhoodTokenId = PostalCodes[country][postalCode].tokenId; // If tokenId is 0, the Neighborhood NFT is not minted if (neighborhoodTokenId == 0) { return address(0); } // Otherwise, return the owner of the token return ownerOf(neighborhoodTokenId); } function calculateMarketplaceAllocations( uint256 price, string memory nftType, uint256 tokenId ) public view returns (MarketplaceAllocations memory) { // Initialize allocations struct MarketplaceAllocations memory allocations; // Marketplace Percentages allocations.royalty.percentage = Royalty; allocations.marketplaceFee.percentage = marketplaceFeePercentage; allocations .addressQuest .percentage = addressQuestPercentageByMarketplace; allocations .neighborhoodOwner .percentage = neighborhoodPercentageByMarketplace; allocations.charity.percentage = charityPercentageByMarketplace; // Marketplace Fee Allocation allocations.marketplaceFee.amount = (price * allocations.marketplaceFee.percentage) / Fee_Denominator; allocations.marketplaceFee.receiver = marketplaceFeeReceiver; // Address Quest Allocation allocations.addressQuest.amount = (price * allocations.addressQuest.percentage) / Fee_Denominator; allocations.addressQuest.receiver = addressQuestReceiver; // Neighborhood Owner Allocation allocations.neighborhoodOwner.amount = (price * allocations.neighborhoodOwner.percentage) / Fee_Denominator; // Fetch neighborhood owner receiver dynamically string memory country = nonNeighborhoodPostalCodeMapping[tokenId] .country; string memory postalCode = nonNeighborhoodPostalCodeMapping[tokenId] .postalCode; uint256 neighborhoodTokenId = PostalCodes[country][postalCode].tokenId; if (neighborhoodTokenId > 0) { allocations.neighborhoodOwner.receiver = ownerOf( neighborhoodTokenId ); } else { allocations.neighborhoodOwner.receiver = refAndNeighborhoodReceiver; // Use fallback wallet if no Neighborhood NFT owner } // Charity Allocation (only for Charity NFTs) allocations.charity.amount = 0; if (keccak256(bytes(nftType)) == keccak256(bytes(Charity))) { allocations.charity.amount = (price * allocations.charity.percentage) / Fee_Denominator; } allocations.charity.receiver = charityReceiver; // Royalty Allocation allocations.royalty.amount = (price * allocations.royalty.percentage) / Fee_Denominator; allocations.royalty.receiver = royaltyReceiver; // Adjusted Royalty allocations.totalAdjustedRoyaltyAmount = allocations.royalty.amount - (allocations.neighborhoodOwner.amount + allocations.addressQuest.amount + allocations.charity.amount); // Total Seller Earnings allocations.totalSellerEarningsAmount = price - (allocations.marketplaceFee.amount + allocations.royalty.amount); return allocations; } // Override the _increaseBalance function for ERC721Enumerable function _update( address to, uint256 tokenId, address auth ) internal override(ERC721, ERC721Enumerable) returns (address) { return super._update(to, tokenId, auth); } function _increaseBalance( address account, uint128 value ) internal override(ERC721, ERC721Enumerable) { super._increaseBalance(account, value); } function tokenURI( uint256 tokenId ) public view override(ERC721, ERC721URIStorage) returns (string memory) { return super.tokenURI(tokenId); } function supportsInterface( bytes4 interfaceId ) public view override(ERC721, ERC721Enumerable, ERC721URIStorage, ERC2981) returns (bool) { return super.supportsInterface(interfaceId); } }
Contract ABI
API[{"inputs":[{"internalType":"address","name":"initialOwner","type":"address"},{"internalType":"address payable","name":"_royaltyReceiver","type":"address"},{"internalType":"address payable","name":"_ownerSubReceiver","type":"address"},{"internalType":"address payable","name":"_refAndNeighborhoodReceiver","type":"address"},{"internalType":"address payable","name":"_addressQuestReceiver","type":"address"},{"internalType":"address payable","name":"_charityReceiver","type":"address"},{"internalType":"address payable","name":"_marketplaceFeeReceiver","type":"address"},{"internalType":"uint96","name":"_royaltyFee","type":"uint96"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"numerator","type":"uint256"},{"internalType":"uint256","name":"denominator","type":"uint256"}],"name":"ERC2981InvalidDefaultRoyalty","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC2981InvalidDefaultRoyaltyReceiver","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"numerator","type":"uint256"},{"internalType":"uint256","name":"denominator","type":"uint256"}],"name":"ERC2981InvalidTokenRoyalty","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC2981InvalidTokenRoyaltyReceiver","type":"error"},{"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":[],"name":"NFT_PRICE_ZERO","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"PRICE_NOT_ZERO","type":"error"},{"inputs":[],"name":"Postal_already_exists","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"country","type":"string"}],"name":"AllowPostalCodesUpdated","type":"event"},{"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":false,"internalType":"uint256","name":"_fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_toTokenId","type":"uint256"}],"name":"BatchMetadataUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"isPaused","type":"bool"}],"name":"ContractPaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newRoyaltyReceiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"newRoyaltyPercentage","type":"uint256"}],"name":"DefaultRoyaltyUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"percentageType","type":"string"},{"indexed":false,"internalType":"uint256","name":"newPercentage","type":"uint256"}],"name":"MarketplacePercentageUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"MetadataUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"percentageType","type":"string"},{"indexed":false,"internalType":"uint256","name":"newPercentage","type":"uint256"}],"name":"MintingPercentageUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"message","type":"string"}],"name":"MintingSecretKeyUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"string","name":"postalcode","type":"string"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"string","name":"status","type":"string"}],"name":"NeighborhoodMintPercentage","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":false,"internalType":"string","name":"nftType","type":"string"},{"indexed":false,"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"PriceUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"ref","type":"address"},{"indexed":false,"internalType":"string","name":"status","type":"string"}],"name":"ReferralPercentage","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"isRequired","type":"bool"}],"name":"RequireSecretKeyUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"string","name":"status","type":"string"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"postalCode","type":"string"}],"name":"RoyaltyPercentage","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"receiverType","type":"string"},{"indexed":true,"internalType":"address","name":"newAddress","type":"address"}],"name":"WalletReceiverUpdated","type":"event"},{"inputs":[],"name":"Fee_Denominator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"},{"internalType":"string","name":"","type":"string"}],"name":"PostalCodes","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"country","type":"string"},{"internalType":"string","name":"postal","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Royalty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"addressQuestPercentageByMarketplace","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"addressQuestPercentageByMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"string","name":"nftType","type":"string"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"calculateMarketplaceAllocations","outputs":[{"components":[{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"percentage","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"internalType":"struct EASNFT.AllocationDetails","name":"marketplaceFee","type":"tuple"},{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"percentage","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"internalType":"struct EASNFT.AllocationDetails","name":"royalty","type":"tuple"},{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"percentage","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"internalType":"struct EASNFT.AllocationDetails","name":"addressQuest","type":"tuple"},{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"percentage","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"internalType":"struct EASNFT.AllocationDetails","name":"neighborhoodOwner","type":"tuple"},{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"percentage","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"internalType":"struct EASNFT.AllocationDetails","name":"charity","type":"tuple"},{"internalType":"uint256","name":"totalSellerEarningsAmount","type":"uint256"},{"internalType":"uint256","name":"totalAdjustedRoyaltyAmount","type":"uint256"}],"internalType":"struct EASNFT.MarketplaceAllocations","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"charityPercentageByMarketplace","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"charityPercentageByMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"},{"internalType":"string","name":"nft_type","type":"string"},{"internalType":"address","name":"ref","type":"address"},{"internalType":"string","name":"_country","type":"string"},{"internalType":"string","name":"_postalCode","type":"string"},{"internalType":"string","name":"providedKey","type":"string"}],"name":"createToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getMintEarningsByNeighborhoodOwner","outputs":[{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"nftOwner","type":"address"},{"internalType":"uint256","name":"commission","type":"uint256"},{"internalType":"uint256","name":"time","type":"uint256"}],"internalType":"struct EASNFT.neighborhood[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"country","type":"string"},{"internalType":"string","name":"postalCode","type":"string"}],"name":"getNeighborhoodOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"nft_type","type":"string"}],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getReferralsByAddress","outputs":[{"components":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"address","name":"referr","type":"address"},{"internalType":"uint256","name":"mintTime","type":"uint256"}],"internalType":"struct EASNFT.referral[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"country","type":"string"},{"internalType":"string","name":"postalCode","type":"string"}],"name":"getReserves","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":[],"name":"marketplaceFeePercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"neighborhoodPercentageByMarketplace","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"neighborhoodPercentageByMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nonNeighborhoodPostalCodeMapping","outputs":[{"internalType":"string","name":"country","type":"string"},{"internalType":"string","name":"postalCode","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":"pause","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"referralPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[],"name":"requireSecretKey","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"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":"string","name":"_country","type":"string"}],"name":"setAllowPostalCodes","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":"address payable","name":"_royalty","type":"address"},{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"percentageType","type":"string"},{"internalType":"uint256","name":"_percentage","type":"uint256"}],"name":"setMarketplacePercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"percentageType","type":"string"},{"internalType":"uint256","name":"_percentage","type":"uint256"}],"name":"setMintingPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"secretKey","type":"string"}],"name":"setMintingSecretKey","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"nft_type","type":"string"},{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_require","type":"bool"}],"name":"setRequireSecretKey","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"receiverType","type":"string"},{"internalType":"address payable","name":"_address","type":"address"}],"name":"setWalletReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"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"}]
Contract Creation Code
60806040526010805460ff199081169091556101f460168190556103e860178190556018819055601955601a556064601b819055601c819055601d5560c8601e55602980549091166001179055348015610057575f80fd5b50604051614c45380380614c458339810160408190526100769161042b565b8760405180604001604052806006815260200165115054d3919560d21b8152506040518060400160405280600381526020016245415360e81b815250815f90816100c09190610579565b5060016100cd8282610579565b5050506001600160a01b0381166100fe57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b61010781610321565b50601280546001600160a01b03199081166001600160a01b038981169190911790925560138054821688841617905560118054821687841617905560108054610100600160a81b03191661010087851602179055601480549091168483161790558716156101a2576101798782610372565b601580546001600160a01b0319166001600160a01b0389161790556001600160601b0381166016555b505060408051808201825260088082526714dd185b99185c9960c21b6020928301526509184e72a0007f6fc372efc9c32b6a43ca3a392342648600d6c72eedb6298e94e0b46b0e71687c81905583518085018552600481526311dbdb1960e21b908401527f3da5a42053653952494790df6477884500e6df183076a8fb88990ca6e3276ee68190558351808501855291825267506c6174696e756d60c01b918301919091527f734ad4bdf104838cb9a3e4542e2492c756fab4da665c542209e62e5fb53fd04d8190558251808401845260078152664368617269747960c81b908301527fe32581c28769108691a12c0fb4f389de5194ff2aad0ff73af61238e5415fec5f8190558251808401909352600c83526b13995a59da189bdc9a1bdbd960a21b928201929092527f0e5cc181a4df548e272355027274d70d002d8003f48075d7d564fd127d016bbe5f52602790527fdfca787160fd9c0bad660029d3eafbf2fb89d7e38acfd334835458b8e7e64f215550610633945050505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6127106001600160601b0382168110156103b157604051636f483d0960e01b81526001600160601b0383166004820152602481018290526044016100f5565b6001600160a01b0383166103da57604051635b6cc80560e11b81525f60048201526024016100f5565b50604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600855565b6001600160a01b0381168114610428575f80fd5b50565b5f805f805f805f80610100898b031215610443575f80fd5b885161044e81610414565b60208a015190985061045f81610414565b60408a015190975061047081610414565b60608a015190965061048181610414565b60808a015190955061049281610414565b60a08a01519094506104a381610414565b60c08a01519093506104b481610414565b60e08a01519092506001600160601b03811681146104d0575f80fd5b809150509295985092959890939650565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061050957607f821691505b60208210810361052757634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561057457805f5260205f20601f840160051c810160208510156105525750805b601f840160051c820191505b81811015610571575f815560010161055e565b50505b505050565b81516001600160401b03811115610592576105926104e1565b6105a6816105a084546104f5565b8461052d565b6020601f8211600181146105d8575f83156105c15750848201515b5f19600385901b1c1916600184901b178455610571565b5f84815260208120601f198516915b8281101561060757878501518255602094850194600190920191016105e7565b508482101561062457868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b614605806106405f395ff3fe6080604052600436106102d9575f3560e01c80637068ff1711610189578063b88d4fde116100d8578063e0df504c11610092578063e985e9c51161006d578063e985e9c5146108a3578063f1157c5b146108c2578063f2fde38b146108d5578063fa047031146108f4575f80fd5b8063e0df504c14610856578063e2d578191461086f578063e785ca8f14610884575f80fd5b8063b88d4fde14610797578063b8e0a9c1146107b6578063c142f678146107e4578063c87b56dd146107f9578063d8d045b414610818578063d8e9648614610837575f80fd5b80638a4e9a841161014357806396ea8b9c1161011e57806396ea8b9c14610722578063a22cb46514610737578063a70d8d9714610756578063abf152c31461076b575f80fd5b80638a4e9a84146106c45780638da5cb5b146106f157806395d89b411461070e575f80fd5b80637068ff171461062f57806370a082311461064e578063715018a61461066d5780637935d2f91461068157806382a9c55c146106965780638456cb59146106ab575f80fd5b80632bbe4eda116102455780634d32c3d8116101ff5780635a5fb72d116101da5780635a5fb72d146105bd5780635def9843146105dc5780636352211e146105f15780636abd3b0314610610575f80fd5b80634d32c3d8146105535780634f6ccce71461057f578063524f38891461059e575f80fd5b80632bbe4eda146104965780632f745c59146104c25780633dfda793146104e157806342842e0e1461050057806342966c681461051f5780634adadddf1461053e575f80fd5b806318160ddd1161029657806318160ddd146103c85780631b9d9a86146103e657806322e011921461040557806323b872dd14610424578063259718cd146104435780632a55205a14610458575f80fd5b806301ffc9a7146102dd57806306fdde0314610311578063081812fc14610332578063081b073d14610369578063095ea7b31461038a57806316c38b3c146103a9575b5f80fd5b3480156102e8575f80fd5b506102fc6102f736600461392b565b610909565b60405190151581526020015b60405180910390f35b34801561031c575f80fd5b50610325610919565b6040516103089190613974565b34801561033d575f80fd5b5061035161034c366004613986565b6109a8565b6040516001600160a01b039091168152602001610308565b348015610374575f80fd5b50610388610383366004613a44565b6109cf565b005b348015610395575f80fd5b506103886103a4366004613a99565b610a57565b3480156103b4575f80fd5b506103886103c3366004613ad2565b610a66565b3480156103d3575f80fd5b50600c545b604051908152602001610308565b3480156103f1575f80fd5b50610388610400366004613b28565b610aaf565b348015610410575f80fd5b5061038861041f366004613b7a565b610d0c565b34801561042f575f80fd5b5061038861043e366004613bbb565b610d8e565b34801561044e575f80fd5b506103d860185481565b348015610463575f80fd5b50610477610472366004613bf9565b610e17565b604080516001600160a01b039093168352602083019190915201610308565b3480156104a1575f80fd5b506104b56104b0366004613c19565b610ec3565b6040516103089190613c87565b3480156104cd575f80fd5b506103d86104dc366004613a99565b61129b565b3480156104ec575f80fd5b506103886104fb366004613a44565b6112fe565b34801561050b575f80fd5b5061038861051a366004613bbb565b6113f0565b34801561052a575f80fd5b50610388610539366004613986565b61140f565b348015610549575f80fd5b506103d8601e5481565b34801561055e575f80fd5b5061057261056d366004613d03565b61141a565b6040516103089190613d1e565b34801561058a575f80fd5b506103d8610599366004613986565b6115b4565b3480156105a9575f80fd5b506103d86105b8366004613a44565b611609565b3480156105c8575f80fd5b506103886105d7366004613d81565b611655565b3480156105e7575f80fd5b506103d8601d5481565b3480156105fc575f80fd5b5061035161060b366004613986565b6117f2565b34801561061b575f80fd5b5061038861062a366004613ad2565b6117fc565b34801561063a575f80fd5b50610351610649366004613dc8565b611845565b348015610659575f80fd5b506103d8610668366004613d03565b6118a7565b348015610678575f80fd5b506103886118ec565b34801561068c575f80fd5b506103d8601b5481565b3480156106a1575f80fd5b506103d8601c5481565b3480156106b6575f80fd5b506010546102fc9060ff1681565b3480156106cf575f80fd5b506106e36106de366004613986565b61193c565b604051610308929190613e2b565b3480156106fc575f80fd5b506006546001600160a01b0316610351565b348015610719575f80fd5b50610325611a63565b34801561072d575f80fd5b506103d8601a5481565b348015610742575f80fd5b50610388610751366004613e58565b611a72565b348015610761575f80fd5b506103d860175481565b348015610776575f80fd5b5061078a610785366004613d03565b611a7d565b6040516103089190613e8b565b3480156107a2575f80fd5b506103886107b1366004613eee565b611c0c565b3480156107c1575f80fd5b506107d56107d0366004613dc8565b611c23565b60405161030893929190613f68565b3480156107ef575f80fd5b506103d861271081565b348015610804575f80fd5b50610325610813366004613986565b611d7a565b348015610823575f80fd5b50610388610832366004613a99565b611d85565b348015610842575f80fd5b506103d8610851366004613dc8565b611de7565b348015610861575f80fd5b506029546102fc9060ff1681565b34801561087a575f80fd5b506103d860195481565b34801561088f575f80fd5b5061038861089e366004613d81565b611eb0565b3480156108ae575f80fd5b506102fc6108bd366004613f92565b611ff4565b6103d86108d0366004613fc9565b612021565b3480156108e0575f80fd5b506103886108ef366004613d03565b612213565b3480156108ff575f80fd5b506103d860165481565b5f61091382612250565b92915050565b60605f8054610927906140b6565b80601f0160208091040260200160405190810160405280929190818152602001828054610953906140b6565b801561099e5780601f106109755761010080835404028352916020019161099e565b820191905f5260205f20905b81548152906001019060200180831161098157829003601f168201915b5050505050905090565b5f6109b282612274565b505f828152600460205260409020546001600160a01b0316610913565b6109d76122ac565b806040516020016109e89190614105565b60408051808303601f1901815282825280516020918201206028558083526012908301527114d958dc995d081ad95e481d5c19185d195960721b908201527fbc981a904a21b57465cad177e02dcae8651e114ef2c24303bb99126d61f48bcf906060015b60405180910390a150565b610a628282336122db565b5050565b610a6e6122ac565b6010805460ff19168215159081179091556040519081527f752d7e161ff5146f80e3820893176eb40532811e5e20400dfdde57455213706a90602001610a4c565b610ab76122ac565b5f805160206145b08339815191528383604051610ad5929190614110565b604051809103902003610b075760108054610100600160a81b0319166101006001600160a01b03841602179055610cc4565b7fca726c75c3176cdff957e369afce8fbbddd029aa4c11c513ec80ece028812ac88383604051610b38929190614110565b604051809103902003610b6557601180546001600160a01b0319166001600160a01b038316179055610cc4565b7fb2b61b3035682017dad5879a24a93538ed4bf17784cd42dca1a8fc031558709a8383604051610b96929190614110565b604051809103902003610bc357601280546001600160a01b0319166001600160a01b038316179055610cc4565b7f4796efb3b2ff2c4dd729b3a2bca4e4d92d31695dbf0b3d6bb56ecd5a1d7630b68383604051610bf4929190614110565b604051809103902003610c2157601380546001600160a01b0319166001600160a01b038316179055610cc4565b7f300b632acdbe1d6b304df50a250f2c5be839a725b279b899bf8579338a0b43548383604051610c52929190614110565b604051809103902003610c7f57601480546001600160a01b0319166001600160a01b038316179055610cc4565b60405162461bcd60e51b8152602060048201526015602482015274496e76616c6964207265636569766572207479706560581b60448201526064015b60405180910390fd5b806001600160a01b03167f41a354dc568ad8a664ff546822a040be3448b2abba534eb4cbdb9bd85f9c507d8484604051610cff929190614147565b60405180910390a2505050565b610d146122ac565b805f03610d34576040516316ee6b2560e01b815260040160405180910390fd5b8060275f848051906020012081526020019081526020015f20819055507f159e83f4712ba2552e68be9d848e49bf6dd35c24f19564ffd523b6549450a2f48282604051610d8292919061415a565b60405180910390a15050565b6001600160a01b038216610db757604051633250574960e11b81525f6004820152602401610cbb565b5f610dc38383336122e8565b9050836001600160a01b0316816001600160a01b031614610e11576040516364283d7b60e01b81526001600160a01b0380861660048301526024820184905282166044820152606401610cbb565b50505050565b5f8281526009602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291610e8b5750604080518082019091526008546001600160a01b0381168252600160a01b90046001600160601b031660208201525b60208101515f9061271090610ea9906001600160601b03168761418f565b610eb391906141a6565b91519350909150505b9250929050565b610ecb613863565b610ed3613863565b601654602080830151810191909152601e548251820152601d546040830151820152601b546060830151820152601c5460808301518201528151015161271090610f1d908761418f565b610f2791906141a6565b81515260145481516001600160a01b039091166040918201528101516020015161271090610f55908761418f565b610f5f91906141a6565b604080830180519290925260115491516001600160a01b0390921691015260608101516020015161271090610f94908761418f565b610f9e91906141a6565b6060820151525f838152601f602052604081208054610fbc906140b6565b80601f0160208091040260200160405190810160405280929190818152602001828054610fe8906140b6565b80156110335780601f1061100a57610100808354040283529160200191611033565b820191905f5260205f20905b81548152906001019060200180831161101657829003601f168201915b505050505090505f601f5f8681526020019081526020015f20600101805461105a906140b6565b80601f0160208091040260200160405190810160405280929190818152602001828054611086906140b6565b80156110d15780601f106110a8576101008083540402835291602001916110d1565b820191905f5260205f20905b8154815290600101906020018083116110b457829003601f168201915b505050505090505f6024836040516110e99190614105565b9081526020016040518091039020826040516111059190614105565b908152604051908190036020019020549050801561114157611126816117f2565b60608501516001600160a01b0390911660409091015261115b565b60135460608501516001600160a01b039091166040909101525b60808401515f90526040805180820190915260078152664368617269747960c81b6020918201528751908801207fcbf5b52c339091da20d61f61fdbc072a8502257f6ba630c8b646d18e7c1be6d9016111d657612710846080015160200151896111c5919061418f565b6111cf91906141a6565b6080850151525b60105460808501516101009091046001600160a01b0316604090910152602080850151015161271090611209908a61418f565b61121391906141a6565b6020850180519190915260155490516001600160a01b03909116604091820152608085015151908501515160608601515161124e91906141c5565b61125891906141c5565b60208501515161126891906141d8565b60c085015260208401515184515161128091906141c5565b61128a90896141d8565b60a085015250919695505050505050565b5f6112a5836118a7565b82106112d65760405163295f44f760e21b81526001600160a01b038416600482015260248101839052604401610cbb565b506001600160a01b03919091165f908152600a60209081526040808320938352929052205490565b6113066122ac565b808051906020012060218260405161131e9190614105565b90815260405190819003602001812061133691614259565b6040518091039020036113815760405162461bcd60e51b81526020600482015260136024820152725479706520616c72656164792065786973747360681b6044820152606401610cbb565b6040518060200160405280828152506021826040516113a09190614105565b908152604051908190036020019020815181906113bd90826142a8565b509050507fe2fbfe6695d404a744755ff1f49addb3508ff045d8ed7d39c117e2a7f31f894a81604051610a4c9190613974565b61140a83838360405180602001604052805f815250611c0c565b505050565b610a625f82336122e8565b60605f611426600e5490565b90505f805b828111611475575f818152602360205260409020600201546001600160a01b03808716911603611463578161145f81614362565b9250505b8061146d81614362565b91505061142b565b505f816001600160401b0381111561148f5761148f61399d565b6040519080825280602002602001820160405280156114f057816020015b6114dd60405180608001604052805f81526020015f81526020015f6001600160a01b031681526020015f81525090565b8152602001906001900390816114ad5790505b5090505f805b8481116115a9575f818152602360205260409020600201546001600160a01b03808916911603611597575f8181526023602090815260409182902082516080810184528154815260018201549281019290925260028101546001600160a01b0316928201929092526003909101546060820152835184908490811061157d5761157d61437a565b6020026020010181905250818061159390614362565b9250505b806115a181614362565b9150506114f6565b509095945050505050565b5f6115be600c5490565b82106115e65760405163295f44f760e21b81525f600482015260248101839052604401610cbb565b600c82815481106115f9576115f961437a565b905f5260205f2001549050919050565b80516020808301919091205f8181526027909252604082205482036116415760405163da17e8a160e01b815260040160405180910390fd5b5f9081526027602052604090205492915050565b61165d6122ac565b7fe0e014595d25934312f781a2f6c17595fb4a02c46a7e480de1ede5b709831991838360405161168e929190614110565b6040518091039020036116a557601a8190556117b2565b7f0e5cc181a4df548e272355027274d70d002d8003f48075d7d564fd127d016bbe83836040516116d6929190614110565b6040518091039020036116ed5760178190556117b2565b5f805160206145b0833981519152838360405161170b929190614110565b6040518091039020036117225760188190556117b2565b7fca726c75c3176cdff957e369afce8fbbddd029aa4c11c513ec80ece028812ac88383604051611753929190614110565b60405180910390200361176a5760198190556117b2565b60405162461bcd60e51b815260206004820152601760248201527f496e76616c69642070657263656e7461676520747970650000000000000000006044820152606401610cbb565b7f45bae9443a6a4d06cef70e32bdffb2db346170df6d5949863bb72c81d20ddc528383836040516117e59392919061438e565b60405180910390a1505050565b5f61091382612274565b6118046122ac565b6029805460ff19168215159081179091556040519081527fde1e4d805677ebcb833a9fa414d7616240d7f615fa277418eb158e24f291108590602001610a4c565b5f806024846040516118579190614105565b9081526020016040518091039020836040516118739190614105565b90815260200160405180910390205f01549050805f03611896575f915050610913565b61189f816117f2565b949350505050565b5f6001600160a01b0382166118d1576040516322718ad960e21b81525f6004820152602401610cbb565b506001600160a01b03165f9081526003602052604090205490565b6118f46122ac565b60405162461bcd60e51b815260206004820152601d60248201527f72656e6f756e63654f776e6572736869702069732064697361626c65640000006044820152606401610cbb565b601f6020525f9081526040902080548190611956906140b6565b80601f0160208091040260200160405190810160405280929190818152602001828054611982906140b6565b80156119cd5780601f106119a4576101008083540402835291602001916119cd565b820191905f5260205f20905b8154815290600101906020018083116119b057829003601f168201915b5050505050908060010180546119e2906140b6565b80601f0160208091040260200160405190810160405280929190818152602001828054611a0e906140b6565b8015611a595780601f10611a3057610100808354040283529160200191611a59565b820191905f5260205f20905b815481529060010190602001808311611a3c57829003601f168201915b5050505050905082565b606060018054610927906140b6565b610a623383836122f4565b60605f611a89600e5490565b90505f805b828111611ad8575f818152602260205260409020600101546001600160a01b03808716911603611ac65781611ac281614362565b9250505b80611ad081614362565b915050611a8e565b505f816001600160401b03811115611af257611af261399d565b604051908082528060200260200182016040528015611b5357816020015b611b4060405180608001604052805f81526020015f6001600160a01b031681526020015f81526020015f81525090565b815260200190600190039081611b105790505b5090505f805b8481116115a9575f818152602260205260409020600101546001600160a01b03808916911603611bfa575f8181526022602090815260409182902082516080810184528154815260018201546001600160a01b03169281019290925260028101549282019290925260039091015460608201528351849084908110611be057611be061437a565b60200260200101819052508180611bf690614362565b9250505b80611c0481614362565b915050611b59565b611c17848484610d8e565b610e1184848484612392565b8151602081840181018051602482529282019482019490942091909352815180830184018051928152908401929093019190912091528054600182018054919291611c6d906140b6565b80601f0160208091040260200160405190810160405280929190818152602001828054611c99906140b6565b8015611ce45780601f10611cbb57610100808354040283529160200191611ce4565b820191905f5260205f20905b815481529060010190602001808311611cc757829003601f168201915b505050505090806002018054611cf9906140b6565b80601f0160208091040260200160405190810160405280929190818152602001828054611d25906140b6565b8015611d705780601f10611d4757610100808354040283529160200191611d70565b820191905f5260205f20905b815481529060010190602001808311611d5357829003601f168201915b5050505050905083565b6060610913826124b8565b611d8d6122ac565b601580546001600160a01b0319166001600160a01b03841690811790915560168290556040518281527f5ba7b74d84f5acf3db282044fe19f114c13c57cd592cbe0931b18cde4bfe61019060200160405180910390a25050565b5f80602084604051611df99190614105565b908152602001604051809103902083604051611e159190614105565b9081526040805191829003602090810183208054808302850183019093528284529190830182828015611e6557602002820191905f5260205f20905b815481526020019060010190808311611e51575b505050505090505f805b8251811015611ea757828181518110611e8a57611e8a61437a565b602002602001015182611e9d91906141c5565b9150600101611e6f565b50949350505050565b611eb86122ac565b7f0e5cc181a4df548e272355027274d70d002d8003f48075d7d564fd127d016bbe8383604051611ee9929190614110565b604051809103902003611f0057601b819055611fc1565b5f805160206145b08339815191528383604051611f1e929190614110565b604051809103902003611f3557601c819055611fc1565b7fca726c75c3176cdff957e369afce8fbbddd029aa4c11c513ec80ece028812ac88383604051611f66929190614110565b604051809103902003611f7d57601d819055611fc1565b7f300b632acdbe1d6b304df50a250f2c5be839a725b279b899bf8579338a0b43548383604051611fae929190614110565b60405180910390200361176a57601e8190555b7fe4c34095ab53e8f7db8cd9b04c116d4920dd5ac9939d0650884d9ee7c005a4ea8383836040516117e59392919061438e565b6001600160a01b039182165f90815260056020908152604080832093909416825291909152205460ff1690565b6010545f9060ff16156120685760405162461bcd60e51b815260206004820152600f60248201526e10dbdb9d1c9858dd081c185d5cd959608a1b6044820152606401610cbb565b6001600160a01b03851633036120c05760405162461bcd60e51b815260206004820152601e60248201527f53656e6465722063616e6e6f74207265666572207468656d73656c76657300006044820152606401610cbb565b6120c986611609565b34101561210d5760405162461bcd60e51b8152602060048201526012602482015271496e76616c6964207479706520707269636560701b6044820152606401610cbb565b60295460ff1615612184576028548260405160200161212c9190614105565b60405160208183030381529060405280519060200120146121845760405162461bcd60e51b8152602060048201526012602482015271496e76616c696420736563726574206b657960701b6044820152606401610cbb565b5f61218e600e5490565b905061219c878287876125bb565b6121a9868887878561264f565b60408051808201825288815260208082018490525f848152602590915291909120815181906121d890826142a8565b50602082015181600101559050506121f0338261279c565b6121fa81896127b5565b612208600e80546001019055565b979650505050505050565b61221b6122ac565b6001600160a01b03811661224457604051631e4fbdf760e01b81525f6004820152602401610cbb565b61224d816127fd565b50565b5f6001600160e01b0319821663780e9d6360e01b148061091357506109138261284e565b5f818152600260205260408120546001600160a01b03168061091357604051637e27328960e01b815260048101849052602401610cbb565b6006546001600160a01b031633146122d95760405163118cdaa760e01b8152336004820152602401610cbb565b565b61140a8383836001612872565b5f61189f848484612976565b6001600160a01b03821661232657604051630b61174360e31b81526001600160a01b0383166004820152602401610cbb565b6001600160a01b038381165f81815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0383163b15610e1157604051630a85bd0160e11b81526001600160a01b0384169063150b7a02906123d49033908890879087906004016143b1565b6020604051808303815f875af192505050801561240e575060408051601f3d908101601f1916820190925261240b918101906143e3565b60015b612475573d80801561243b576040519150601f19603f3d011682016040523d82523d5f602084013e612440565b606091505b5080515f0361246d57604051633250574960e11b81526001600160a01b0385166004820152602401610cbb565b805181602001fd5b6001600160e01b03198116630a85bd0160e11b146124b157604051633250574960e11b81526001600160a01b0385166004820152602401610cbb565b5050505050565b60606124c382612274565b505f82815260076020526040812080546124dc906140b6565b80601f0160208091040260200160405190810160405280929190818152602001828054612508906140b6565b80156125535780601f1061252a57610100808354040283529160200191612553565b820191905f5260205f20905b81548152906001019060200180831161253657829003601f168201915b505050505090505f61256f60408051602081019091525f815290565b905080515f03612580575092915050565b8151156125b257808260405160200161259a9291906143fe565b60405160208183030381529060405292505050919050565b61189f84612a41565b60408051808201909152600c81526b13995a59da189bdc9a1bdbd960a21b6020918201528451908501207f0e5cc181a4df548e272355027274d70d002d8003f48075d7d564fd127d016bbe148015612617575061261782612ab2565b15610e11576126268282612b2c565b15612644576040516346e07e9160e01b815260040160405180910390fd5b610e11828285612ba1565b345f61265c878385612c2c565b90505f61266c8787878787612d80565b90505f61267c88856018546130bd565b9050847f32ecfe2224ee52942615611c93760cc5af94a834542129acaa47dc8c8a858fc0601060019054906101000a90046001600160a01b031683896040516126c793929190614412565b60405180910390a25f6126dc85601954613160565b60115460405191925087917f32ecfe2224ee52942615611c93760cc5af94a834542129acaa47dc8c8a858fc091612722916001600160a01b039091169085908c9061446c565b60405180910390a25f828483612738888a6141d8565b61274291906141d8565b61274c91906141d8565b61275691906141d8565b6012546040519192506001600160a01b03169082156108fc029083905f818181858888f1935050505015801561278e573d5f803e3d5ffd5b505050505050505050505050565b610a62828260405180602001604052805f8152506131b9565b5f8281526007602052604090206127cc82826142a8565b506040518281527ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce790602001610d82565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f6001600160e01b0319821663152a902d60e11b14806109135750610913826131cf565b808061288657506001600160a01b03821615155b15612947575f61289584612274565b90506001600160a01b038316158015906128c15750826001600160a01b0316816001600160a01b031614155b80156128d457506128d28184611ff4565b155b156128fd5760405163a9fbf51f60e01b81526001600160a01b0384166004820152602401610cbb565b81156129455783856001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b50505f90815260046020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b5f806129838585856131f3565b90506001600160a01b0381166129df576129da84600c80545f838152600d60205260408120829055600182018355919091527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c70155565b612a02565b846001600160a01b0316816001600160a01b031614612a0257612a0281856132e5565b6001600160a01b038516612a1e57612a1984613372565b61189f565b846001600160a01b0316816001600160a01b03161461189f5761189f8585613419565b6060612a4c82612274565b505f612a6260408051602081019091525f815290565b90505f815111612a805760405180602001604052805f815250612aab565b80612a8a84613467565b604051602001612a9b9291906143fe565b6040516020818303038152906040525b9392505050565b5f602182604051612ac39190614105565b9081526040519081900360200190208054612add906140b6565b90505f03612aec57505f919050565b8180519060200120602183604051612b049190614105565b908152604051908190036020018120612b1c91614259565b6040518091039020149050919050565b5f8180519060200120602484604051612b459190614105565b908152602001604051809103902083604051612b619190614105565b9081526020016040518091039020600201604051602001612b829190614259565b6040516020818303038152906040528051906020012014905092915050565b604051806060016040528082815260200184815260200183815250602484604051612bcc9190614105565b908152602001604051809103902083604051612be89190614105565b9081526040516020918190038201902082518155908201516001820190612c0f90826142a8565b5060408201516002820190612c2490826142a8565b505050505050565b5f806001600160a01b03851615612d0f57612710601a5485612c4e919061418f565b612c5891906141a6565b6013546040519192506001600160a01b03169082156108fc029083905f818181858888f19350505050158015612c90573d5f803e3d5ffd5b50601354604080518381526001600160a01b0390921660208301526060908201819052601b908201527f526566657272616c2050657263656e74616765202d204d696e74730000000000608082015283907f226091fbfe2217ec51438ad6c779ed0f2857c14d764f206397758bf662195f9b9060a00160405180910390a25b6040805160808101825284815260208082018481526001600160a01b0398891683850190815242606085019081525f988952602390935293909620915182559451600182015590516002820180546001600160a01b0319169190971617909555915160039094019390935592915050565b5f80612d8b876134f6565b15612f845760408051808201825287815260208082018890525f878152601f9091529190912081518190612dbf90826142a8565b5060208201516001820190612dd490826142a8565b50506017546127109150612de8908561418f565b612df291906141a6565b9050612dfe8686612b2c565b15612f30576013546040516001600160a01b039091169082156108fc029083905f818181858888f19350505050158015612e3a573d5f803e3d5ffd5b505f602487604051612e4c9190614105565b908152602001604051809103902086604051612e689190614105565b9081526040519081900360200190205490505f612e84826117f2565b604080516080810182528881526001600160a01b03838116602080840191825283850189815242606086019081525f8e81526022909352918690209451855591516001850180546001600160a01b0319169190941617909255516002830155516003909101555190915086907f329954af30b4205993e8f74fdb9ba7dc953195af335a0c799abe9636f4634f9c90612f219084908b9088906144c6565b60405180910390a250506130b3565b602086604051612f409190614105565b908152602001604051809103902085604051612f5c9190614105565b9081526040516020918190038201902080546001810182555f918252919020018190556130b3565b5f612f8f8787611de7565b6013546040519192506001600160a01b03169082156108fc029083905f818181858888f19350505050158015612fc7573d5f803e3d5ffd5b50602087604051612fd89190614105565b908152602001604051809103902086604051612ff49190614105565b90815260200160405180910390205f61300d91906138bc565b6040805160808101825286815233602080830182815283850186815242606086019081525f8c81526022909452928690209451855590516001850180546001600160a01b0319166001600160a01b0390921691909117905551600284015551600390920191909155905186917f32ecfe2224ee52942615611c93760cc5af94a834542129acaa47dc8c8a858fc0916130a9919085908b90614530565b60405180910390a2505b9695505050505050565b6040805180820190915260078152664368617269747960c81b6020918201528351908401205f9081907fcbf5b52c339091da20d61f61fdbc072a8502257f6ba630c8b646d18e7c1be6d90161189f57612710613119848661418f565b61312391906141a6565b60105460405191925061010090046001600160a01b0316906108fc8315029083905f818181858888f19350505050158015611ea7573d5f803e3d5ffd5b5f8061271061316f848661418f565b61317991906141a6565b6011546040519192506001600160a01b03169082156108fc029083905f818181858888f193505050501580156131b1573d5f803e3d5ffd5b509392505050565b6131c38383613617565b61140a5f848484612392565b5f6001600160e01b03198216632483248360e11b1480610913575061091382613678565b5f828152600260205260408120546001600160a01b039081169083161561321f5761321f8184866136c7565b6001600160a01b038116156132595761323a5f855f80612872565b6001600160a01b0381165f90815260036020526040902080545f190190555b6001600160a01b03851615613287576001600160a01b0385165f908152600360205260409020805460010190555b5f8481526002602052604080822080546001600160a01b0319166001600160a01b0389811691821790925591518793918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4949350505050565b5f6132ef836118a7565b5f838152600b6020526040902054909150808214613340576001600160a01b0384165f908152600a602090815260408083208584528252808320548484528184208190558352600b90915290208190555b505f918252600b602090815260408084208490556001600160a01b039094168352600a81528383209183525290812055565b600c545f90613383906001906141d8565b5f838152600d6020526040812054600c80549394509092849081106133aa576133aa61437a565b905f5260205f200154905080600c83815481106133c9576133c961437a565b5f918252602080832090910192909255828152600d9091526040808220849055858252812055600c8054806134005761340061459b565b600190038181905f5260205f20015f9055905550505050565b5f6001613425846118a7565b61342f91906141d8565b6001600160a01b039093165f908152600a602090815260408083208684528252808320859055938252600b9052919091209190915550565b60605f6134738361372b565b60010190505f816001600160401b038111156134915761349161399d565b6040519080825280601f01601f1916602001820160405280156134bb576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846134c557509392505050565b60408051808201909152600881526714dd185b99185c9960c21b6020918201528151908201205f907f719b9449dc4fc1dca2b4b492f922c355b93c8f42d375127999e6d898029a4158148061358b575060408051808201909152600481526311dbdb1960e21b6020918201528251908301207f6f0d47b12e2c2f7083eb5622541f9c3930e56fc3e46e89e132673f05a079baff145b806135da5750604080518082019091526008815267506c6174696e756d60c01b6020918201528251908301207fecadc0d3992a7a94d19327888a16aecb280514d608e8377a0d15dcf293020373145b806109135750506040805180820190915260078152664368617269747960c81b60209182015281519101205f805160206145b08339815191521490565b6001600160a01b03821661364057604051633250574960e11b81525f6004820152602401610cbb565b5f61364c83835f6122e8565b90506001600160a01b0381161561140a576040516339e3563760e11b81525f6004820152602401610cbb565b5f6001600160e01b031982166380ac58cd60e01b14806136a857506001600160e01b03198216635b5e139f60e01b145b8061091357506301ffc9a760e01b6001600160e01b0319831614610913565b6136d2838383613802565b61140a576001600160a01b03831661370057604051637e27328960e01b815260048101829052602401610cbb565b60405163177e802f60e01b81526001600160a01b038316600482015260248101829052604401610cbb565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106137695772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310613795576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106137b357662386f26fc10000830492506010015b6305f5e10083106137cb576305f5e100830492506008015b61271083106137df57612710830492506004015b606483106137f1576064830492506002015b600a83106109135760010192915050565b5f6001600160a01b0383161580159061189f5750826001600160a01b0316846001600160a01b0316148061383b575061383b8484611ff4565b8061189f5750505f908152600460205260409020546001600160a01b03908116911614919050565b6040518060e001604052806138766138d7565b81526020016138836138d7565b81526020016138906138d7565b815260200161389d6138d7565b81526020016138aa6138d7565b81526020015f81526020015f81525090565b5080545f8255905f5260205f209081019061224d91906138fe565b60405180606001604052805f81526020015f81526020015f6001600160a01b031681525090565b5b80821115613912575f81556001016138ff565b5090565b6001600160e01b03198116811461224d575f80fd5b5f6020828403121561393b575f80fd5b8135612aab81613916565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f612aab6020830184613946565b5f60208284031215613996575f80fd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b5f806001600160401b038411156139ca576139ca61399d565b50604051601f19601f85018116603f011681018181106001600160401b03821117156139f8576139f861399d565b604052838152905080828401851015613a0f575f80fd5b838360208301375f60208583010152509392505050565b5f82601f830112613a35575f80fd5b612aab838335602085016139b1565b5f60208284031215613a54575f80fd5b81356001600160401b03811115613a69575f80fd5b61189f84828501613a26565b6001600160a01b038116811461224d575f80fd5b8035613a9481613a75565b919050565b5f8060408385031215613aaa575f80fd5b8235613ab581613a75565b946020939093013593505050565b80358015158114613a94575f80fd5b5f60208284031215613ae2575f80fd5b612aab82613ac3565b5f8083601f840112613afb575f80fd5b5081356001600160401b03811115613b11575f80fd5b602083019150836020828501011115610ebc575f80fd5b5f805f60408486031215613b3a575f80fd5b83356001600160401b03811115613b4f575f80fd5b613b5b86828701613aeb565b9094509250506020840135613b6f81613a75565b809150509250925092565b5f8060408385031215613b8b575f80fd5b82356001600160401b03811115613ba0575f80fd5b613bac85828601613a26565b95602094909401359450505050565b5f805f60608486031215613bcd575f80fd5b8335613bd881613a75565b92506020840135613be881613a75565b929592945050506040919091013590565b5f8060408385031215613c0a575f80fd5b50508035926020909101359150565b5f805f60608486031215613c2b575f80fd5b8335925060208401356001600160401b03811115613c47575f80fd5b613c5386828701613a26565b93969395505050506040919091013590565b80518252602080820151908301526040908101516001600160a01b0316910152565b5f61022082019050613c9a828451613c65565b6020830151613cac6060840182613c65565b506040830151613cbf60c0840182613c65565b506060830151613cd3610120840182613c65565b506080830151613ce7610180840182613c65565b5060a08301516101e083015260c0909201516102009091015290565b5f60208284031215613d13575f80fd5b8135612aab81613a75565b602080825282518282018190525f918401906040840190835b818110156115a957835180518452602080820151818601526040808301516001600160a01b0316908601526060918201519185019190915290930192608090920191600101613d37565b5f805f60408486031215613d93575f80fd5b83356001600160401b03811115613da8575f80fd5b613db486828701613aeb565b909790965060209590950135949350505050565b5f8060408385031215613dd9575f80fd5b82356001600160401b03811115613dee575f80fd5b613dfa85828601613a26565b92505060208301356001600160401b03811115613e15575f80fd5b613e2185828601613a26565b9150509250929050565b604081525f613e3d6040830185613946565b8281036020840152613e4f8185613946565b95945050505050565b5f8060408385031215613e69575f80fd5b8235613e7481613a75565b9150613e8260208401613ac3565b90509250929050565b602080825282518282018190525f918401906040840190835b818110156115a9578351805184526020808201516001600160a01b031681860152604080830151908601526060918201519185019190915290930192608090920191600101613ea4565b5f805f8060808587031215613f01575f80fd5b8435613f0c81613a75565b93506020850135613f1c81613a75565b92506040850135915060608501356001600160401b03811115613f3d575f80fd5b8501601f81018713613f4d575f80fd5b613f5c878235602084016139b1565b91505092959194509250565b838152606060208201525f613f806060830185613946565b82810360408401526130b38185613946565b5f8060408385031215613fa3575f80fd5b8235613fae81613a75565b91506020830135613fbe81613a75565b809150509250929050565b5f805f805f8060c08789031215613fde575f80fd5b86356001600160401b03811115613ff3575f80fd5b613fff89828a01613a26565b96505060208701356001600160401b0381111561401a575f80fd5b61402689828a01613a26565b95505061403560408801613a89565b935060608701356001600160401b0381111561404f575f80fd5b61405b89828a01613a26565b93505060808701356001600160401b03811115614076575f80fd5b61408289828a01613a26565b92505060a08701356001600160401b0381111561409d575f80fd5b6140a989828a01613a26565b9150509295509295509295565b600181811c908216806140ca57607f821691505b6020821081036140e857634e487b7160e01b5f52602260045260245ffd5b50919050565b5f81518060208401855e5f93019283525090919050565b5f612aab82846140ee565b818382375f9101908152919050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b602081525f61189f60208301848661411f565b604081525f61416c6040830185613946565b90508260208301529392505050565b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176109135761091361417b565b5f826141c057634e487b7160e01b5f52601260045260245ffd5b500490565b808201808211156109135761091361417b565b818103818111156109135761091361417b565b5f81546141f7816140b6565b60018216801561420e576001811461422357614250565b60ff1983168652811515820286019350614250565b845f5260205f205f5b838110156142485781548882015260019091019060200161422c565b505081860193505b50505092915050565b5f612aab82846141eb565b601f82111561140a57805f5260205f20601f840160051c810160208510156142895750805b601f840160051c820191505b818110156124b1575f8155600101614295565b81516001600160401b038111156142c1576142c161399d565b6142d5816142cf84546140b6565b84614264565b6020601f821160018114614307575f83156142f05750848201515b5f19600385901b1c1916600184901b1784556124b1565b5f84815260208120601f198516915b828110156143365787850151825560209485019460019092019101614316565b508482101561435357868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f600182016143735761437361417b565b5060010190565b634e487b7160e01b5f52603260045260245ffd5b604081525f6143a160408301858761411f565b9050826020830152949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f906130b390830184613946565b5f602082840312156143f3575f80fd5b8151612aab81613916565b5f61189f61440c83866140ee565b846140ee565b60018060a01b038416815260806020820152601a60808201527f436861726974792050657263656e74616765202d204d696e747300000000000060a082015282604082015260c060608201525f613e4f60c0830184613946565b60018060a01b038416815260806020820152602060808201527f416464726573732051756573742050657263656e74616765202d204d696e747360a082015282604082015260c060608201525f613e4f60c0830184613946565b6001600160a01b03841681526080602082018190525f906144e990830185613946565b8360408401528281036060840152601f81527f4e65696768626f72686f6f642050657263656e74616765202d204d696e747300602082015260408101915050949350505050565b60018060a01b038416815260806020820152602860808201527f5265736572766564204e65696768626f72686f6f642050657263656e7461676560a082015267202d204d696e747360c01b60c082015282604082015260e060608201525f613e4f60e0830184613946565b634e487b7160e01b5f52603160045260245ffdfe340a4ad3cc6f6e25df29e09e0243f8d57afdda809459cf3749b92e7183e41927a26469706673582212205451ff620a98e7201c878d3ab96ea5cf229c559889f52bf153ae05b32b2f889064736f6c634300081a00330000000000000000000000008b7c077d98c2ab584c96572072699808118424f8000000000000000000000000516da7fb4ca43cb3b340cff111342f5920f043140000000000000000000000008b7c077d98c2ab584c96572072699808118424f8000000000000000000000000bf9db529729382f3d1e0c04dde54c61fc8d103c1000000000000000000000000ca1aeeb6515292cdc59f7efcf852563504c1079c000000000000000000000000de25e7d1250857d4e299c8353b8695a4329e467f0000000000000000000000004c0d856ae05f22715acda4103bf5762c4fb3ac1500000000000000000000000000000000000000000000000000000000000003e8
Deployed Bytecode
0x6080604052600436106102d9575f3560e01c80637068ff1711610189578063b88d4fde116100d8578063e0df504c11610092578063e985e9c51161006d578063e985e9c5146108a3578063f1157c5b146108c2578063f2fde38b146108d5578063fa047031146108f4575f80fd5b8063e0df504c14610856578063e2d578191461086f578063e785ca8f14610884575f80fd5b8063b88d4fde14610797578063b8e0a9c1146107b6578063c142f678146107e4578063c87b56dd146107f9578063d8d045b414610818578063d8e9648614610837575f80fd5b80638a4e9a841161014357806396ea8b9c1161011e57806396ea8b9c14610722578063a22cb46514610737578063a70d8d9714610756578063abf152c31461076b575f80fd5b80638a4e9a84146106c45780638da5cb5b146106f157806395d89b411461070e575f80fd5b80637068ff171461062f57806370a082311461064e578063715018a61461066d5780637935d2f91461068157806382a9c55c146106965780638456cb59146106ab575f80fd5b80632bbe4eda116102455780634d32c3d8116101ff5780635a5fb72d116101da5780635a5fb72d146105bd5780635def9843146105dc5780636352211e146105f15780636abd3b0314610610575f80fd5b80634d32c3d8146105535780634f6ccce71461057f578063524f38891461059e575f80fd5b80632bbe4eda146104965780632f745c59146104c25780633dfda793146104e157806342842e0e1461050057806342966c681461051f5780634adadddf1461053e575f80fd5b806318160ddd1161029657806318160ddd146103c85780631b9d9a86146103e657806322e011921461040557806323b872dd14610424578063259718cd146104435780632a55205a14610458575f80fd5b806301ffc9a7146102dd57806306fdde0314610311578063081812fc14610332578063081b073d14610369578063095ea7b31461038a57806316c38b3c146103a9575b5f80fd5b3480156102e8575f80fd5b506102fc6102f736600461392b565b610909565b60405190151581526020015b60405180910390f35b34801561031c575f80fd5b50610325610919565b6040516103089190613974565b34801561033d575f80fd5b5061035161034c366004613986565b6109a8565b6040516001600160a01b039091168152602001610308565b348015610374575f80fd5b50610388610383366004613a44565b6109cf565b005b348015610395575f80fd5b506103886103a4366004613a99565b610a57565b3480156103b4575f80fd5b506103886103c3366004613ad2565b610a66565b3480156103d3575f80fd5b50600c545b604051908152602001610308565b3480156103f1575f80fd5b50610388610400366004613b28565b610aaf565b348015610410575f80fd5b5061038861041f366004613b7a565b610d0c565b34801561042f575f80fd5b5061038861043e366004613bbb565b610d8e565b34801561044e575f80fd5b506103d860185481565b348015610463575f80fd5b50610477610472366004613bf9565b610e17565b604080516001600160a01b039093168352602083019190915201610308565b3480156104a1575f80fd5b506104b56104b0366004613c19565b610ec3565b6040516103089190613c87565b3480156104cd575f80fd5b506103d86104dc366004613a99565b61129b565b3480156104ec575f80fd5b506103886104fb366004613a44565b6112fe565b34801561050b575f80fd5b5061038861051a366004613bbb565b6113f0565b34801561052a575f80fd5b50610388610539366004613986565b61140f565b348015610549575f80fd5b506103d8601e5481565b34801561055e575f80fd5b5061057261056d366004613d03565b61141a565b6040516103089190613d1e565b34801561058a575f80fd5b506103d8610599366004613986565b6115b4565b3480156105a9575f80fd5b506103d86105b8366004613a44565b611609565b3480156105c8575f80fd5b506103886105d7366004613d81565b611655565b3480156105e7575f80fd5b506103d8601d5481565b3480156105fc575f80fd5b5061035161060b366004613986565b6117f2565b34801561061b575f80fd5b5061038861062a366004613ad2565b6117fc565b34801561063a575f80fd5b50610351610649366004613dc8565b611845565b348015610659575f80fd5b506103d8610668366004613d03565b6118a7565b348015610678575f80fd5b506103886118ec565b34801561068c575f80fd5b506103d8601b5481565b3480156106a1575f80fd5b506103d8601c5481565b3480156106b6575f80fd5b506010546102fc9060ff1681565b3480156106cf575f80fd5b506106e36106de366004613986565b61193c565b604051610308929190613e2b565b3480156106fc575f80fd5b506006546001600160a01b0316610351565b348015610719575f80fd5b50610325611a63565b34801561072d575f80fd5b506103d8601a5481565b348015610742575f80fd5b50610388610751366004613e58565b611a72565b348015610761575f80fd5b506103d860175481565b348015610776575f80fd5b5061078a610785366004613d03565b611a7d565b6040516103089190613e8b565b3480156107a2575f80fd5b506103886107b1366004613eee565b611c0c565b3480156107c1575f80fd5b506107d56107d0366004613dc8565b611c23565b60405161030893929190613f68565b3480156107ef575f80fd5b506103d861271081565b348015610804575f80fd5b50610325610813366004613986565b611d7a565b348015610823575f80fd5b50610388610832366004613a99565b611d85565b348015610842575f80fd5b506103d8610851366004613dc8565b611de7565b348015610861575f80fd5b506029546102fc9060ff1681565b34801561087a575f80fd5b506103d860195481565b34801561088f575f80fd5b5061038861089e366004613d81565b611eb0565b3480156108ae575f80fd5b506102fc6108bd366004613f92565b611ff4565b6103d86108d0366004613fc9565b612021565b3480156108e0575f80fd5b506103886108ef366004613d03565b612213565b3480156108ff575f80fd5b506103d860165481565b5f61091382612250565b92915050565b60605f8054610927906140b6565b80601f0160208091040260200160405190810160405280929190818152602001828054610953906140b6565b801561099e5780601f106109755761010080835404028352916020019161099e565b820191905f5260205f20905b81548152906001019060200180831161098157829003601f168201915b5050505050905090565b5f6109b282612274565b505f828152600460205260409020546001600160a01b0316610913565b6109d76122ac565b806040516020016109e89190614105565b60408051808303601f1901815282825280516020918201206028558083526012908301527114d958dc995d081ad95e481d5c19185d195960721b908201527fbc981a904a21b57465cad177e02dcae8651e114ef2c24303bb99126d61f48bcf906060015b60405180910390a150565b610a628282336122db565b5050565b610a6e6122ac565b6010805460ff19168215159081179091556040519081527f752d7e161ff5146f80e3820893176eb40532811e5e20400dfdde57455213706a90602001610a4c565b610ab76122ac565b5f805160206145b08339815191528383604051610ad5929190614110565b604051809103902003610b075760108054610100600160a81b0319166101006001600160a01b03841602179055610cc4565b7fca726c75c3176cdff957e369afce8fbbddd029aa4c11c513ec80ece028812ac88383604051610b38929190614110565b604051809103902003610b6557601180546001600160a01b0319166001600160a01b038316179055610cc4565b7fb2b61b3035682017dad5879a24a93538ed4bf17784cd42dca1a8fc031558709a8383604051610b96929190614110565b604051809103902003610bc357601280546001600160a01b0319166001600160a01b038316179055610cc4565b7f4796efb3b2ff2c4dd729b3a2bca4e4d92d31695dbf0b3d6bb56ecd5a1d7630b68383604051610bf4929190614110565b604051809103902003610c2157601380546001600160a01b0319166001600160a01b038316179055610cc4565b7f300b632acdbe1d6b304df50a250f2c5be839a725b279b899bf8579338a0b43548383604051610c52929190614110565b604051809103902003610c7f57601480546001600160a01b0319166001600160a01b038316179055610cc4565b60405162461bcd60e51b8152602060048201526015602482015274496e76616c6964207265636569766572207479706560581b60448201526064015b60405180910390fd5b806001600160a01b03167f41a354dc568ad8a664ff546822a040be3448b2abba534eb4cbdb9bd85f9c507d8484604051610cff929190614147565b60405180910390a2505050565b610d146122ac565b805f03610d34576040516316ee6b2560e01b815260040160405180910390fd5b8060275f848051906020012081526020019081526020015f20819055507f159e83f4712ba2552e68be9d848e49bf6dd35c24f19564ffd523b6549450a2f48282604051610d8292919061415a565b60405180910390a15050565b6001600160a01b038216610db757604051633250574960e11b81525f6004820152602401610cbb565b5f610dc38383336122e8565b9050836001600160a01b0316816001600160a01b031614610e11576040516364283d7b60e01b81526001600160a01b0380861660048301526024820184905282166044820152606401610cbb565b50505050565b5f8281526009602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291610e8b5750604080518082019091526008546001600160a01b0381168252600160a01b90046001600160601b031660208201525b60208101515f9061271090610ea9906001600160601b03168761418f565b610eb391906141a6565b91519350909150505b9250929050565b610ecb613863565b610ed3613863565b601654602080830151810191909152601e548251820152601d546040830151820152601b546060830151820152601c5460808301518201528151015161271090610f1d908761418f565b610f2791906141a6565b81515260145481516001600160a01b039091166040918201528101516020015161271090610f55908761418f565b610f5f91906141a6565b604080830180519290925260115491516001600160a01b0390921691015260608101516020015161271090610f94908761418f565b610f9e91906141a6565b6060820151525f838152601f602052604081208054610fbc906140b6565b80601f0160208091040260200160405190810160405280929190818152602001828054610fe8906140b6565b80156110335780601f1061100a57610100808354040283529160200191611033565b820191905f5260205f20905b81548152906001019060200180831161101657829003601f168201915b505050505090505f601f5f8681526020019081526020015f20600101805461105a906140b6565b80601f0160208091040260200160405190810160405280929190818152602001828054611086906140b6565b80156110d15780601f106110a8576101008083540402835291602001916110d1565b820191905f5260205f20905b8154815290600101906020018083116110b457829003601f168201915b505050505090505f6024836040516110e99190614105565b9081526020016040518091039020826040516111059190614105565b908152604051908190036020019020549050801561114157611126816117f2565b60608501516001600160a01b0390911660409091015261115b565b60135460608501516001600160a01b039091166040909101525b60808401515f90526040805180820190915260078152664368617269747960c81b6020918201528751908801207fcbf5b52c339091da20d61f61fdbc072a8502257f6ba630c8b646d18e7c1be6d9016111d657612710846080015160200151896111c5919061418f565b6111cf91906141a6565b6080850151525b60105460808501516101009091046001600160a01b0316604090910152602080850151015161271090611209908a61418f565b61121391906141a6565b6020850180519190915260155490516001600160a01b03909116604091820152608085015151908501515160608601515161124e91906141c5565b61125891906141c5565b60208501515161126891906141d8565b60c085015260208401515184515161128091906141c5565b61128a90896141d8565b60a085015250919695505050505050565b5f6112a5836118a7565b82106112d65760405163295f44f760e21b81526001600160a01b038416600482015260248101839052604401610cbb565b506001600160a01b03919091165f908152600a60209081526040808320938352929052205490565b6113066122ac565b808051906020012060218260405161131e9190614105565b90815260405190819003602001812061133691614259565b6040518091039020036113815760405162461bcd60e51b81526020600482015260136024820152725479706520616c72656164792065786973747360681b6044820152606401610cbb565b6040518060200160405280828152506021826040516113a09190614105565b908152604051908190036020019020815181906113bd90826142a8565b509050507fe2fbfe6695d404a744755ff1f49addb3508ff045d8ed7d39c117e2a7f31f894a81604051610a4c9190613974565b61140a83838360405180602001604052805f815250611c0c565b505050565b610a625f82336122e8565b60605f611426600e5490565b90505f805b828111611475575f818152602360205260409020600201546001600160a01b03808716911603611463578161145f81614362565b9250505b8061146d81614362565b91505061142b565b505f816001600160401b0381111561148f5761148f61399d565b6040519080825280602002602001820160405280156114f057816020015b6114dd60405180608001604052805f81526020015f81526020015f6001600160a01b031681526020015f81525090565b8152602001906001900390816114ad5790505b5090505f805b8481116115a9575f818152602360205260409020600201546001600160a01b03808916911603611597575f8181526023602090815260409182902082516080810184528154815260018201549281019290925260028101546001600160a01b0316928201929092526003909101546060820152835184908490811061157d5761157d61437a565b6020026020010181905250818061159390614362565b9250505b806115a181614362565b9150506114f6565b509095945050505050565b5f6115be600c5490565b82106115e65760405163295f44f760e21b81525f600482015260248101839052604401610cbb565b600c82815481106115f9576115f961437a565b905f5260205f2001549050919050565b80516020808301919091205f8181526027909252604082205482036116415760405163da17e8a160e01b815260040160405180910390fd5b5f9081526027602052604090205492915050565b61165d6122ac565b7fe0e014595d25934312f781a2f6c17595fb4a02c46a7e480de1ede5b709831991838360405161168e929190614110565b6040518091039020036116a557601a8190556117b2565b7f0e5cc181a4df548e272355027274d70d002d8003f48075d7d564fd127d016bbe83836040516116d6929190614110565b6040518091039020036116ed5760178190556117b2565b5f805160206145b0833981519152838360405161170b929190614110565b6040518091039020036117225760188190556117b2565b7fca726c75c3176cdff957e369afce8fbbddd029aa4c11c513ec80ece028812ac88383604051611753929190614110565b60405180910390200361176a5760198190556117b2565b60405162461bcd60e51b815260206004820152601760248201527f496e76616c69642070657263656e7461676520747970650000000000000000006044820152606401610cbb565b7f45bae9443a6a4d06cef70e32bdffb2db346170df6d5949863bb72c81d20ddc528383836040516117e59392919061438e565b60405180910390a1505050565b5f61091382612274565b6118046122ac565b6029805460ff19168215159081179091556040519081527fde1e4d805677ebcb833a9fa414d7616240d7f615fa277418eb158e24f291108590602001610a4c565b5f806024846040516118579190614105565b9081526020016040518091039020836040516118739190614105565b90815260200160405180910390205f01549050805f03611896575f915050610913565b61189f816117f2565b949350505050565b5f6001600160a01b0382166118d1576040516322718ad960e21b81525f6004820152602401610cbb565b506001600160a01b03165f9081526003602052604090205490565b6118f46122ac565b60405162461bcd60e51b815260206004820152601d60248201527f72656e6f756e63654f776e6572736869702069732064697361626c65640000006044820152606401610cbb565b601f6020525f9081526040902080548190611956906140b6565b80601f0160208091040260200160405190810160405280929190818152602001828054611982906140b6565b80156119cd5780601f106119a4576101008083540402835291602001916119cd565b820191905f5260205f20905b8154815290600101906020018083116119b057829003601f168201915b5050505050908060010180546119e2906140b6565b80601f0160208091040260200160405190810160405280929190818152602001828054611a0e906140b6565b8015611a595780601f10611a3057610100808354040283529160200191611a59565b820191905f5260205f20905b815481529060010190602001808311611a3c57829003601f168201915b5050505050905082565b606060018054610927906140b6565b610a623383836122f4565b60605f611a89600e5490565b90505f805b828111611ad8575f818152602260205260409020600101546001600160a01b03808716911603611ac65781611ac281614362565b9250505b80611ad081614362565b915050611a8e565b505f816001600160401b03811115611af257611af261399d565b604051908082528060200260200182016040528015611b5357816020015b611b4060405180608001604052805f81526020015f6001600160a01b031681526020015f81526020015f81525090565b815260200190600190039081611b105790505b5090505f805b8481116115a9575f818152602260205260409020600101546001600160a01b03808916911603611bfa575f8181526022602090815260409182902082516080810184528154815260018201546001600160a01b03169281019290925260028101549282019290925260039091015460608201528351849084908110611be057611be061437a565b60200260200101819052508180611bf690614362565b9250505b80611c0481614362565b915050611b59565b611c17848484610d8e565b610e1184848484612392565b8151602081840181018051602482529282019482019490942091909352815180830184018051928152908401929093019190912091528054600182018054919291611c6d906140b6565b80601f0160208091040260200160405190810160405280929190818152602001828054611c99906140b6565b8015611ce45780601f10611cbb57610100808354040283529160200191611ce4565b820191905f5260205f20905b815481529060010190602001808311611cc757829003601f168201915b505050505090806002018054611cf9906140b6565b80601f0160208091040260200160405190810160405280929190818152602001828054611d25906140b6565b8015611d705780601f10611d4757610100808354040283529160200191611d70565b820191905f5260205f20905b815481529060010190602001808311611d5357829003601f168201915b5050505050905083565b6060610913826124b8565b611d8d6122ac565b601580546001600160a01b0319166001600160a01b03841690811790915560168290556040518281527f5ba7b74d84f5acf3db282044fe19f114c13c57cd592cbe0931b18cde4bfe61019060200160405180910390a25050565b5f80602084604051611df99190614105565b908152602001604051809103902083604051611e159190614105565b9081526040805191829003602090810183208054808302850183019093528284529190830182828015611e6557602002820191905f5260205f20905b815481526020019060010190808311611e51575b505050505090505f805b8251811015611ea757828181518110611e8a57611e8a61437a565b602002602001015182611e9d91906141c5565b9150600101611e6f565b50949350505050565b611eb86122ac565b7f0e5cc181a4df548e272355027274d70d002d8003f48075d7d564fd127d016bbe8383604051611ee9929190614110565b604051809103902003611f0057601b819055611fc1565b5f805160206145b08339815191528383604051611f1e929190614110565b604051809103902003611f3557601c819055611fc1565b7fca726c75c3176cdff957e369afce8fbbddd029aa4c11c513ec80ece028812ac88383604051611f66929190614110565b604051809103902003611f7d57601d819055611fc1565b7f300b632acdbe1d6b304df50a250f2c5be839a725b279b899bf8579338a0b43548383604051611fae929190614110565b60405180910390200361176a57601e8190555b7fe4c34095ab53e8f7db8cd9b04c116d4920dd5ac9939d0650884d9ee7c005a4ea8383836040516117e59392919061438e565b6001600160a01b039182165f90815260056020908152604080832093909416825291909152205460ff1690565b6010545f9060ff16156120685760405162461bcd60e51b815260206004820152600f60248201526e10dbdb9d1c9858dd081c185d5cd959608a1b6044820152606401610cbb565b6001600160a01b03851633036120c05760405162461bcd60e51b815260206004820152601e60248201527f53656e6465722063616e6e6f74207265666572207468656d73656c76657300006044820152606401610cbb565b6120c986611609565b34101561210d5760405162461bcd60e51b8152602060048201526012602482015271496e76616c6964207479706520707269636560701b6044820152606401610cbb565b60295460ff1615612184576028548260405160200161212c9190614105565b60405160208183030381529060405280519060200120146121845760405162461bcd60e51b8152602060048201526012602482015271496e76616c696420736563726574206b657960701b6044820152606401610cbb565b5f61218e600e5490565b905061219c878287876125bb565b6121a9868887878561264f565b60408051808201825288815260208082018490525f848152602590915291909120815181906121d890826142a8565b50602082015181600101559050506121f0338261279c565b6121fa81896127b5565b612208600e80546001019055565b979650505050505050565b61221b6122ac565b6001600160a01b03811661224457604051631e4fbdf760e01b81525f6004820152602401610cbb565b61224d816127fd565b50565b5f6001600160e01b0319821663780e9d6360e01b148061091357506109138261284e565b5f818152600260205260408120546001600160a01b03168061091357604051637e27328960e01b815260048101849052602401610cbb565b6006546001600160a01b031633146122d95760405163118cdaa760e01b8152336004820152602401610cbb565b565b61140a8383836001612872565b5f61189f848484612976565b6001600160a01b03821661232657604051630b61174360e31b81526001600160a01b0383166004820152602401610cbb565b6001600160a01b038381165f81815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0383163b15610e1157604051630a85bd0160e11b81526001600160a01b0384169063150b7a02906123d49033908890879087906004016143b1565b6020604051808303815f875af192505050801561240e575060408051601f3d908101601f1916820190925261240b918101906143e3565b60015b612475573d80801561243b576040519150601f19603f3d011682016040523d82523d5f602084013e612440565b606091505b5080515f0361246d57604051633250574960e11b81526001600160a01b0385166004820152602401610cbb565b805181602001fd5b6001600160e01b03198116630a85bd0160e11b146124b157604051633250574960e11b81526001600160a01b0385166004820152602401610cbb565b5050505050565b60606124c382612274565b505f82815260076020526040812080546124dc906140b6565b80601f0160208091040260200160405190810160405280929190818152602001828054612508906140b6565b80156125535780601f1061252a57610100808354040283529160200191612553565b820191905f5260205f20905b81548152906001019060200180831161253657829003601f168201915b505050505090505f61256f60408051602081019091525f815290565b905080515f03612580575092915050565b8151156125b257808260405160200161259a9291906143fe565b60405160208183030381529060405292505050919050565b61189f84612a41565b60408051808201909152600c81526b13995a59da189bdc9a1bdbd960a21b6020918201528451908501207f0e5cc181a4df548e272355027274d70d002d8003f48075d7d564fd127d016bbe148015612617575061261782612ab2565b15610e11576126268282612b2c565b15612644576040516346e07e9160e01b815260040160405180910390fd5b610e11828285612ba1565b345f61265c878385612c2c565b90505f61266c8787878787612d80565b90505f61267c88856018546130bd565b9050847f32ecfe2224ee52942615611c93760cc5af94a834542129acaa47dc8c8a858fc0601060019054906101000a90046001600160a01b031683896040516126c793929190614412565b60405180910390a25f6126dc85601954613160565b60115460405191925087917f32ecfe2224ee52942615611c93760cc5af94a834542129acaa47dc8c8a858fc091612722916001600160a01b039091169085908c9061446c565b60405180910390a25f828483612738888a6141d8565b61274291906141d8565b61274c91906141d8565b61275691906141d8565b6012546040519192506001600160a01b03169082156108fc029083905f818181858888f1935050505015801561278e573d5f803e3d5ffd5b505050505050505050505050565b610a62828260405180602001604052805f8152506131b9565b5f8281526007602052604090206127cc82826142a8565b506040518281527ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce790602001610d82565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f6001600160e01b0319821663152a902d60e11b14806109135750610913826131cf565b808061288657506001600160a01b03821615155b15612947575f61289584612274565b90506001600160a01b038316158015906128c15750826001600160a01b0316816001600160a01b031614155b80156128d457506128d28184611ff4565b155b156128fd5760405163a9fbf51f60e01b81526001600160a01b0384166004820152602401610cbb565b81156129455783856001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b50505f90815260046020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b5f806129838585856131f3565b90506001600160a01b0381166129df576129da84600c80545f838152600d60205260408120829055600182018355919091527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c70155565b612a02565b846001600160a01b0316816001600160a01b031614612a0257612a0281856132e5565b6001600160a01b038516612a1e57612a1984613372565b61189f565b846001600160a01b0316816001600160a01b03161461189f5761189f8585613419565b6060612a4c82612274565b505f612a6260408051602081019091525f815290565b90505f815111612a805760405180602001604052805f815250612aab565b80612a8a84613467565b604051602001612a9b9291906143fe565b6040516020818303038152906040525b9392505050565b5f602182604051612ac39190614105565b9081526040519081900360200190208054612add906140b6565b90505f03612aec57505f919050565b8180519060200120602183604051612b049190614105565b908152604051908190036020018120612b1c91614259565b6040518091039020149050919050565b5f8180519060200120602484604051612b459190614105565b908152602001604051809103902083604051612b619190614105565b9081526020016040518091039020600201604051602001612b829190614259565b6040516020818303038152906040528051906020012014905092915050565b604051806060016040528082815260200184815260200183815250602484604051612bcc9190614105565b908152602001604051809103902083604051612be89190614105565b9081526040516020918190038201902082518155908201516001820190612c0f90826142a8565b5060408201516002820190612c2490826142a8565b505050505050565b5f806001600160a01b03851615612d0f57612710601a5485612c4e919061418f565b612c5891906141a6565b6013546040519192506001600160a01b03169082156108fc029083905f818181858888f19350505050158015612c90573d5f803e3d5ffd5b50601354604080518381526001600160a01b0390921660208301526060908201819052601b908201527f526566657272616c2050657263656e74616765202d204d696e74730000000000608082015283907f226091fbfe2217ec51438ad6c779ed0f2857c14d764f206397758bf662195f9b9060a00160405180910390a25b6040805160808101825284815260208082018481526001600160a01b0398891683850190815242606085019081525f988952602390935293909620915182559451600182015590516002820180546001600160a01b0319169190971617909555915160039094019390935592915050565b5f80612d8b876134f6565b15612f845760408051808201825287815260208082018890525f878152601f9091529190912081518190612dbf90826142a8565b5060208201516001820190612dd490826142a8565b50506017546127109150612de8908561418f565b612df291906141a6565b9050612dfe8686612b2c565b15612f30576013546040516001600160a01b039091169082156108fc029083905f818181858888f19350505050158015612e3a573d5f803e3d5ffd5b505f602487604051612e4c9190614105565b908152602001604051809103902086604051612e689190614105565b9081526040519081900360200190205490505f612e84826117f2565b604080516080810182528881526001600160a01b03838116602080840191825283850189815242606086019081525f8e81526022909352918690209451855591516001850180546001600160a01b0319169190941617909255516002830155516003909101555190915086907f329954af30b4205993e8f74fdb9ba7dc953195af335a0c799abe9636f4634f9c90612f219084908b9088906144c6565b60405180910390a250506130b3565b602086604051612f409190614105565b908152602001604051809103902085604051612f5c9190614105565b9081526040516020918190038201902080546001810182555f918252919020018190556130b3565b5f612f8f8787611de7565b6013546040519192506001600160a01b03169082156108fc029083905f818181858888f19350505050158015612fc7573d5f803e3d5ffd5b50602087604051612fd89190614105565b908152602001604051809103902086604051612ff49190614105565b90815260200160405180910390205f61300d91906138bc565b6040805160808101825286815233602080830182815283850186815242606086019081525f8c81526022909452928690209451855590516001850180546001600160a01b0319166001600160a01b0390921691909117905551600284015551600390920191909155905186917f32ecfe2224ee52942615611c93760cc5af94a834542129acaa47dc8c8a858fc0916130a9919085908b90614530565b60405180910390a2505b9695505050505050565b6040805180820190915260078152664368617269747960c81b6020918201528351908401205f9081907fcbf5b52c339091da20d61f61fdbc072a8502257f6ba630c8b646d18e7c1be6d90161189f57612710613119848661418f565b61312391906141a6565b60105460405191925061010090046001600160a01b0316906108fc8315029083905f818181858888f19350505050158015611ea7573d5f803e3d5ffd5b5f8061271061316f848661418f565b61317991906141a6565b6011546040519192506001600160a01b03169082156108fc029083905f818181858888f193505050501580156131b1573d5f803e3d5ffd5b509392505050565b6131c38383613617565b61140a5f848484612392565b5f6001600160e01b03198216632483248360e11b1480610913575061091382613678565b5f828152600260205260408120546001600160a01b039081169083161561321f5761321f8184866136c7565b6001600160a01b038116156132595761323a5f855f80612872565b6001600160a01b0381165f90815260036020526040902080545f190190555b6001600160a01b03851615613287576001600160a01b0385165f908152600360205260409020805460010190555b5f8481526002602052604080822080546001600160a01b0319166001600160a01b0389811691821790925591518793918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4949350505050565b5f6132ef836118a7565b5f838152600b6020526040902054909150808214613340576001600160a01b0384165f908152600a602090815260408083208584528252808320548484528184208190558352600b90915290208190555b505f918252600b602090815260408084208490556001600160a01b039094168352600a81528383209183525290812055565b600c545f90613383906001906141d8565b5f838152600d6020526040812054600c80549394509092849081106133aa576133aa61437a565b905f5260205f200154905080600c83815481106133c9576133c961437a565b5f918252602080832090910192909255828152600d9091526040808220849055858252812055600c8054806134005761340061459b565b600190038181905f5260205f20015f9055905550505050565b5f6001613425846118a7565b61342f91906141d8565b6001600160a01b039093165f908152600a602090815260408083208684528252808320859055938252600b9052919091209190915550565b60605f6134738361372b565b60010190505f816001600160401b038111156134915761349161399d565b6040519080825280601f01601f1916602001820160405280156134bb576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846134c557509392505050565b60408051808201909152600881526714dd185b99185c9960c21b6020918201528151908201205f907f719b9449dc4fc1dca2b4b492f922c355b93c8f42d375127999e6d898029a4158148061358b575060408051808201909152600481526311dbdb1960e21b6020918201528251908301207f6f0d47b12e2c2f7083eb5622541f9c3930e56fc3e46e89e132673f05a079baff145b806135da5750604080518082019091526008815267506c6174696e756d60c01b6020918201528251908301207fecadc0d3992a7a94d19327888a16aecb280514d608e8377a0d15dcf293020373145b806109135750506040805180820190915260078152664368617269747960c81b60209182015281519101205f805160206145b08339815191521490565b6001600160a01b03821661364057604051633250574960e11b81525f6004820152602401610cbb565b5f61364c83835f6122e8565b90506001600160a01b0381161561140a576040516339e3563760e11b81525f6004820152602401610cbb565b5f6001600160e01b031982166380ac58cd60e01b14806136a857506001600160e01b03198216635b5e139f60e01b145b8061091357506301ffc9a760e01b6001600160e01b0319831614610913565b6136d2838383613802565b61140a576001600160a01b03831661370057604051637e27328960e01b815260048101829052602401610cbb565b60405163177e802f60e01b81526001600160a01b038316600482015260248101829052604401610cbb565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106137695772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310613795576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106137b357662386f26fc10000830492506010015b6305f5e10083106137cb576305f5e100830492506008015b61271083106137df57612710830492506004015b606483106137f1576064830492506002015b600a83106109135760010192915050565b5f6001600160a01b0383161580159061189f5750826001600160a01b0316846001600160a01b0316148061383b575061383b8484611ff4565b8061189f5750505f908152600460205260409020546001600160a01b03908116911614919050565b6040518060e001604052806138766138d7565b81526020016138836138d7565b81526020016138906138d7565b815260200161389d6138d7565b81526020016138aa6138d7565b81526020015f81526020015f81525090565b5080545f8255905f5260205f209081019061224d91906138fe565b60405180606001604052805f81526020015f81526020015f6001600160a01b031681525090565b5b80821115613912575f81556001016138ff565b5090565b6001600160e01b03198116811461224d575f80fd5b5f6020828403121561393b575f80fd5b8135612aab81613916565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f612aab6020830184613946565b5f60208284031215613996575f80fd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b5f806001600160401b038411156139ca576139ca61399d565b50604051601f19601f85018116603f011681018181106001600160401b03821117156139f8576139f861399d565b604052838152905080828401851015613a0f575f80fd5b838360208301375f60208583010152509392505050565b5f82601f830112613a35575f80fd5b612aab838335602085016139b1565b5f60208284031215613a54575f80fd5b81356001600160401b03811115613a69575f80fd5b61189f84828501613a26565b6001600160a01b038116811461224d575f80fd5b8035613a9481613a75565b919050565b5f8060408385031215613aaa575f80fd5b8235613ab581613a75565b946020939093013593505050565b80358015158114613a94575f80fd5b5f60208284031215613ae2575f80fd5b612aab82613ac3565b5f8083601f840112613afb575f80fd5b5081356001600160401b03811115613b11575f80fd5b602083019150836020828501011115610ebc575f80fd5b5f805f60408486031215613b3a575f80fd5b83356001600160401b03811115613b4f575f80fd5b613b5b86828701613aeb565b9094509250506020840135613b6f81613a75565b809150509250925092565b5f8060408385031215613b8b575f80fd5b82356001600160401b03811115613ba0575f80fd5b613bac85828601613a26565b95602094909401359450505050565b5f805f60608486031215613bcd575f80fd5b8335613bd881613a75565b92506020840135613be881613a75565b929592945050506040919091013590565b5f8060408385031215613c0a575f80fd5b50508035926020909101359150565b5f805f60608486031215613c2b575f80fd5b8335925060208401356001600160401b03811115613c47575f80fd5b613c5386828701613a26565b93969395505050506040919091013590565b80518252602080820151908301526040908101516001600160a01b0316910152565b5f61022082019050613c9a828451613c65565b6020830151613cac6060840182613c65565b506040830151613cbf60c0840182613c65565b506060830151613cd3610120840182613c65565b506080830151613ce7610180840182613c65565b5060a08301516101e083015260c0909201516102009091015290565b5f60208284031215613d13575f80fd5b8135612aab81613a75565b602080825282518282018190525f918401906040840190835b818110156115a957835180518452602080820151818601526040808301516001600160a01b0316908601526060918201519185019190915290930192608090920191600101613d37565b5f805f60408486031215613d93575f80fd5b83356001600160401b03811115613da8575f80fd5b613db486828701613aeb565b909790965060209590950135949350505050565b5f8060408385031215613dd9575f80fd5b82356001600160401b03811115613dee575f80fd5b613dfa85828601613a26565b92505060208301356001600160401b03811115613e15575f80fd5b613e2185828601613a26565b9150509250929050565b604081525f613e3d6040830185613946565b8281036020840152613e4f8185613946565b95945050505050565b5f8060408385031215613e69575f80fd5b8235613e7481613a75565b9150613e8260208401613ac3565b90509250929050565b602080825282518282018190525f918401906040840190835b818110156115a9578351805184526020808201516001600160a01b031681860152604080830151908601526060918201519185019190915290930192608090920191600101613ea4565b5f805f8060808587031215613f01575f80fd5b8435613f0c81613a75565b93506020850135613f1c81613a75565b92506040850135915060608501356001600160401b03811115613f3d575f80fd5b8501601f81018713613f4d575f80fd5b613f5c878235602084016139b1565b91505092959194509250565b838152606060208201525f613f806060830185613946565b82810360408401526130b38185613946565b5f8060408385031215613fa3575f80fd5b8235613fae81613a75565b91506020830135613fbe81613a75565b809150509250929050565b5f805f805f8060c08789031215613fde575f80fd5b86356001600160401b03811115613ff3575f80fd5b613fff89828a01613a26565b96505060208701356001600160401b0381111561401a575f80fd5b61402689828a01613a26565b95505061403560408801613a89565b935060608701356001600160401b0381111561404f575f80fd5b61405b89828a01613a26565b93505060808701356001600160401b03811115614076575f80fd5b61408289828a01613a26565b92505060a08701356001600160401b0381111561409d575f80fd5b6140a989828a01613a26565b9150509295509295509295565b600181811c908216806140ca57607f821691505b6020821081036140e857634e487b7160e01b5f52602260045260245ffd5b50919050565b5f81518060208401855e5f93019283525090919050565b5f612aab82846140ee565b818382375f9101908152919050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b602081525f61189f60208301848661411f565b604081525f61416c6040830185613946565b90508260208301529392505050565b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176109135761091361417b565b5f826141c057634e487b7160e01b5f52601260045260245ffd5b500490565b808201808211156109135761091361417b565b818103818111156109135761091361417b565b5f81546141f7816140b6565b60018216801561420e576001811461422357614250565b60ff1983168652811515820286019350614250565b845f5260205f205f5b838110156142485781548882015260019091019060200161422c565b505081860193505b50505092915050565b5f612aab82846141eb565b601f82111561140a57805f5260205f20601f840160051c810160208510156142895750805b601f840160051c820191505b818110156124b1575f8155600101614295565b81516001600160401b038111156142c1576142c161399d565b6142d5816142cf84546140b6565b84614264565b6020601f821160018114614307575f83156142f05750848201515b5f19600385901b1c1916600184901b1784556124b1565b5f84815260208120601f198516915b828110156143365787850151825560209485019460019092019101614316565b508482101561435357868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f600182016143735761437361417b565b5060010190565b634e487b7160e01b5f52603260045260245ffd5b604081525f6143a160408301858761411f565b9050826020830152949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f906130b390830184613946565b5f602082840312156143f3575f80fd5b8151612aab81613916565b5f61189f61440c83866140ee565b846140ee565b60018060a01b038416815260806020820152601a60808201527f436861726974792050657263656e74616765202d204d696e747300000000000060a082015282604082015260c060608201525f613e4f60c0830184613946565b60018060a01b038416815260806020820152602060808201527f416464726573732051756573742050657263656e74616765202d204d696e747360a082015282604082015260c060608201525f613e4f60c0830184613946565b6001600160a01b03841681526080602082018190525f906144e990830185613946565b8360408401528281036060840152601f81527f4e65696768626f72686f6f642050657263656e74616765202d204d696e747300602082015260408101915050949350505050565b60018060a01b038416815260806020820152602860808201527f5265736572766564204e65696768626f72686f6f642050657263656e7461676560a082015267202d204d696e747360c01b60c082015282604082015260e060608201525f613e4f60e0830184613946565b634e487b7160e01b5f52603160045260245ffdfe340a4ad3cc6f6e25df29e09e0243f8d57afdda809459cf3749b92e7183e41927a26469706673582212205451ff620a98e7201c878d3ab96ea5cf229c559889f52bf153ae05b32b2f889064736f6c634300081a0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000008b7c077d98c2ab584c96572072699808118424f8000000000000000000000000516da7fb4ca43cb3b340cff111342f5920f043140000000000000000000000008b7c077d98c2ab584c96572072699808118424f8000000000000000000000000bf9db529729382f3d1e0c04dde54c61fc8d103c1000000000000000000000000ca1aeeb6515292cdc59f7efcf852563504c1079c000000000000000000000000de25e7d1250857d4e299c8353b8695a4329e467f0000000000000000000000004c0d856ae05f22715acda4103bf5762c4fb3ac1500000000000000000000000000000000000000000000000000000000000003e8
-----Decoded View---------------
Arg [0] : initialOwner (address): 0x8b7C077d98C2aB584C96572072699808118424f8
Arg [1] : _royaltyReceiver (address): 0x516DA7FB4Ca43Cb3b340CfF111342f5920F04314
Arg [2] : _ownerSubReceiver (address): 0x8b7C077d98C2aB584C96572072699808118424f8
Arg [3] : _refAndNeighborhoodReceiver (address): 0xBf9dB529729382f3D1E0c04ddE54C61fc8d103C1
Arg [4] : _addressQuestReceiver (address): 0xca1aeeB6515292cDC59F7eFCF852563504c1079c
Arg [5] : _charityReceiver (address): 0xde25E7D1250857d4e299c8353b8695A4329e467F
Arg [6] : _marketplaceFeeReceiver (address): 0x4c0D856Ae05f22715acDa4103BF5762C4fB3ac15
Arg [7] : _royaltyFee (uint96): 1000
-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000008b7c077d98c2ab584c96572072699808118424f8
Arg [1] : 000000000000000000000000516da7fb4ca43cb3b340cff111342f5920f04314
Arg [2] : 0000000000000000000000008b7c077d98c2ab584c96572072699808118424f8
Arg [3] : 000000000000000000000000bf9db529729382f3d1e0c04dde54c61fc8d103c1
Arg [4] : 000000000000000000000000ca1aeeb6515292cdc59f7efcf852563504c1079c
Arg [5] : 000000000000000000000000de25e7d1250857d4e299c8353b8695a4329e467f
Arg [6] : 0000000000000000000000004c0d856ae05f22715acda4103bf5762c4fb3ac15
Arg [7] : 00000000000000000000000000000000000000000000000000000000000003e8
Deployed Bytecode Sourcemap
77689:28376:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;105807:255;;;;;;;;;;-1:-1:-1;105807:255:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;105807:255:0;;;;;;;;38676:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;39848:158::-;;;;;;;;;;-1:-1:-1;39848:158:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1528:32:1;;;1510:51;;1498:2;1483:18;39848:158:0;1364:203:1;93090:214:0;;;;;;;;;;-1:-1:-1;93090:214:0;;;;;:::i;:::-;;:::i;:::-;;39667:115;;;;;;;;;;-1:-1:-1;39667:115:0;;;;;:::i;:::-;;:::i;97875:125::-;;;;;;;;;;-1:-1:-1;97875:125:0;;;;;:::i;:::-;;:::i;69885:104::-;;;;;;;;;;-1:-1:-1;69964:10:0;:17;69885:104;;;4122:25:1;;;4110:2;4095:18;69885:104:0;3976:177:1;98037:999:0;;;;;;;;;;-1:-1:-1;98037:999:0;;;;;:::i;:::-;;:::i;97569:259::-;;;;;;;;;;-1:-1:-1;97569:259:0;;;;;:::i;:::-;;:::i;40517:588::-;;;;;;;;;;-1:-1:-1;40517:588:0;;;;;:::i;:::-;;:::i;78956:45::-;;;;;;;;;;;;;;;;63964:429;;;;;;;;;;-1:-1:-1;63964:429:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;6567:32:1;;;6549:51;;6631:2;6616:18;;6609:34;;;;6522:18;63964:429:0;6375:274:1;101969:3169:0;;;;;;;;;;-1:-1:-1;101969:3169:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;69549:260::-;;;;;;;;;;-1:-1:-1;69549:260:0;;;;;:::i;:::-;;:::i;96740:368::-;;;;;;;;;;-1:-1:-1;96740:368:0;;;;;:::i;:::-;;:::i;41176:134::-;;;;;;;;;;-1:-1:-1;41176:134:0;;;;;:::i;:::-;;:::i;77234:318::-;;;;;;;;;;-1:-1:-1;77234:318:0;;;;;:::i;:::-;;:::i;79367:45::-;;;;;;;;;;;;;;;;94781:889;;;;;;;;;;-1:-1:-1;94781:889:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;70066:231::-;;;;;;;;;;-1:-1:-1;70066:231:0;;;;;:::i;:::-;;:::i;84792:260::-;;;;;;;;;;-1:-1:-1;84792:260:0;;;;;:::i;:::-;;:::i;99357:868::-;;;;;;;;;;-1:-1:-1;99357:868:0;;;;;:::i;:::-;;:::i;79298:56::-;;;;;;;;;;;;;;;;38489:120;;;;;;;;;;-1:-1:-1;38489:120:0;;;;;:::i;:::-;;:::i;93361:158::-;;;;;;;;;;-1:-1:-1;93361:158:0;;;;;:::i;:::-;;:::i;101427:534::-;;;;;;;;;;-1:-1:-1;101427:534:0;;;;;:::i;:::-;;:::i;38214:213::-;;;;;;;;;;-1:-1:-1;38214:213:0;;;;;:::i;:::-;;:::i;101237:118::-;;;;;;;;;;;;;:::i;79165:56::-;;;;;;;;;;;;;;;;79234:51;;;;;;;;;;;;;;;;78191:25;;;;;;;;;;-1:-1:-1;78191:25:0;;;;;;;;82556:94;;;;;;;;;;-1:-1:-1;82556:94:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;56096:87::-;;;;;;;;;;-1:-1:-1;56169:6:0;;-1:-1:-1;;;;;56169:6:0;56096:87;;38836:95;;;;;;;;;;;;;:::i;79079:39::-;;;;;;;;;;;;;;;;40078:146;;;;;;;;;;-1:-1:-1;40078:146:0;;;;;:::i;:::-;;:::i;78892:50::-;;;;;;;;;;;;;;;;95678:992;;;;;;;;;;-1:-1:-1;95678:992:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;41381:211::-;;;;;;;;;;-1:-1:-1;41381:211:0;;;;;:::i;:::-;;:::i;83057:67::-;;;;;;;;;;-1:-1:-1;83057:67:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;78098:47::-;;;;;;;;;;;;78140:5;78098:47;;105628:171;;;;;;;;;;-1:-1:-1;105628:171:0;;;;;:::i;:::-;;:::i;99081:236::-;;;;;;;;;;-1:-1:-1;99081:236:0;;;;;:::i;:::-;;:::i;97168:363::-;;;;;;;;;;-1:-1:-1;97168:363:0;;;;;:::i;:::-;;:::i;93003:35::-;;;;;;;;;;-1:-1:-1;93003:35:0;;;;;;;;79015:50;;;;;;;;;;;;;;;;100269:909;;;;;;;;;;-1:-1:-1;100269:909:0;;;;;:::i;:::-;;:::i;40295:155::-;;;;;;;;;;-1:-1:-1;40295:155:0;;;;;:::i;:::-;;:::i;93558:1177::-;;;;;;:::i;:::-;;:::i;57029:220::-;;;;;;;;;;-1:-1:-1;57029:220:0;;;;;:::i;:::-;;:::i;78821:28::-;;;;;;;;;;;;;;;;105807:255;105989:4;106018:36;106042:11;106018:23;:36::i;:::-;106011:43;105807:255;-1:-1:-1;;105807:255:0:o;38676:91::-;38721:13;38754:5;38747:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38676:91;:::o;39848:158::-;39915:7;39935:22;39949:7;39935:13;:22::i;:::-;-1:-1:-1;42424:7:0;42451:24;;;:15;:24;;;;;;-1:-1:-1;;;;;42451:24:0;39977:21;42354:129;93090:214;55982:13;:11;:13::i;:::-;93224:9:::1;93207:27;;;;;;;;:::i;:::-;;::::0;;;;::::1;-1:-1:-1::0;;93207:27:0;;;;;;93197:38;;93207:27:::1;93197:38:::0;;::::1;::::0;93174:20:::1;:61:::0;16639:21:1;;;16696:2;16676:18;;;16669:30;-1:-1:-1;;;16715:18:1;;;16708:48;93251:45:0::1;::::0;16788:2:1;16773:18;93251:45:0::1;;;;;;;;93090:214:::0;:::o;39667:115::-;39739:35;39748:2;39752:7;8662:10;39739:8;:35::i;:::-;39667:115;;:::o;97875:125::-;55982:13;:11;:13::i;:::-;97938:5:::1;:15:::0;;-1:-1:-1;;97938:15:0::1;::::0;::::1;;::::0;;::::1;::::0;;;97969:23:::1;::::0;540:41:1;;;97969:23:0::1;::::0;528:2:1;513:18;97969:23:0::1;400:187:1::0;98037:999:0;55982:13;:11;:13::i;:::-;-1:-1:-1;;;;;;;;;;;98195:12:0::1;;98179:30;;;;;;;:::i;:::-;;;;;;;;:54:::0;98175:791:::1;;98250:15;:26:::0;;-1:-1:-1;;;;;;98250:26:0::1;;-1:-1:-1::0;;;;;98250:26:0;::::1;;;::::0;;98175:791:::1;;;98346:25;98328:12;;98312:30;;;;;;;:::i;:::-;;;;;;;;:59:::0;98294:672:::1;;98398:20;:31:::0;;-1:-1:-1;;;;;;98398:31:0::1;-1:-1:-1::0;;;;;98398:31:0;::::1;;::::0;;98294:672:::1;;;98485:21;98467:12;;98451:30;;;;;;;:::i;:::-;;;;;;;;:55:::0;98447:519:::1;;98523:16;:27:::0;;-1:-1:-1;;;;;;98523:27:0::1;-1:-1:-1::0;;;;;98523:27:0;::::1;;::::0;;98447:519:::1;;;98633:36;98602:12;;98586:30;;;;;;;:::i;:::-;;;;;;;;:83:::0;98568:398:::1;;98696:26;:37:::0;;-1:-1:-1;;;;;;98696:37:0::1;-1:-1:-1::0;;;;;98696:37:0;::::1;;::::0;;98568:398:::1;;;98803:27;98785:12;;98769:30;;;;;;;:::i;:::-;;;;;;;;:61:::0;98751:215:::1;;98857:22;:33:::0;;-1:-1:-1;;;;;;98857:33:0::1;-1:-1:-1::0;;;;;98857:33:0;::::1;;::::0;;98751:215:::1;;;98923:31;::::0;-1:-1:-1;;;98923:31:0;;17280:2:1;98923:31:0::1;::::0;::::1;17262:21:1::0;17319:2;17299:18;;;17292:30;-1:-1:-1;;;17338:18:1;;;17331:51;17399:18;;98923:31:0::1;;;;;;;;98751:215;99019:8;-1:-1:-1::0;;;;;98983:45:0::1;;99005:12;;98983:45;;;;;;;:::i;:::-;;;;;;;;98037:999:::0;;;:::o;97569:259::-;55982:13;:11;:13::i;:::-;97658:5:::1;97667:1;97658:10:::0;97654:66:::1;;97692:16;;-1:-1:-1::0;;;97692:16:0::1;;;;;;;;;;;97654:66;97770:5;97730:9;:37;97756:8;97740:26;;;;;;97730:37;;;;;;;;;;;:45;;;;97791:29;97804:8;97814:5;97791:29;;;;;;;:::i;:::-;;;;;;;;97569:259:::0;;:::o;40517:588::-;-1:-1:-1;;;;;40612:16:0;;40608:89;;40652:33;;-1:-1:-1;;;40652:33:0;;40682:1;40652:33;;;1510:51:1;1483:18;;40652:33:0;1364:203:1;40608:89:0;40918:21;40942:34;40950:2;40954:7;8662:10;40942:7;:34::i;:::-;40918:58;;41008:4;-1:-1:-1;;;;;40991:21:0;:13;-1:-1:-1;;;;;40991:21:0;;40987:111;;41036:50;;-1:-1:-1;;;41036:50:0;;-1:-1:-1;;;;;18479:32:1;;;41036:50:0;;;18461:51:1;18528:18;;;18521:34;;;18591:32;;18571:18;;;18564:60;18434:18;;41036:50:0;18259:371:1;40987:111:0;40597:508;40517:588;;;:::o;63964:429::-;64050:7;64108:26;;;:17;:26;;;;;;;;64079:55;;;;;;;;;-1:-1:-1;;;;;64079:55:0;;;;;-1:-1:-1;;;64079:55:0;;;-1:-1:-1;;;;;64079:55:0;;;;;;;;64050:7;;64147:92;;-1:-1:-1;64198:29:0;;;;;;;;;64208:19;64198:29;-1:-1:-1;;;;;64198:29:0;;;;-1:-1:-1;;;64198:29:0;;-1:-1:-1;;;;;64198:29:0;;;;;64147:92;64288:23;;;;64251:21;;64759:5;;64276:35;;-1:-1:-1;;;;;64276:35:0;:9;:35;:::i;:::-;64275:57;;;;:::i;:::-;64353:16;;;-1:-1:-1;64251:81:0;;-1:-1:-1;;63964:429:0;;;;;;:::o;101969:3169::-;102120:29;;:::i;:::-;102204:41;;:::i;:::-;102327:7;;102294:19;;;;;:30;;:40;;;;102385:24;;102345:26;;:37;;:64;102486:35;;102420:38;;;;:63;;:101;102603:35;;102532:43;;;;:68;;:106;102682:30;;102649:19;;;;:30;;:63;102822:26;;:37;;78140:5;;102814:45;;:5;:45;:::i;:::-;102813:78;;;;:::i;:::-;102764:26;;:127;102940:22;;102902:26;;-1:-1:-1;;;;;102940:22:0;;;102902:35;;;;:60;103068:24;;;:35;;;78140:5;;103060:43;;:5;:43;:::i;:::-;103059:76;;;;:::i;:::-;103012:24;;;;;;:123;;;;103182:20;;103146:24;;-1:-1:-1;;;;;103182:20:0;;;103146:33;;:56;103318:29;;;;:40;;;78140:5;;103310:48;;:5;:48;:::i;:::-;103309:81;;;;:::i;:::-;103257:29;;;;:133;:36;103485:41;;;:32;:41;;;;;103461:87;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;103559:24;103586:32;:41;103619:7;103586:41;;;;;;;;;;;:66;;103559:93;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;103663:27;103693:11;103705:7;103693:20;;;;;;:::i;:::-;;;;;;;;;;;;;103714:10;103693:32;;;;;;:::i;:::-;;;;;;;;;;;;;;:40;;-1:-1:-1;103750:23:0;;103746:309;;103831:60;103857:19;103831:7;:60::i;:::-;103790:29;;;;-1:-1:-1;;;;;103790:101:0;;;:38;;;;:101;103746:309;;;103965:26;;103924:29;;;;-1:-1:-1;;;;;103965:26:0;;;103924:38;;;;:67;103746:309;104122:19;;;;104151:1;104122:30;;104212:7;;;;;;;;;;;;-1:-1:-1;;;104212:7:0;;;;;104167:25;;;;;;:54;;104163:208;;78140:5;104293:11;:19;;;:30;;;104285:5;:38;;;;:::i;:::-;104284:75;;;;:::i;:::-;104238:19;;;;:121;104163:208;104412:15;;104381:19;;;;104412:15;;;;-1:-1:-1;;;;;104412:15:0;104381:28;;;;:46;104522:19;;;;;:30;;78140:5;;104514:38;;:5;:38;:::i;:::-;104513:71;;;;:::i;:::-;104471:19;;;;;:113;;;;104626:15;;104595:19;;-1:-1:-1;;;;;104626:15:0;;;104595:28;;;;:46;104887:19;;;;:26;104836:24;;;;:31;104780:29;;;;:36;:87;;104836:31;104780:87;:::i;:::-;:133;;;;:::i;:::-;104737:19;;;;:26;:177;;;;:::i;:::-;104683:38;;;:231;105072:19;;;;:26;105036;;:33;:62;;105072:26;105036:62;:::i;:::-;105014:85;;:5;:85;:::i;:::-;104961:37;;;:138;-1:-1:-1;104961:37:0;;101969:3169;-1:-1:-1;;;;;;101969:3169:0:o;69549:260::-;69637:7;69670:16;69680:5;69670:9;:16::i;:::-;69661:5;:25;69657:101;;69710:36;;-1:-1:-1;;;69710:36:0;;-1:-1:-1;;;;;6567:32:1;;69710:36:0;;;6549:51:1;6616:18;;;6609:34;;;6522:18;;69710:36:0;6375:274:1;69657:101:0;-1:-1:-1;;;;;;69775:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;69549:260::o;96740:368::-;55982:13;:11;:13::i;:::-;96932:8:::1;96916:26;;;;;;96861:14;96876:8;96861:24;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;96845:50:::1;::::0;::::1;:::i;:::-;;;;;;;;:97:::0;96823:166:::1;;;::::0;-1:-1:-1;;;96823:166:0;;20780:2:1;96823:166:0::1;::::0;::::1;20762:21:1::0;20819:2;20799:18;;;20792:30;-1:-1:-1;;;20838:18:1;;;20831:49;20897:18;;96823:166:0::1;20578:343:1::0;96823:166:0::1;97029:22;;;;;;;;97042:8;97029:22;;::::0;97002:14:::1;97017:8;97002:24;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:49;;:24;;:49:::1;::::0;:24;:49:::1;:::i;:::-;;;;;97067:33;97091:8;97067:33;;;;;;:::i;41176:134::-:0;41263:39;41280:4;41286:2;41290:7;41263:39;;;;;;;;;;;;:16;:39::i;:::-;41176:134;;;:::o;77234:318::-;77502:42;77518:1;77522:7;8662:10;40942:7;:34::i;94781:889::-;94865:17;94895:19;94917:22;:12;76192:14;;76100:114;94917:22;94895:44;;94950:26;95053:9;95048:157;95073:11;95068:1;:16;95048:157;;95110:12;;;;:9;:12;;;;;:19;;;-1:-1:-1;;;;;95110:27:0;;;:19;;:27;95106:88;;95158:20;;;;:::i;:::-;;;;95106:88;95086:3;;;;:::i;:::-;;;;95048:157;;;;95275:31;95324:18;-1:-1:-1;;;;;95309:34:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;95309:34:0;;;;;;;;;;;;;;;;;95275:68;;95354:13;95437:9;95432:198;95457:11;95452:1;:16;95432:198;;95494:12;;;;:9;:12;;;;;:19;;;-1:-1:-1;;;;;95494:27:0;;;:19;;:27;95490:129;;95565:12;;;;:9;:12;;;;;;;;;95542:35;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;95542:35:0;;;;;;;;;;;;;;;;;:20;;:13;;95556:5;;95542:20;;;;;;:::i;:::-;;;;;;:35;;;;95596:7;;;;;:::i;:::-;;;;95490:129;95470:3;;;;:::i;:::-;;;;95432:198;;;-1:-1:-1;95649:13:0;;94781:889;-1:-1:-1;;;;;94781:889:0:o;70066:231::-;70132:7;70165:13;69964:10;:17;;69885:104;70165:13;70156:5;:22;70152:103;;70202:41;;-1:-1:-1;;;70202:41:0;;70233:1;70202:41;;;6549:51:1;6616:18;;;6609:34;;;6522:18;;70202:41:0;6375:274:1;70152:103:0;70272:10;70283:5;70272:17;;;;;;;;:::i;:::-;;;;;;;;;70265:24;;70066:231;;;:::o;84792:260::-;84893:26;;;;;;;;;;84855:7;84934:18;;;:9;:18;;;;;;;:23;;84930:79;;84981:16;;-1:-1:-1;;;84981:16:0;;;;;;;;;;;84930:79;85026:18;;;;:9;:18;;;;;;;84792:260;-1:-1:-1;;84792:260:0:o;99357:868::-;55982:13;:11;:13::i;:::-;99535:21:::1;99515:14;;99499:32;;;;;;;:::i;:::-;;;;;;;;:57:::0;99495:652:::1;;99573:18;:32:::0;;;99495:652:::1;;;99677:25;99657:14;;99641:32;;;;;;;:::i;:::-;;;;;;;;:61:::0;99623:524:::1;;99729:28;:42:::0;;;99623:524:::1;;;-1:-1:-1::0;;;;;;;;;;;99809:14:0::1;;99793:32;;;;;;;:::i;:::-;;;;;;;;:56:::0;99789:358:::1;;99866:23;:37:::0;;;99789:358:::1;;;99975:25;99955:14;;99939:32;;;;;;;:::i;:::-;;;;;;;;:61:::0;99921:226:::1;;100027:28;:42:::0;;;99921:226:::1;;;100102:33;::::0;-1:-1:-1;;;100102:33:0;;23401:2:1;100102:33:0::1;::::0;::::1;23383:21:1::0;23440:2;23420:18;;;23413:30;23479:25;23459:18;;;23452:53;23522:18;;100102:33:0::1;23199:347:1::0;99921:226:0::1;100164:53;100189:14;;100205:11;100164:53;;;;;;;;:::i;:::-;;;;;;;;99357:868:::0;;;:::o;38489:120::-;38552:7;38579:22;38593:7;38579:13;:22::i;93361:158::-;55982:13;:11;:13::i;:::-;93435:16:::1;:27:::0;;-1:-1:-1;;93435:27:0::1;::::0;::::1;;::::0;;::::1;::::0;;;93478:33:::1;::::0;540:41:1;;;93478:33:0::1;::::0;528:2:1;513:18;93478:33:0::1;400:187:1::0;101427:534:0;101552:7;101632:27;101662:11;101674:7;101662:20;;;;;;:::i;:::-;;;;;;;;;;;;;101683:10;101662:32;;;;;;:::i;:::-;;;;;;;;;;;;;:40;;;101632:70;;101783:19;101806:1;101783:24;101779:74;;101839:1;101824:17;;;;;101779:74;101925:28;101933:19;101925:7;:28::i;:::-;101918:35;101427:534;-1:-1:-1;;;;101427:534:0:o;38214:213::-;38277:7;-1:-1:-1;;;;;38301:19:0;;38297:89;;38344:30;;-1:-1:-1;;;38344:30:0;;38371:1;38344:30;;;1510:51:1;1483:18;;38344:30:0;1364:203:1;38297:89:0;-1:-1:-1;;;;;;38403:16:0;;;;;:9;:16;;;;;;;38214:213::o;101237:118::-;55982:13;:11;:13::i;:::-;101308:39:::1;::::0;-1:-1:-1;;;101308:39:0;;24076:2:1;101308:39:0::1;::::0;::::1;24058:21:1::0;24115:2;24095:18;;;24088:30;24154:31;24134:18;;;24127:59;24203:18;;101308:39:0::1;23874:353:1::0;82556:94:0;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;38836:95::-;38883:13;38916:7;38909:14;;;;;:::i;40078:146::-;40164:52;8662:10;40197:8;40207;40164:18;:52::i;95678:992::-;95775:21;95809:19;95831:22;:12;76192:14;;76100:114;95831:22;95809:44;;95864:30;95975:9;95970:167;95995:11;95990:1;:16;95970:167;;96032:16;;;;:13;:16;;;;;:25;;;-1:-1:-1;;;;;96032:33:0;;;:25;;:33;96028:98;;96086:24;;;;:::i;:::-;;;;96028:98;96008:3;;;;:::i;:::-;;;;95970:167;;;;96211:39;96286:22;-1:-1:-1;;;;;96253:66:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;96253:66:0;;;;;;;;;;;;;;;;;96211:108;;96332:13;96419:9;96414:212;96439:11;96434:1;:16;96414:212;;96476:16;;;;:13;:16;;;;;:25;;;-1:-1:-1;;;;;96476:33:0;;;:25;;:33;96472:143;;96557:16;;;;:13;:16;;;;;;;;;96530:43;;;;;;;;;;;;;;;-1:-1:-1;;;;;96530:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:24;;:17;;96548:5;;96530:24;;;;;;:::i;:::-;;;;;;:43;;;;96592:7;;;;;:::i;:::-;;;;96472:143;96452:3;;;;:::i;:::-;;;;96414:212;;41381:211;41495:31;41508:4;41514:2;41518:7;41495:12;:31::i;:::-;41537:47;41560:4;41566:2;41570:7;41579:4;41537:22;:47::i;83057:67::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;105628:171::-;105735:13;105768:23;105783:7;105768:14;:23::i;99081:236::-;55982:13;:11;:13::i;:::-;99203:15:::1;:26:::0;;-1:-1:-1;;;;;;99203:26:0::1;-1:-1:-1::0;;;;;99203:26:0;::::1;::::0;;::::1;::::0;;;99240:7:::1;:14:::0;;;99272:37:::1;::::0;4122:25:1;;;99272:37:0::1;::::0;4110:2:1;4095:18;99272:37:0::1;;;;;;;99081:236:::0;;:::o;97168:363::-;97284:7;97304:25;97332:14;97347:7;97332:23;;;;;;:::i;:::-;;;;;;;;;;;;;97356:10;97332:35;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;97304:63;;;;;;;;;;;;;;;97332:35;97304:63;;;97332:35;97304:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;97378:13;97413:9;97408:93;97432:8;:15;97428:1;:19;97408:93;;;97478:8;97487:1;97478:11;;;;;;;;:::i;:::-;;;;;;;97469:20;;;;;:::i;:::-;;-1:-1:-1;97449:3:0;;97408:93;;;-1:-1:-1;97518:5:0;97168:363;-1:-1:-1;;;;97168:363:0:o;100269:909::-;55982:13;:11;:13::i;:::-;100451:25:::1;100431:14;;100415:32;;;;;;;:::i;:::-;;;;;;;;:61:::0;100411:685:::1;;100493:35;:49:::0;;;100411:685:::1;;;-1:-1:-1::0;;;;;;;;;;;100580:14:0::1;;100564:32;;;;;;;:::i;:::-;;;;;;;;:56:::0;100560:536:::1;;100637:30;:44:::0;;;100560:536:::1;;;100753:25;100733:14;;100717:32;;;;;;;:::i;:::-;;;;;;;;:61:::0;100699:397:::1;;100805:35;:49:::0;;;100699:397:::1;;;100926:27;100906:14;;100890:32;;;;;;;:::i;:::-;;;;;;;;:63:::0;100872:224:::1;;100980:24;:38:::0;;;100872:224:::1;101113:57;101142:14;;101158:11;101113:57;;;;;;;;:::i;40295:155::-:0;-1:-1:-1;;;;;40407:25:0;;;40383:4;40407:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;40295:155::o;93558:1177::-;93829:5;;93800:7;;93829:5;;93828:6;93820:34;;;;-1:-1:-1;;;93820:34:0;;24434:2:1;93820:34:0;;;24416:21:1;24473:2;24453:18;;;24446:30;-1:-1:-1;;;24492:18:1;;;24485:45;24547:18;;93820:34:0;24232:339:1;93820:34:0;-1:-1:-1;;;;;93873:17:0;;:10;:17;93865:60;;;;-1:-1:-1;;;93865:60:0;;24778:2:1;93865:60:0;;;24760:21:1;24817:2;24797:18;;;24790:30;24856:32;24836:18;;;24829:60;24906:18;;93865:60:0;24576:354:1;93865:60:0;93957:18;93966:8;93957;:18::i;:::-;93944:9;:31;;93936:62;;;;-1:-1:-1;;;93936:62:0;;25137:2:1;93936:62:0;;;25119:21:1;25176:2;25156:18;;;25149:30;-1:-1:-1;;;25195:18:1;;;25188:48;25253:18;;93936:62:0;24935:342:1;93936:62:0;94013:16;;;;94009:214;;;94137:20;;94099:11;94082:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;94072:40;;;;;;:85;94046:165;;;;-1:-1:-1;;;94046:165:0;;25484:2:1;94046:165:0;;;25466:21:1;25523:2;25503:18;;;25496:30;-1:-1:-1;;;25542:18:1;;;25535:48;25600:18;;94046:165:0;25282:342:1;94046:165:0;94235:15;94253:22;:12;76192:14;;76100:114;94253:22;94235:40;;94336:54;94349:8;94359:7;94368:8;94378:11;94336:12;:54::i;:::-;94467:59;94480:3;94485:8;94495;94505:11;94518:7;94467:12;:59::i;:::-;94558:29;;;;;;;;;;;;;;;;;;-1:-1:-1;94539:16:0;;;:7;:16;;;;;;;:48;;:16;;:48;;:16;:48;:::i;:::-;;;;;;;;;;;;;94600:30;94610:10;94622:7;94600:9;:30::i;:::-;94641:26;94654:7;94663:3;94641:12;:26::i;:::-;94678:24;:12;76311:19;;76329:1;76311:19;;;76222:127;94678:24;94720:7;93558:1177;-1:-1:-1;;;;;;;93558:1177:0:o;57029:220::-;55982:13;:11;:13::i;:::-;-1:-1:-1;;;;;57114:22:0;::::1;57110:93;;57160:31;::::0;-1:-1:-1;;;57160:31:0;;57188:1:::1;57160:31;::::0;::::1;1510:51:1::0;1483:18;;57160:31:0::1;1364:203:1::0;57110:93:0::1;57213:28;57232:8;57213:18;:28::i;:::-;57029:220:::0;:::o;69241:224::-;69343:4;-1:-1:-1;;;;;;69367:50:0;;-1:-1:-1;;;69367:50:0;;:90;;;69421:36;69445:11;69421:23;:36::i;52823:247::-;52886:7;42209:16;;;:7;:16;;;;;;-1:-1:-1;;;;;42209:16:0;;52950:90;;52997:31;;-1:-1:-1;;;52997:31:0;;;;;4122:25:1;;;4095:18;;52997:31:0;3976:177:1;56261:166:0;56169:6;;-1:-1:-1;;;;;56169:6:0;8662:10;56321:23;56317:103;;56368:40;;-1:-1:-1;;;56368:40:0;;8662:10;56368:40;;;1510:51:1;1483:18;;56368:40:0;1364:203:1;56317:103:0;56261:166::o;51055:122::-;51136:33;51145:2;51149:7;51158:4;51164;51136:8;:33::i;105214:214::-;105361:7;105388:32;105402:2;105406:7;105415:4;105388:13;:32::i;52262:318::-;-1:-1:-1;;;;;52370:22:0;;52366:93;;52416:31;;-1:-1:-1;;;52416:31:0;;-1:-1:-1;;;;;1528:32:1;;52416:31:0;;;1510:51:1;1483:18;;52416:31:0;1364:203:1;52366:93:0;-1:-1:-1;;;;;52469:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;52469:46:0;;;;;;;;;;52531:41;;540::1;;;52531::0;;513:18:1;52531:41:0;;;;;;;52262:318;;;:::o;53620:799::-;-1:-1:-1;;;;;53737:14:0;;;:18;53733:679;;53776:71;;-1:-1:-1;;;53776:71:0;;-1:-1:-1;;;;;53776:36:0;;;;;:71;;8662:10;;53827:4;;53833:7;;53842:4;;53776:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53776:71:0;;;;;;;;-1:-1:-1;;53776:71:0;;;;;;;;;;;;:::i;:::-;;;53772:629;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54090:6;:13;54107:1;54090:18;54086:300;;54140:25;;-1:-1:-1;;;54140:25:0;;-1:-1:-1;;;;;1528:32:1;;54140:25:0;;;1510:51:1;1483:18;;54140:25:0;1364:203:1;54086:300:0;54336:6;54330:13;54321:6;54317:2;54313:15;54306:38;53772:629;-1:-1:-1;;;;;;53895:51:0;;-1:-1:-1;;;53895:51:0;53891:132;;53978:25;;-1:-1:-1;;;53978:25:0;;-1:-1:-1;;;;;1528:32:1;;53978:25:0;;;1510:51:1;1483:18;;53978:25:0;1364:203:1;53891:132:0;53848:190;53620:799;;;;:::o;59844:609::-;59917:13;59943:22;59957:7;59943:13;:22::i;:::-;-1:-1:-1;59978:23:0;60004:19;;;:10;:19;;;;;59978:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60034:18;60055:10;39588:9;;;;;;;;;-1:-1:-1;39588:9:0;;;39511:94;60055:10;60034:31;;60147:4;60141:18;60163:1;60141:23;60137:72;;-1:-1:-1;60188:9:0;59844:609;-1:-1:-1;;59844:609:0:o;60137:72::-;60310:23;;:27;60306:97;;60375:4;60381:9;60361:30;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60354:37;;;;59844:609;;;:::o;60306:97::-;60422:23;60437:7;60422:14;:23::i;85093:437::-;85764:12;;;;;;;;;;;;-1:-1:-1;;;85764:12:0;;;;;85718:26;;;;;;85748:30;85718:60;85274:51;;;;;85306:19;85316:8;85306:9;:19::i;:::-;85270:253;;;85346:39;85363:8;85373:11;85346:16;:39::i;:::-;85342:110;;;85413:23;;-1:-1:-1;;;85413:23:0;;;;;;;;;;;85342:110;85466:45;85480:8;85490:11;85503:7;85466:13;:45::i;91379:1494::-;91597:9;91578:16;91639:106;91685:3;91597:9;91726:8;91639:31;:106::i;:::-;91619:126;;91756:23;91782:149;91818:7;91840:8;91863:11;91889:8;91912;91782:21;:149::i;:::-;91756:175;;91942:21;91966:124;92011:7;92033:8;92056:23;;91966:30;:124::i;:::-;91942:148;;92239:8;92106:178;92138:15;;;;;;;;;-1:-1:-1;;;;;92138:15:0;92211:13;92262:11;92106:178;;;;;;;;:::i;:::-;;;;;;;;92295:23;92321:112;92371:8;92394:28;;92321:35;:112::i;:::-;92481:20;;92449:191;;92295:138;;-1:-1:-1;92595:8:0;;92449:191;;;;-1:-1:-1;;;;;92481:20:0;;;;92295:138;;92618:11;;92449:191;:::i;:::-;;;;;;;;92653:22;92789:13;92758:15;92727;92678:33;92702:9;92678:8;:33;:::i;:::-;:64;;;;:::i;:::-;:95;;;;:::i;:::-;:124;;;;:::i;:::-;92823:16;;92815:50;;92653:149;;-1:-1:-1;;;;;;92823:16:0;;92815:50;;;;;92653:149;;92823:16;92815:50;92823:16;92815:50;92653:149;92823:16;92815:50;;;;;;;;;;;;;;;;;;;;;91567:1306;;;;;;91379:1494;;;;;:::o;47174:102::-;47242:26;47252:2;47256:7;47242:26;;;;;;;;;;;;:9;:26::i;60579:170::-;60671:19;;;;:10;:19;;;;;:31;60693:9;60671:19;:31;:::i;:::-;-1:-1:-1;60718:23:0;;4122:25:1;;;60718:23:0;;4110:2:1;4095:18;60718:23:0;3976:177:1;57409:191:0;57502:6;;;-1:-1:-1;;;;;57519:17:0;;;-1:-1:-1;;;;;;57519:17:0;;;;;;;57552:40;;57502:6;;;57519:17;57502:6;;57552:40;;57483:16;;57552:40;57472:128;57409:191;:::o;63694:215::-;63796:4;-1:-1:-1;;;;;;63820:41:0;;-1:-1:-1;;;63820:41:0;;:81;;;63865:36;63889:11;63865:23;:36::i;51365:678::-;51527:9;:31;;;-1:-1:-1;;;;;;51540:18:0;;;;51527:31;51523:471;;;51575:13;51591:22;51605:7;51591:13;:22::i;:::-;51575:38;-1:-1:-1;;;;;;51744:18:0;;;;;;:35;;;51775:4;-1:-1:-1;;;;;51766:13:0;:5;-1:-1:-1;;;;;51766:13:0;;;51744:35;:69;;;;;51784:29;51801:5;51808:4;51784:16;:29::i;:::-;51783:30;51744:69;51740:144;;;51841:27;;-1:-1:-1;;;51841:27:0;;-1:-1:-1;;;;;1528:32:1;;51841:27:0;;;1510:51:1;1483:18;;51841:27:0;1364:203:1;51740:144:0;51904:9;51900:83;;;51959:7;51955:2;-1:-1:-1;;;;;51939:28:0;51948:5;-1:-1:-1;;;;;51939:28:0;;;;;;;;;;;51900:83;51560:434;51523:471;-1:-1:-1;;52006:24:0;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;52006:29:0;-1:-1:-1;;;;;52006:29:0;;;;;;;;;;51365:678::o;70358:640::-;70453:7;70473:21;70497:32;70511:2;70515:7;70524:4;70497:13;:32::i;:::-;70473:56;-1:-1:-1;;;;;;70546:27:0;;70542:214;;70590:40;70622:7;71822:10;:17;;71795:24;;;;:15;:24;;;;;:44;;;71850:24;;;;;;;;;;;;71718:164;70590:40;70542:214;;;70669:2;-1:-1:-1;;;;;70652:19:0;:13;-1:-1:-1;;;;;70652:19:0;;70648:108;;70688:56;70721:13;70736:7;70688:32;:56::i;:::-;-1:-1:-1;;;;;70770:16:0;;70766:192;;70803:45;70840:7;70803:36;:45::i;:::-;70766:192;;;70887:2;-1:-1:-1;;;;;70870:19:0;:13;-1:-1:-1;;;;;70870:19:0;;70866:92;;70906:40;70934:2;70938:7;70906:27;:40::i;39002:260::-;39066:13;39092:22;39106:7;39092:13;:22::i;:::-;;39127:21;39151:10;39588:9;;;;;;;;;-1:-1:-1;39588:9:0;;;39511:94;39151:10;39127:34;;39203:1;39185:7;39179:21;:25;:75;;;;;;;;;;;;;;;;;39221:7;39230:18;:7;:16;:18::i;:::-;39207:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;39179:75;39172:82;39002:260;-1:-1:-1;;;39002:260:0:o;86568:480::-;86634:4;86729:14;86744:8;86729:24;;;;;;:::i;:::-;;;;;;;;;;;;;;86723:46;;;;;:::i;:::-;;;86773:1;86723:51;86719:134;;-1:-1:-1;86798:5:0;;86568:480;-1:-1:-1;86568:480:0:o;86719:134::-;87030:8;87014:26;;;;;;86963:14;86978:8;86963:24;;;;;;:::i;:::-;;;;;;;;;;;;;;86947:50;;;:::i;:::-;;;;;;;;:93;86927:113;;86568:480;;;:::o;85883:305::-;86008:4;86167:11;86151:29;;;;;;86090:11;86102:8;86090:21;;;;;;:::i;:::-;;;;;;;;;;;;;86112:11;86090:34;;;;;;:::i;:::-;;;;;;;;;;;;;:41;;86073:59;;;;;;;;:::i;:::-;;;;;;;;;;;;;86045:102;;;;;;:135;86025:155;;85883:305;;;;:::o;86245:282::-;86427:92;;;;;;;;86452:7;86427:92;;;;86474:8;86427:92;;;;86497:11;86427:92;;;86390:11;86402:8;86390:21;;;;;;:::i;:::-;;;;;;;;;;;;;86412:11;86390:34;;;;;;:::i;:::-;;;;;;;;;;;;;;;:129;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;86390:129:0;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;86245:282:0:o;87531:690::-;87672:7;;-1:-1:-1;;;;;87728:17:0;;;87724:381;;78140:5;87786:18;;87775:8;:29;;;;:::i;:::-;87774:49;;;;:::i;:::-;87846:26;;87838:55;;87762:61;;-1:-1:-1;;;;;;87846:26:0;;87838:55;;;;;87762:61;;87846:26;87838:55;87846:26;87838:55;87762:61;87846:26;87838:55;;;;;;;;;;;;;;;;;;;;-1:-1:-1;88004:26:0;;87913:180;;;28437:25:1;;;-1:-1:-1;;;;;88004:26:0;;;28493:2:1;28478:18;;28471:60;28567:2;28547:18;;;28540:30;;;28606:2;28586:18;;;28579:30;28646:29;28640:3;28625:19;;28618:58;87950:7:0;;87913:180;;28518:3:1;28693:19;87913:180:0;;;;;;;87724:381;88136:50;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;88136:50:0;;;;;;;;;88170:15;88136:50;;;;;;-1:-1:-1;88115:18:0;;;:9;:18;;;;;;;:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;88115:71:0;;;;;;;;;;;;;;;;;;;88136:50;87531:690;-1:-1:-1;;87531:690:0:o;88270:2147::-;88481:7;;88543:38;88573:7;88543:29;:38::i;:::-;88539:1838;;;88675:48;;;;;;;;;;;;;;;;;;-1:-1:-1;88598:74:0;;;:32;:74;;;;;;;:125;;:74;;:125;;:74;:125;:::i;:::-;-1:-1:-1;88598:125:0;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;88785:28:0;;78140:5;;-1:-1:-1;88774:39:0;;:8;:39;:::i;:::-;88773:76;;;;:::i;:::-;88738:111;;88870:39;88887:8;88897:11;88870:16;:39::i;:::-;88866:853;;;88938:26;;88930:61;;-1:-1:-1;;;;;88938:26:0;;;;88930:61;;;;;88975:15;;88938:26;88930:61;88938:26;88930:61;88975:15;88938:26;88930:61;;;;;;;;;;;;;;;;;;;;;89010:15;89028:11;89040:8;89028:21;;;;;;:::i;:::-;;;;;;;;;;;;;89050:11;89028:34;;;;;;:::i;:::-;;;;;;;;;;;;;;:42;;-1:-1:-1;89028:42:0;89110:16;89028:42;89110:7;:16::i;:::-;89171:171;;;;;;;;;;;-1:-1:-1;;;;;89171:171:0;;;;;;;;;;;;;;;;89308:15;89171:171;;;;;;-1:-1:-1;89145:23:0;;;:13;:23;;;;;;;:197;;;;;;;;;;;-1:-1:-1;;;;;;89145:197:0;;;;;;;;;;;;;;;;;;;;89366:237;89171:171;;-1:-1:-1;89171:171:0;;89366:237;;;;89171:171;;89479:11;;89171:171;;89366:237;:::i;:::-;;;;;;;;88911:708;;88539:1838;;88866:853;89644:14;89659:8;89644:24;;;;;;:::i;:::-;;;;;;;;;;;;;89669:11;89644:37;;;;;;:::i;:::-;;;;;;;;;;;;;;;:59;;;;;;;-1:-1:-1;89644:59:0;;;;;;;;;;88539:1838;;;89751:21;89775:34;89787:8;89797:11;89775;:34::i;:::-;89832:26;;89824:59;;89751:58;;-1:-1:-1;;;;;;89832:26:0;;89824:59;;;;;89751:58;;89832:26;89824:59;89832:26;89824:59;89751:58;89832:26;89824:59;;;;;;;;;;;;;;;;;;;;;89905:14;89920:8;89905:24;;;;;;:::i;:::-;;;;;;;;;;;;;89930:11;89905:37;;;;;;:::i;:::-;;;;;;;;;;;;;;89898:44;;;;:::i;:::-;89983:149;;;;;;;;;;;90041:10;89983:149;;;;;;;;;;;;;90102:15;89983:149;;;;;;-1:-1:-1;89957:23:0;;;:13;:23;;;;;;;:175;;;;;;;;;;;-1:-1:-1;;;;;;89957:175:0;-1:-1:-1;;;;;89957:175:0;;;;;;;;;;;;;;;;;;;;;;;90154:211;;89983:149;;90154:211;;;;90041:10;89983:149;;90339:11;;90154:211;:::i;:::-;;;;;;;;89736:641;88539:1838;90394:15;88270:2147;-1:-1:-1;;;;;;88270:2147:0:o;90468:468::-;90733:7;;;;;;;;;;;;-1:-1:-1;;;90733:7:0;;;;;90688:25;;;;;;90628:7;;;;90688:54;;90684:214;;78140:5;90776:28;90787:17;90776:8;:28;:::i;:::-;90775:48;;;;:::i;:::-;90846:15;;90838:48;;90759:64;;-1:-1:-1;90846:15:0;;;-1:-1:-1;;;;;90846:15:0;;90838:48;;;;;90759:64;;90838:48;;;;90759:64;90846:15;90838:48;;;;;;;;;;;;;;;;;;;90992:357;91130:7;;78140:5;91177:33;91188:22;91177:8;:33;:::i;:::-;91176:66;;;;:::i;:::-;91261:20;;91253:55;;91150:92;;-1:-1:-1;;;;;;91261:20:0;;91253:55;;;;;91150:92;;91261:20;91253:55;91261:20;91253:55;91150:92;91261:20;91253:55;;;;;;;;;;;;;;;;;;;;-1:-1:-1;91326:15:0;90992:357;-1:-1:-1;;;90992:357:0:o;47503:185::-;47598:18;47604:2;47608:7;47598:5;:18::i;:::-;47627:53;47658:1;47662:2;47666:7;47675:4;47627:22;:53::i;59564:209::-;59666:4;-1:-1:-1;;;;;;59690:35:0;;-1:-1:-1;;;59690:35:0;;:75;;;59729:36;59753:11;59729:23;:36::i;45316:824::-;45402:7;42209:16;;;:7;:16;;;;;;-1:-1:-1;;;;;42209:16:0;;;;45517:18;;;45513:88;;45552:37;45569:4;45575;45581:7;45552:16;:37::i;:::-;-1:-1:-1;;;;;45648:18:0;;;45644:263;;45766:48;45783:1;45787:7;45804:1;45808:5;45766:8;:48::i;:::-;-1:-1:-1;;;;;45860:15:0;;;;;;:9;:15;;;;;:20;;-1:-1:-1;;45860:20:0;;;45644:263;-1:-1:-1;;;;;45923:16:0;;;45919:111;;-1:-1:-1;;;;;45985:13:0;;;;;;:9;:13;;;;;:18;;46002:1;45985:18;;;45919:111;46042:16;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;46042:21:0;-1:-1:-1;;;;;46042:21:0;;;;;;;;;46081:27;;46042:16;;46081:27;;;;;;;46128:4;45316:824;-1:-1:-1;;;;45316:824:0:o;72509:977::-;72775:22;72800:15;72810:4;72800:9;:15::i;:::-;72826:18;72847:26;;;:17;:26;;;;;;72775:40;;-1:-1:-1;72980:28:0;;;72976:328;;-1:-1:-1;;;;;73047:18:0;;73025:19;73047:18;;;:12;:18;;;;;;;;:34;;;;;;;;;73098:30;;;;;;:44;;;73215:30;;:17;:30;;;;;:43;;;72976:328;-1:-1:-1;73400:26:0;;;;:17;:26;;;;;;;;73393:33;;;-1:-1:-1;;;;;73444:18:0;;;;;:12;:18;;;;;:34;;;;;;;73437:41;72509:977::o;73781:1079::-;74059:10;:17;74034:22;;74059:21;;74079:1;;74059:21;:::i;:::-;74091:18;74112:24;;;:15;:24;;;;;;74485:10;:26;;74034:46;;-1:-1:-1;74112:24:0;;74034:46;;74485:26;;;;;;:::i;:::-;;;;;;;;;74463:48;;74549:11;74524:10;74535;74524:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;74629:28;;;:15;:28;;;;;;;:41;;;74801:24;;;;;74794:31;74836:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;73852:1008;;;73781:1079;:::o;71299:218::-;71384:14;71417:1;71401:13;71411:2;71401:9;:13::i;:::-;:17;;;;:::i;:::-;-1:-1:-1;;;;;71429:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;71474:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;71299:218:0:o;26398:718::-;26454:13;26505:14;26522:17;26533:5;26522:10;:17::i;:::-;26542:1;26522:21;26505:38;;26558:20;26592:6;-1:-1:-1;;;;;26581:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26581:18:0;-1:-1:-1;26558:41:0;-1:-1:-1;26723:28:0;;;26739:2;26723:28;26780:290;-1:-1:-1;;26812:5:0;-1:-1:-1;;;26949:2:0;26938:14;;26933:32;26812:5;26920:46;27012:2;27003:11;;;-1:-1:-1;27033:21:0;26780:290;27033:21;-1:-1:-1;27091:6:0;26398:718;-1:-1:-1;;;26398:718:0:o;87056:417::-;87241:8;;;;;;;;;;;;-1:-1:-1;;;87241:8:0;;;;;87195:26;;;;;;87158:4;;87225:26;87195:56;;:125;;-1:-1:-1;87314:4:0;;;;;;;;;;;;-1:-1:-1;;;87314:4:0;;;;;87268:26;;;;;;87298:22;87268:52;87195:125;:198;;;-1:-1:-1;87383:8:0;;;;;;;;;;;;-1:-1:-1;;;87383:8:0;;;;;87337:26;;;;;;87367;87337:56;87195:198;:270;;;-1:-1:-1;;87456:7:0;;;;;;;;;;;;-1:-1:-1;;;87456:7:0;;;;;87410:26;;;;;-1:-1:-1;;;;;;;;;;;87410:55:0;;87056:417::o;46476:335::-;-1:-1:-1;;;;;46544:16:0;;46540:89;;46584:33;;-1:-1:-1;;;46584:33:0;;46614:1;46584:33;;;1510:51:1;1483:18;;46584:33:0;1364:203:1;46540:89:0;46639:21;46663:32;46671:2;46675:7;46692:1;46663:7;:32::i;:::-;46639:56;-1:-1:-1;;;;;;46710:27:0;;;46706:98;;46761:31;;-1:-1:-1;;;46761:31:0;;46789:1;46761:31;;;1510:51:1;1483:18;;46761:31:0;1364:203:1;37845:305:0;37947:4;-1:-1:-1;;;;;;37984:40:0;;-1:-1:-1;;;37984:40:0;;:105;;-1:-1:-1;;;;;;;38041:48:0;;-1:-1:-1;;;38041:48:0;37984:105;:158;;;-1:-1:-1;;;;;;;;;;29814:40:0;;;38106:36;29714:148;43523:376;43636:38;43650:5;43657:7;43666;43636:13;:38::i;:::-;43631:261;;-1:-1:-1;;;;;43695:19:0;;43691:190;;43742:31;;-1:-1:-1;;;43742:31:0;;;;;4122:25:1;;;4095:18;;43742:31:0;3976:177:1;43691:190:0;43821:44;;-1:-1:-1;;;43821:44:0;;-1:-1:-1;;;;;6567:32:1;;43821:44:0;;;6549:51:1;6616:18;;;6609:34;;;6522:18;;43821:44:0;6375:274:1;21462:948:0;21515:7;;-1:-1:-1;;;21593:17:0;;21589:106;;-1:-1:-1;;;21631:17:0;;;-1:-1:-1;21677:2:0;21667:12;21589:106;21722:8;21713:5;:17;21709:106;;21760:8;21751:17;;;-1:-1:-1;21797:2:0;21787:12;21709:106;21842:8;21833:5;:17;21829:106;;21880:8;21871:17;;;-1:-1:-1;21917:2:0;21907:12;21829:106;21962:7;21953:5;:16;21949:103;;21999:7;21990:16;;;-1:-1:-1;22035:1:0;22025:11;21949:103;22079:7;22070:5;:16;22066:103;;22116:7;22107:16;;;-1:-1:-1;22152:1:0;22142:11;22066:103;22196:7;22187:5;:16;22183:103;;22233:7;22224:16;;;-1:-1:-1;22269:1:0;22259:11;22183:103;22313:7;22304:5;:16;22300:68;;22351:1;22341:11;22396:6;21462:948;-1:-1:-1;;21462:948:0:o;42803:276::-;42906:4;-1:-1:-1;;;;;42943:21:0;;;;;;:128;;;42991:7;-1:-1:-1;;;;;42982:16:0;:5;-1:-1:-1;;;;;42982:16:0;;:52;;;;43002:32;43019:5;43026:7;43002:16;:32::i;:::-;42982:88;;;-1:-1:-1;;42424:7:0;42451:24;;;:15;:24;;;;;;-1:-1:-1;;;;;42451:24:0;;;43038:32;;;;;-1:-1:-1;42803:276:0:o;-1:-1:-1:-;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:300::-;645:3;683:5;677:12;710:6;705:3;698:19;766:6;759:4;752:5;748:16;741:4;736:3;732:14;726:47;818:1;811:4;802:6;797:3;793:16;789:27;782:38;881:4;874:2;870:7;865:2;857:6;853:15;849:29;844:3;840:39;836:50;829:57;;;592:300;;;;:::o;897:231::-;1046:2;1035:9;1028:21;1009:4;1066:56;1118:2;1107:9;1103:18;1095:6;1066:56;:::i;1133:226::-;1192:6;1245:2;1233:9;1224:7;1220:23;1216:32;1213:52;;;1261:1;1258;1251:12;1213:52;-1:-1:-1;1306:23:1;;1133:226;-1:-1:-1;1133:226:1:o;1572:127::-;1633:10;1628:3;1624:20;1621:1;1614:31;1664:4;1661:1;1654:15;1688:4;1685:1;1678:15;1704:716;1769:5;1801:1;-1:-1:-1;;;;;1817:6:1;1814:30;1811:56;;;1847:18;;:::i;:::-;-1:-1:-1;2002:2:1;1996:9;-1:-1:-1;;1915:2:1;1894:15;;1890:29;;2060:2;2048:15;2044:29;2032:42;;2125:22;;;-1:-1:-1;;;;;2089:34:1;;2086:62;2083:88;;;2151:18;;:::i;:::-;2187:2;2180:22;2235;;;2220:6;-1:-1:-1;2220:6:1;2272:16;;;2269:25;-1:-1:-1;2266:45:1;;;2307:1;2304;2297:12;2266:45;2357:6;2352:3;2345:4;2337:6;2333:17;2320:44;2412:1;2405:4;2396:6;2388;2384:19;2380:30;2373:41;;1704:716;;;;;:::o;2425:222::-;2468:5;2521:3;2514:4;2506:6;2502:17;2498:27;2488:55;;2539:1;2536;2529:12;2488:55;2561:80;2637:3;2628:6;2615:20;2608:4;2600:6;2596:17;2561:80;:::i;2652:322::-;2721:6;2774:2;2762:9;2753:7;2749:23;2745:32;2742:52;;;2790:1;2787;2780:12;2742:52;2830:9;2817:23;-1:-1:-1;;;;;2855:6:1;2852:30;2849:50;;;2895:1;2892;2885:12;2849:50;2918;2960:7;2951:6;2940:9;2936:22;2918:50;:::i;2979:131::-;-1:-1:-1;;;;;3054:31:1;;3044:42;;3034:70;;3100:1;3097;3090:12;3115:134;3183:20;;3212:31;3183:20;3212:31;:::i;:::-;3115:134;;;:::o;3254:367::-;3322:6;3330;3383:2;3371:9;3362:7;3358:23;3354:32;3351:52;;;3399:1;3396;3389:12;3351:52;3438:9;3425:23;3457:31;3482:5;3457:31;:::i;:::-;3507:5;3585:2;3570:18;;;;3557:32;;-1:-1:-1;;;3254:367:1:o;3626:160::-;3691:20;;3747:13;;3740:21;3730:32;;3720:60;;3776:1;3773;3766:12;3791:180;3847:6;3900:2;3888:9;3879:7;3875:23;3871:32;3868:52;;;3916:1;3913;3906:12;3868:52;3939:26;3955:9;3939:26;:::i;4158:348::-;4210:8;4220:6;4274:3;4267:4;4259:6;4255:17;4251:27;4241:55;;4292:1;4289;4282:12;4241:55;-1:-1:-1;4315:20:1;;-1:-1:-1;;;;;4347:30:1;;4344:50;;;4390:1;4387;4380:12;4344:50;4427:4;4419:6;4415:17;4403:29;;4479:3;4472:4;4463:6;4455;4451:19;4447:30;4444:39;4441:59;;;4496:1;4493;4486:12;4511:554;4599:6;4607;4615;4668:2;4656:9;4647:7;4643:23;4639:32;4636:52;;;4684:1;4681;4674:12;4636:52;4724:9;4711:23;-1:-1:-1;;;;;4749:6:1;4746:30;4743:50;;;4789:1;4786;4779:12;4743:50;4828:59;4879:7;4870:6;4859:9;4855:22;4828:59;:::i;:::-;4906:8;;-1:-1:-1;4802:85:1;-1:-1:-1;;4991:2:1;4976:18;;4963:32;5004:31;4963:32;5004:31;:::i;:::-;5054:5;5044:15;;;4511:554;;;;;:::o;5070:436::-;5148:6;5156;5209:2;5197:9;5188:7;5184:23;5180:32;5177:52;;;5225:1;5222;5215:12;5177:52;5265:9;5252:23;-1:-1:-1;;;;;5290:6:1;5287:30;5284:50;;;5330:1;5327;5320:12;5284:50;5353;5395:7;5386:6;5375:9;5371:22;5353:50;:::i;:::-;5343:60;5472:2;5457:18;;;;5444:32;;-1:-1:-1;;;;5070:436:1:o;5511:508::-;5588:6;5596;5604;5657:2;5645:9;5636:7;5632:23;5628:32;5625:52;;;5673:1;5670;5663:12;5625:52;5712:9;5699:23;5731:31;5756:5;5731:31;:::i;:::-;5781:5;-1:-1:-1;5838:2:1;5823:18;;5810:32;5851:33;5810:32;5851:33;:::i;:::-;5511:508;;5903:7;;-1:-1:-1;;;5983:2:1;5968:18;;;;5955:32;;5511:508::o;6024:346::-;6092:6;6100;6153:2;6141:9;6132:7;6128:23;6124:32;6121:52;;;6169:1;6166;6159:12;6121:52;-1:-1:-1;;6214:23:1;;;6334:2;6319:18;;;6306:32;;-1:-1:-1;6024:346:1:o;6654:556::-;6741:6;6749;6757;6810:2;6798:9;6789:7;6785:23;6781:32;6778:52;;;6826:1;6823;6816:12;6778:52;6871:23;;;-1:-1:-1;6969:2:1;6954:18;;6941:32;-1:-1:-1;;;;;6985:30:1;;6982:50;;;7028:1;7025;7018:12;6982:50;7051;7093:7;7084:6;7073:9;7069:22;7051:50;:::i;:::-;6654:556;;7041:60;;-1:-1:-1;;;;7174:2:1;7159:18;;;;7146:32;;6654:556::o;7215:240::-;7298:12;;7286:25;;7360:4;7349:16;;;7343:23;7327:14;;;7320:47;7420:4;7409:16;;;7403:23;-1:-1:-1;;;;;7399:49:1;7383:14;;7376:73;7215:240::o;7460:972::-;7632:4;7674:3;7663:9;7659:19;7651:27;;7687:61;7738:9;7729:6;7723:13;7687:61;:::i;:::-;7795:4;7787:6;7783:17;7777:24;7810:71;7875:4;7864:9;7860:20;7846:12;7810:71;:::i;:::-;;7930:4;7922:6;7918:17;7912:24;7945:73;8012:4;8001:9;7997:20;7981:14;7945:73;:::i;:::-;;8067:4;8059:6;8055:17;8049:24;8082:75;8149:6;8138:9;8134:22;8118:14;8082:75;:::i;:::-;;8206:4;8198:6;8194:17;8188:24;8221:75;8288:6;8277:9;8273:22;8257:14;8221:75;:::i;:::-;-1:-1:-1;8354:4:1;8342:17;;8336:24;8327:6;8312:22;;8305:56;8419:4;8407:17;;;8401:24;8392:6;8377:22;;;8370:56;7460:972;:::o;8437:247::-;8496:6;8549:2;8537:9;8528:7;8524:23;8520:32;8517:52;;;8565:1;8562;8555:12;8517:52;8604:9;8591:23;8623:31;8648:5;8623:31;:::i;8689:886::-;8931:2;8943:21;;;9013:13;;8916:18;;;9035:22;;;8883:4;;9114:15;;;9088:2;9073:18;;;8883:4;9157:392;9171:6;9168:1;9165:13;9157:392;;;9230:13;;9268:9;;9256:22;;9326:2;9318:11;;;9312:18;9298:12;;;9291:40;9383:2;9375:11;;;9369:18;-1:-1:-1;;;;;9365:44:1;9351:12;;;9344:66;9460:4;9452:13;;;9446:20;9430:14;;;9423:44;;;;9524:15;;;;9496:4;9487:14;;;;9406:1;9186:9;9157:392;;9580:525;9660:6;9668;9676;9729:2;9717:9;9708:7;9704:23;9700:32;9697:52;;;9745:1;9742;9735:12;9697:52;9785:9;9772:23;-1:-1:-1;;;;;9810:6:1;9807:30;9804:50;;;9850:1;9847;9840:12;9804:50;9889:59;9940:7;9931:6;9920:9;9916:22;9889:59;:::i;:::-;9967:8;;9863:85;;-1:-1:-1;10071:2:1;10056:18;;;;10043:32;;9580:525;-1:-1:-1;;;;9580:525:1:o;10110:538::-;10198:6;10206;10259:2;10247:9;10238:7;10234:23;10230:32;10227:52;;;10275:1;10272;10265:12;10227:52;10315:9;10302:23;-1:-1:-1;;;;;10340:6:1;10337:30;10334:50;;;10380:1;10377;10370:12;10334:50;10403;10445:7;10436:6;10425:9;10421:22;10403:50;:::i;:::-;10393:60;;;10506:2;10495:9;10491:18;10478:32;-1:-1:-1;;;;;10525:8:1;10522:32;10519:52;;;10567:1;10564;10557:12;10519:52;10590;10634:7;10623:8;10612:9;10608:24;10590:52;:::i;:::-;10580:62;;;10110:538;;;;;:::o;10653:405::-;10850:2;10839:9;10832:21;10813:4;10876:56;10928:2;10917:9;10913:18;10905:6;10876:56;:::i;:::-;10980:9;10972:6;10968:22;10963:2;10952:9;10948:18;10941:50;11008:44;11045:6;11037;11008:44;:::i;:::-;11000:52;10653:405;-1:-1:-1;;;;;10653:405:1:o;11063:315::-;11128:6;11136;11189:2;11177:9;11168:7;11164:23;11160:32;11157:52;;;11205:1;11202;11195:12;11157:52;11244:9;11231:23;11263:31;11288:5;11263:31;:::i;:::-;11313:5;-1:-1:-1;11337:35:1;11368:2;11353:18;;11337:35;:::i;:::-;11327:45;;11063:315;;;;;:::o;11383:894::-;11633:2;11645:21;;;11715:13;;11618:18;;;11737:22;;;11585:4;;11816:15;;;11790:2;11775:18;;;11585:4;11859:392;11873:6;11870:1;11867:13;11859:392;;;11932:13;;11970:9;;11958:22;;12032:2;12024:11;;;12018:18;-1:-1:-1;;;;;12014:44:1;12000:12;;;11993:66;12107:2;12099:11;;;12093:18;12079:12;;;12072:40;12162:4;12154:13;;;12148:20;12132:14;;;12125:44;;;;12226:15;;;;12198:4;12189:14;;;;12055:1;11888:9;11859:392;;12282:847;12377:6;12385;12393;12401;12454:3;12442:9;12433:7;12429:23;12425:33;12422:53;;;12471:1;12468;12461:12;12422:53;12510:9;12497:23;12529:31;12554:5;12529:31;:::i;:::-;12579:5;-1:-1:-1;12636:2:1;12621:18;;12608:32;12649:33;12608:32;12649:33;:::i;:::-;12701:7;-1:-1:-1;12781:2:1;12766:18;;12753:32;;-1:-1:-1;12862:2:1;12847:18;;12834:32;-1:-1:-1;;;;;12878:30:1;;12875:50;;;12921:1;12918;12911:12;12875:50;12944:22;;12997:4;12989:13;;12985:27;-1:-1:-1;12975:55:1;;13026:1;13023;13016:12;12975:55;13049:74;13115:7;13110:2;13097:16;13092:2;13088;13084:11;13049:74;:::i;:::-;13039:84;;;12282:847;;;;;;;:::o;13134:476::-;13359:6;13348:9;13341:25;13402:2;13397;13386:9;13382:18;13375:30;13322:4;13428:56;13480:2;13469:9;13465:18;13457:6;13428:56;:::i;:::-;13532:9;13524:6;13520:22;13515:2;13504:9;13500:18;13493:50;13560:44;13597:6;13589;13560:44;:::i;13995:388::-;14063:6;14071;14124:2;14112:9;14103:7;14099:23;14095:32;14092:52;;;14140:1;14137;14130:12;14092:52;14179:9;14166:23;14198:31;14223:5;14198:31;:::i;:::-;14248:5;-1:-1:-1;14305:2:1;14290:18;;14277:32;14318:33;14277:32;14318:33;:::i;:::-;14370:7;14360:17;;;13995:388;;;;;:::o;14388:1263::-;14542:6;14550;14558;14566;14574;14582;14635:3;14623:9;14614:7;14610:23;14606:33;14603:53;;;14652:1;14649;14642:12;14603:53;14692:9;14679:23;-1:-1:-1;;;;;14717:6:1;14714:30;14711:50;;;14757:1;14754;14747:12;14711:50;14780;14822:7;14813:6;14802:9;14798:22;14780:50;:::i;:::-;14770:60;;;14883:2;14872:9;14868:18;14855:32;-1:-1:-1;;;;;14902:8:1;14899:32;14896:52;;;14944:1;14941;14934:12;14896:52;14967;15011:7;15000:8;14989:9;14985:24;14967:52;:::i;:::-;14957:62;;;15038:38;15072:2;15061:9;15057:18;15038:38;:::i;:::-;15028:48;;15129:2;15118:9;15114:18;15101:32;-1:-1:-1;;;;;15148:8:1;15145:32;15142:52;;;15190:1;15187;15180:12;15142:52;15213;15257:7;15246:8;15235:9;15231:24;15213:52;:::i;:::-;15203:62;;;15318:3;15307:9;15303:19;15290:33;-1:-1:-1;;;;;15338:8:1;15335:32;15332:52;;;15380:1;15377;15370:12;15332:52;15403;15447:7;15436:8;15425:9;15421:24;15403:52;:::i;:::-;15393:62;;;15508:3;15497:9;15493:19;15480:33;-1:-1:-1;;;;;15528:8:1;15525:32;15522:52;;;15570:1;15567;15560:12;15522:52;15593;15637:7;15626:8;15615:9;15611:24;15593:52;:::i;:::-;15583:62;;;14388:1263;;;;;;;;:::o;15656:380::-;15735:1;15731:12;;;;15778;;;15799:61;;15853:4;15845:6;15841:17;15831:27;;15799:61;15906:2;15898:6;15895:14;15875:18;15872:38;15869:161;;15952:10;15947:3;15943:20;15940:1;15933:31;15987:4;15984:1;15977:15;16015:4;16012:1;16005:15;15869:161;;15656:380;;;:::o;16041:212::-;16083:3;16121:5;16115:12;16165:6;16158:4;16151:5;16147:16;16142:3;16136:36;16227:1;16191:16;;16216:13;;;-1:-1:-1;16191:16:1;;16041:212;-1:-1:-1;16041:212:1:o;16258:192::-;16389:3;16414:30;16440:3;16432:6;16414:30;:::i;16802:271::-;16985:6;16977;16972:3;16959:33;16941:3;17011:16;;17036:13;;;17011:16;16802:271;-1:-1:-1;16802:271:1:o;17428:267::-;17517:6;17512:3;17505:19;17569:6;17562:5;17555:4;17550:3;17546:14;17533:43;-1:-1:-1;17621:1:1;17596:16;;;17614:4;17592:27;;;17585:38;;;;17677:2;17656:15;;;-1:-1:-1;;17652:29:1;17643:39;;;17639:50;;17428:267::o;17700:247::-;17859:2;17848:9;17841:21;17822:4;17879:62;17937:2;17926:9;17922:18;17914:6;17906;17879:62;:::i;17952:302::-;18129:2;18118:9;18111:21;18092:4;18149:56;18201:2;18190:9;18186:18;18178:6;18149:56;:::i;:::-;18141:64;;18241:6;18236:2;18225:9;18221:18;18214:34;17952:302;;;;;:::o;18635:127::-;18696:10;18691:3;18687:20;18684:1;18677:31;18727:4;18724:1;18717:15;18751:4;18748:1;18741:15;18767:168;18840:9;;;18871;;18888:15;;;18882:22;;18868:37;18858:71;;18909:18;;:::i;19072:217::-;19112:1;19138;19128:132;;19182:10;19177:3;19173:20;19170:1;19163:31;19217:4;19214:1;19207:15;19245:4;19242:1;19235:15;19128:132;-1:-1:-1;19274:9:1;;19072:217::o;19294:125::-;19359:9;;;19380:10;;;19377:36;;;19393:18;;:::i;19424:128::-;19491:9;;;19512:11;;;19509:37;;;19526:18;;:::i;19686:680::-;19739:3;19780:5;19774:12;19809:36;19835:9;19809:36;:::i;:::-;19876:1;19861:17;;19887:133;;;;20034:1;20029:331;;;;19854:506;;19887:133;-1:-1:-1;;19920:24:1;;19908:37;;19993:14;;19986:22;19974:35;;19965:45;;;-1:-1:-1;19887:133:1;;20029:331;20060:5;20057:1;20050:16;20107:4;20104:1;20094:18;20134:1;20148:166;20162:6;20159:1;20156:13;20148:166;;;20242:14;;20229:11;;;20222:35;20298:1;20285:15;;;;20184:4;20177:12;20148:166;;;20152:3;;20343:6;20338:3;20334:16;20327:23;;19854:506;;;;19686:680;;;;:::o;20371:202::-;20501:3;20526:41;20563:3;20555:6;20526:41;:::i;20926:518::-;21028:2;21023:3;21020:11;21017:421;;;21064:5;21061:1;21054:16;21108:4;21105:1;21095:18;21178:2;21166:10;21162:19;21159:1;21155:27;21149:4;21145:38;21214:4;21202:10;21199:20;21196:47;;;-1:-1:-1;21237:4:1;21196:47;21292:2;21287:3;21283:12;21280:1;21276:20;21270:4;21266:31;21256:41;;21347:81;21365:2;21358:5;21355:13;21347:81;;;21424:1;21410:16;;21391:1;21380:13;21347:81;;21620:1302;21746:3;21740:10;-1:-1:-1;;;;;21765:6:1;21762:30;21759:56;;;21795:18;;:::i;:::-;21824:97;21914:6;21874:38;21906:4;21900:11;21874:38;:::i;:::-;21868:4;21824:97;:::i;:::-;21970:4;22001:2;21990:14;;22018:1;22013:652;;;;22709:1;22726:6;22723:89;;;-1:-1:-1;22778:19:1;;;22772:26;22723:89;-1:-1:-1;;21577:1:1;21573:11;;;21569:24;21565:29;21555:40;21601:1;21597:11;;;21552:57;22825:81;;21983:933;;22013:652;19633:1;19626:14;;;19670:4;19657:18;;-1:-1:-1;;22049:20:1;;;22170:222;22184:7;22181:1;22178:14;22170:222;;;22266:19;;;22260:26;22245:42;;22373:4;22358:20;;;;22326:1;22314:14;;;;22200:12;22170:222;;;22174:3;22420:6;22411:7;22408:19;22405:201;;;22481:19;;;22475:26;-1:-1:-1;;22564:1:1;22560:14;;;22576:3;22556:24;22552:37;22548:42;22533:58;22518:74;;22405:201;-1:-1:-1;;;;22652:1:1;22636:14;;;22632:22;22619:36;;-1:-1:-1;21620:1302:1:o;22927:135::-;22966:3;22987:17;;;22984:43;;23007:18;;:::i;:::-;-1:-1:-1;23054:1:1;23043:13;;22927:135::o;23067:127::-;23128:10;23123:3;23119:20;23116:1;23109:31;23159:4;23156:1;23149:15;23183:4;23180:1;23173:15;23551:318;23738:2;23727:9;23720:21;23701:4;23758:62;23816:2;23805:9;23801:18;23793:6;23785;23758:62;:::i;:::-;23750:70;;23856:6;23851:2;23840:9;23836:18;23829:34;23551:318;;;;;;:::o;25629:496::-;-1:-1:-1;;;;;25860:32:1;;;25842:51;;25929:32;;25924:2;25909:18;;25902:60;25993:2;25978:18;;25971:34;;;26041:3;26036:2;26021:18;;26014:31;;;-1:-1:-1;;26062:57:1;;26099:19;;26091:6;26062:57;:::i;26130:249::-;26199:6;26252:2;26240:9;26231:7;26227:23;26223:32;26220:52;;;26268:1;26265;26258:12;26220:52;26300:9;26294:16;26319:30;26343:5;26319:30;:::i;26384:267::-;26563:3;26588:57;26614:30;26640:3;26632:6;26614:30;:::i;:::-;26606:6;26588:57;:::i;26656:656::-;26999:1;26995;26990:3;26986:11;26982:19;26974:6;26970:32;26959:9;26952:51;27039:3;27034:2;27023:9;27019:18;27012:31;27080:2;27074:3;27063:9;27059:19;27052:31;27120:28;27114:3;27103:9;27099:19;27092:57;27185:6;27180:2;27169:9;27165:18;27158:34;27228:3;27223:2;27212:9;27208:18;27201:31;26933:4;27249:57;27301:3;27290:9;27286:19;27278:6;27249:57;:::i;27317:662::-;27660:1;27656;27651:3;27647:11;27643:19;27635:6;27631:32;27620:9;27613:51;27700:3;27695:2;27684:9;27680:18;27673:31;27741:2;27735:3;27724:9;27720:19;27713:31;27781:34;27775:3;27764:9;27760:19;27753:63;27852:6;27847:2;27836:9;27832:18;27825:34;27895:3;27890:2;27879:9;27875:18;27868:31;27594:4;27916:57;27968:3;27957:9;27953:19;27945:6;27916:57;:::i;28723:693::-;-1:-1:-1;;;;;29029:32:1;;29011:51;;29098:3;29093:2;29078:18;;29071:31;;;-1:-1:-1;;29125:57:1;;29162:19;;29154:6;29125:57;:::i;:::-;29218:6;29213:2;29202:9;29198:18;29191:34;29273:9;29265:6;29261:22;29256:2;29245:9;29241:18;29234:50;29308:2;29300:6;29293:18;29344:33;29339:2;29331:6;29327:15;29320:58;29407:2;29399:6;29395:15;29387:23;;;28723:693;;;;;;:::o;29421:702::-;29756:1;29752;29747:3;29743:11;29739:19;29731:6;29727:32;29716:9;29709:51;29796:3;29791:2;29780:9;29776:18;29769:31;29837:2;29831:3;29820:9;29816:19;29809:31;29877:34;29871:3;29860:9;29856:19;29849:63;-1:-1:-1;;;29943:3:1;29932:9;29928:19;29921:39;29996:6;29991:2;29980:9;29976:18;29969:34;30039:3;30034:2;30023:9;30019:18;30012:31;29690:4;30060:57;30112:3;30101:9;30097:19;30089:6;30060:57;:::i;30128:127::-;30189:10;30184:3;30180:20;30177:1;30170:31;30220:4;30217:1;30210:15;30244:4;30241:1;30234:15
Swarm Source
ipfs://5451ff620a98e7201c878d3ab96ea5cf229c559889f52bf153ae05b32b2f8890
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.