NFT
Overview
TokenID
4955
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
ElementsNFT
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-04-01 */ // File: @openzeppelin/contracts/utils/math/Math.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @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 up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (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; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 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. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); 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 (rounding == Rounding.Up && 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 down. * * 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 + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * 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 + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * 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 + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * 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 10, 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 + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @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), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @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) { 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] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); 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); } } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The tree and the proofs can be generated using our * https://github.com/OpenZeppelin/merkle-tree[JavaScript library]. * You will find a quickstart guide in the readme. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. * OpenZeppelin's JavaScript library generates merkle trees that are safe * against this attack out of the box. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} * * _Available since v4.7._ */ function verifyCalldata( bytes32[] calldata proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} * * _Available since v4.7._ */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false * respectively. * * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer). * * _Available since v4.7._ */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev 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 { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: erc721a/contracts/IERC721A.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721A. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================================================= // IERC721 // ============================================================= /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables * (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, * checking first that contract recipients are aware of the ERC721 protocol * to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move * this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external payable; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Transfers `tokenId` from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} * whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external payable; /** * @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 payable; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================================================= // IERC721Metadata // ============================================================= /** * @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); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } // File: erc721a/contracts/ERC721A.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721 token receiver. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC721A * * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721) * Non-Fungible Token Standard, including the Metadata extension. * Optimized for lower gas during batch mints. * * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...) * starting from `_startTokenId()`. * * Assumptions: * * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364). struct TokenApprovalRef { address value; } // ============================================================= // CONSTANTS // ============================================================= // Mask of an entry in packed address data. uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant _BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant _BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant _BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant _BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant _BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant _BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with {_mintERC2309}. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309} // is required to cause an overflow, which is unrealistic. uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // ============================================================= // STORAGE // ============================================================= // The next token ID to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See {_packedOwnershipOf} implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => TokenApprovalRef) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // ============================================================= // CONSTRUCTOR // ============================================================= constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } // ============================================================= // TOKEN COUNTING OPERATIONS // ============================================================= /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view virtual returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() public view virtual override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view virtual returns (uint256) { // Counter underflow is impossible as `_currentIndex` does not decrement, // and it is initialized to `_startTokenId()`. unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view virtual returns (uint256) { return _burnCounter; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> _BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal virtual { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); _packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes // of the XOR of all function selectors in the interface. // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165) // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`) return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @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, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & _BITMASK_BURNED == 0) { // Invariant: // There will always be an initialized ownership slot // (i.e. `ownership.addr != address(0) && ownership.burned == false`) // before an unintialized ownership slot // (i.e. `ownership.addr == address(0) && ownership.burned == false`) // Hence, `curr` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * @dev Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`. result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @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) public payable virtual override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId].value; } /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) public virtual override { _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned. } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) public payable virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public payable virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @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 memory _data ) public payable virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Hook that is called before a set of serially-ordered token IDs * are about to be transferred. This includes minting. * And also called before burning one token. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token IDs * have been transferred. This includes minting. * And also called after one token has been burned. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns whether the call correctly returned the expected magic value. */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 toMasked; uint256 end = startTokenId + quantity; // Use assembly to loop and emit the `Transfer` event for gas savings. // The duplicated `log4` removes an extra check and reduces stack juggling. // The assembly, together with the surrounding Solidity code, have been // delicately arranged to nudge the compiler into producing optimized opcodes. assembly { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(to, _BITMASK_ADDRESS) // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. startTokenId // `tokenId`. ) // The `iszero(eq(,))` check ensures that large values of `quantity` // that overflows uint256 will make the loop run out of gas. // The compiler will optimize the `iszero` away for performance. for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { // Emit the `Transfer` event. Similar to above. log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } if (toMasked == 0) revert MintToZeroAddress(); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function _toString(uint256 value) internal pure virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), but // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned. // We will need 1 word for the trailing zeros padding, 1 word for the length, // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0. let m := add(mload(0x40), 0xa0) // Update the free memory pointer to allocate. mstore(0x40, m) // Assign the `str` to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } } // File: NFT.sol pragma solidity ^0.8.17; library Errors{ error InvalidMintAmt(); error MaxSupplyExceeded(); error MaxWLSupplyExceeded(); error mageLimitExceeeded(); error limitExceeeded(); error InsufficientFund(); error TokenDoesnotExists(); error NotOwner(); error NotAuthorized(); error wlClaimed(); error StakingNotSet(); error WLSaleNotActive(); error ContractPaused(); error InsuffWithdrawAmount(); error AlreadyRevealed(); error NotOwnerOrAdmin(); error RevealClosed(); } contract ElementsNFT is ERC721A, Ownable, ReentrancyGuard { using Strings for uint256; bytes32 merkleRoot; bytes32 mageMerkleRoot; //Constructor uint256 public cost; uint256 maxSupply; // uint256 maxMintAmountPerTx; //Whitelist bool paused = true; bool whitelistMintEnabled = false; // Mint Date uint256 mageMint; uint256 wlMint; uint256 publicMint; //URI Path string uriPrefix = ''; string uriSuffix = '.json'; mapping(uint256=>bool) revealed; mapping(uint256=>uint256) rarityStake; mapping(uint256=>uint256) rarityTokenId; uint256 private _poolA = 0; uint256 private _poolB = 4000; //Paymet Splitter - DeFi address payable private payments; bool paymentStatus = false; bool reveal = false; // MageList mapping(address=>uint256) mageList; uint256 public mageListAllowedNFTs; //WL mapping(address=>bool) allowedList; //Balance uint256 totalBalance; // Staking Address address stakingAddress; bool mintStatus = false; address admin; event WhitelistMinted(address minter,uint256 amount); event minted(address minter,uint256 amount); event amountReleased(); constructor( string memory _tokenName, string memory _tokenSymbol, uint256 _maxSupply, uint256 _mageListAllowedNFTs, // uint256 _maxMintAmountPerTx, address _payments ) ERC721A(_tokenName, _tokenSymbol) { maxSupply = _maxSupply; mageListAllowedNFTs = _mageListAllowedNFTs; // maxMintAmountPerTx = _maxMintAmountPerTx; payments = payable(_payments); cost = 0.0369 ether; } modifier mintCompliance(uint256 _mintQuantity) { require(_mintQuantity > 0, 'Invalid mint amount!'); require(totalSupply() + _mintQuantity <= maxSupply, 'Max supply exceeded!'); require(msg.value >= cost * _mintQuantity, 'Insufficient funds!'); _; } modifier onlyAdminOrOwner() { if (owner() != _msgSender() && admin != _msgSender()) revert Errors.NotOwnerOrAdmin(); _; } modifier checkWalletAddress(){ require(tx.origin == msg.sender,"Invalid Wallet Address"); _; } function setMintDate(uint256 _mageMint,uint256 _wlMint, uint256 _publicMint) public onlyAdminOrOwner { mageMint = _mageMint; wlMint = _wlMint; publicMint = _publicMint; } function getMintDate() public view returns(uint256 _mageMint,uint256 _wlMint, uint256 _publicMint) { _mageMint = mageMint; _wlMint = wlMint; _publicMint = publicMint; } function whitelistVerify(bytes32[] calldata _merkleProof, bool _mage) checkWalletAddress() external view returns(bool){ bytes32 leaf = keccak256(abi.encodePacked(_msgSender())); if(_mage){ return MerkleProof.verify(_merkleProof, mageMerkleRoot, leaf); }else{ return MerkleProof.verify(_merkleProof, merkleRoot, leaf); } } function revealNFT(uint256 _tokenId) public { if(ownerOf(_tokenId)!=_msgSender()) revert Errors.NotOwner(); if(revealed[_tokenId]) revert Errors.AlreadyRevealed(); if(!_exists(_tokenId)) revert Errors.TokenDoesnotExists(); if(!reveal) revert Errors.RevealClosed(); bool poolA = false; bool poolB = false; if(rarityStake[_tokenId] < 2592000) { if(_poolA + 1 <= 4000) poolA = true; else poolB = false; } if(rarityStake[_tokenId] >= 2592000 ) { if(_poolB + 1 <= 8000) poolB = true; else poolA = false; } if(poolA){ _poolA += 1; rarityTokenId[_tokenId] = _poolA; revealed[_tokenId] = true; } if(poolB){ _poolB += 1; rarityTokenId[_tokenId] = _poolB; revealed[_tokenId] = true; } } function whitelistMint(uint256 _mintAmount, bytes32[] calldata _merkleProof) external payable mintCompliance(_mintAmount) checkWalletAddress() { if(!whitelistMintEnabled) revert Errors.WLSaleNotActive(); if(block.timestamp >= mageMint && block.timestamp < wlMint){ if(mageList[_msgSender()] + _mintAmount <= mageListAllowedNFTs ){ mageList[_msgSender()] += _mintAmount; } else revert Errors.mageLimitExceeeded(); bytes32 leaf = keccak256(abi.encodePacked(_msgSender())); require(MerkleProof.verify(_merkleProof, mageMerkleRoot, leaf), 'Invalid proof!'); }else if(block.timestamp>=wlMint && block.timestamp < publicMint){ if(allowedList[_msgSender()]){ revert Errors.wlClaimed(); }else{ allowedList[_msgSender()] = true; } bytes32 leaf = keccak256(abi.encodePacked(_msgSender())); require(MerkleProof.verify(_merkleProof, merkleRoot, leaf), 'Invalid proof!'); } totalBalance += msg.value; _safeMint(_msgSender(), _mintAmount); emit WhitelistMinted(_msgSender(), _mintAmount); } function mint(uint256 _mintAmount) public payable mintCompliance(_mintAmount) checkWalletAddress(){ require(!paused, 'The contract is paused!'); if(_mintAmount > mageListAllowedNFTs) revert Errors.limitExceeeded(); totalBalance += msg.value; if(totalSupply() + _mintAmount >=maxSupply){mintStatus = true;} _safeMint(_msgSender(), _mintAmount); emit minted(_msgSender(), _mintAmount); } function releaseStake(uint256 _tokenId, uint256 _stake) external{ if(stakingAddress!=_msgSender()) revert Errors.NotAuthorized(); if(ownerOf(_tokenId) != _msgSender()) revert Errors.NotOwner(); if(!_exists(_tokenId)) revert Errors.TokenDoesnotExists(); if(_stake > 0 && !revealed[_tokenId]){ rarityStake[_tokenId] += _stake; } } function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) { if(!_exists(_tokenId)) revert Errors.TokenDoesnotExists(); if(revealed[_tokenId]){ uint256 tokenId = rarityTokenId[_tokenId]; return bytes(_baseURI()).length > 0 ? string(abi.encodePacked(_baseURI(), tokenId.toString(), uriSuffix)) : ''; }else{ return bytes(_baseURI()).length > 0 ? string(abi.encodePacked(_baseURI(), "hidden", uriSuffix)) : ''; } } function _baseURI() internal view virtual override returns (string memory) { return uriPrefix; } function mintForAddress(uint256 _mintAmount, address _receiver) public onlyAdminOrOwner { require(_mintAmount > 0, 'Invalid mint amount!'); require(totalSupply() + _mintAmount <= maxSupply, 'Max supply exceeded!'); if(totalSupply() + _mintAmount >=maxSupply){mintStatus = true;} _safeMint(_receiver, _mintAmount); } function mintForAddressBatch(address[] calldata _addresses,uint256[] calldata _mintAmount,uint256 _totalMintAmount) external onlyAdminOrOwner{ require(_totalMintAmount > 0, 'Invalid mint amount!'); require(totalSupply() + _totalMintAmount <= maxSupply, 'Max supply exceeded!'); uint256 mintAmount = 0; for (uint256 i = 0; i < _addresses.length; i++) { _safeMint(_addresses[i], _mintAmount[i]); mintAmount += _mintAmount[i]; } if(totalSupply() + mintAmount >=maxSupply){mintStatus = true;} } function setStakingAddress(address _stakingAddress) public onlyOwner{ stakingAddress = _stakingAddress; } function setApproval(uint256 _tokenId) public{ if(!_exists(_tokenId)) revert Errors.TokenDoesnotExists(); if(ownerOf(_tokenId) != _msgSender()) revert Errors.NotOwner(); approve(stakingAddress, _tokenId); } function setApprovalAll() public{ if(stakingAddress==address(0)) revert Errors.StakingNotSet(); setApprovalForAll(stakingAddress,true); } function setCost(uint256 _cost) public onlyAdminOrOwner() { cost = _cost; } function transferOwner(address newOwner) public onlyOwner{ super.transferOwnership(newOwner); } function _startTokenId() internal view virtual override returns (uint256) { return 1; } function setUriPrefix(string memory _uriPrefix) public onlyOwner { uriPrefix = _uriPrefix; } function setUriSuffix(string memory _uriSuffix) public onlyOwner { uriSuffix = _uriSuffix; } function setPaused(bool _state) public onlyAdminOrOwner { paused = _state; } function getPaused() public view returns(bool _state){ _state = paused; } function setMerkleRoot(bytes32 _merkleRoot, bytes32 _mageMerkleRoot) public onlyOwner { merkleRoot = _merkleRoot; mageMerkleRoot = _mageMerkleRoot; } function getMerkleRoot() public view returns(bytes32 _merkleRoot, bytes32 _mageMerkleRoot) { _merkleRoot = merkleRoot; _mageMerkleRoot = mageMerkleRoot; } function setMageLimit(uint256 _mageListAllowedNFTs) public onlyAdminOrOwner{ mageListAllowedNFTs = _mageListAllowedNFTs; } function getMageList(address _address) public view returns(uint256 _tokens){ _tokens = mageList[_address]; } function getAllowList(address _address) public view returns(bool _state){ _state = allowedList[_address]; } function setWhitelistMintEnabled(bool _state) public onlyAdminOrOwner { whitelistMintEnabled = _state; } function getWhitelistMintEnabled() public view returns(bool _state) { _state = whitelistMintEnabled ; } function setMaxSupply(uint256 _maxSupply)public onlyAdminOrOwner{ maxSupply = _maxSupply; } function currentBalance() public view returns(uint256){ return address(this).balance; } function getTotalBalance() public view returns(uint256) { return totalBalance; } function getDetailsTokenId(uint256 _tokenId) public view returns(bool,uint256,uint256){ return (revealed[_tokenId],rarityStake[_tokenId],rarityTokenId[_tokenId]); } function safeTransferFrom( address from, address to, uint256 tokenId ) public payable virtual override { if(to != stakingAddress){ require(mintStatus,"STransfer: Can't Sell Now"); } super.safeTransferFrom(from, to, tokenId, ''); } function transferFrom( address from, address to, uint256 tokenId ) public payable virtual override(ERC721A) { if(to != stakingAddress){ require(mintStatus,"Transfer: Can't Sell Now"); } super.transferFrom(from, to, tokenId); } function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public payable virtual override{ if(to != stakingAddress){ require(mintStatus,"STransferD: Can't Sell Now"); } super.safeTransferFrom(from,to,tokenId,_data); } function setApprovalForAll(address to, bool approved) public virtual override { if(to != stakingAddress){ require(mintStatus,"Approve All: Can't Sell Now"); } super.setApprovalForAll(to, approved); } function approve(address to, uint256 tokenId) public virtual payable override { if(to != stakingAddress){ require(mintStatus,"Approve: Can't Sell Now"); } super.approve(to, tokenId); } function setMintStatus(bool _mintStatus) public onlyAdminOrOwner{ mintStatus = _mintStatus; } function setPayment(bool _status) public onlyOwner{ paymentStatus = _status; } function setReveal(bool _status) public onlyOwner{ reveal = _status; } function setAdmin(address _admin) public onlyOwner{ admin = _admin; } function setPayments(address payable _payments) public onlyOwner{ payments = payable(_payments); } function withdraw() external nonReentrant onlyAdminOrOwner{ require(address(this).balance>0,"Release amount should be greater than zero"); if(paymentStatus){ (bool success, ) = payable(payments).call{value: address(this).balance}(""); require(success); emit amountReleased(); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_tokenName","type":"string"},{"internalType":"string","name":"_tokenSymbol","type":"string"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"},{"internalType":"uint256","name":"_mageListAllowedNFTs","type":"uint256"},{"internalType":"address","name":"_payments","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyRevealed","type":"error"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"NotAuthorized","type":"error"},{"inputs":[],"name":"NotOwner","type":"error"},{"inputs":[],"name":"NotOwnerOrAdmin","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"RevealClosed","type":"error"},{"inputs":[],"name":"StakingNotSet","type":"error"},{"inputs":[],"name":"TokenDoesnotExists","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"WLSaleNotActive","type":"error"},{"inputs":[],"name":"limitExceeeded","type":"error"},{"inputs":[],"name":"mageLimitExceeeded","type":"error"},{"inputs":[],"name":"wlClaimed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WhitelistMinted","type":"event"},{"anonymous":false,"inputs":[],"name":"amountReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"minted","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getAllowList","outputs":[{"internalType":"bool","name":"_state","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getDetailsTokenId","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getMageList","outputs":[{"internalType":"uint256","name":"_tokens","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMerkleRoot","outputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"},{"internalType":"bytes32","name":"_mageMerkleRoot","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintDate","outputs":[{"internalType":"uint256","name":"_mageMint","type":"uint256"},{"internalType":"uint256","name":"_wlMint","type":"uint256"},{"internalType":"uint256","name":"_publicMint","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPaused","outputs":[{"internalType":"bool","name":"_state","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWhitelistMintEnabled","outputs":[{"internalType":"bool","name":"_state","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mageListAllowedNFTs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"uint256[]","name":"_mintAmount","type":"uint256[]"},{"internalType":"uint256","name":"_totalMintAmount","type":"uint256"}],"name":"mintForAddressBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_stake","type":"uint256"}],"name":"releaseStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"revealNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"setApproval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setApprovalAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mageListAllowedNFTs","type":"uint256"}],"name":"setMageLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"},{"internalType":"bytes32","name":"_mageMerkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mageMint","type":"uint256"},{"internalType":"uint256","name":"_wlMint","type":"uint256"},{"internalType":"uint256","name":"_publicMint","type":"uint256"}],"name":"setMintDate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_mintStatus","type":"bool"}],"name":"setMintStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"setPayment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_payments","type":"address"}],"name":"setPayments","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"setReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_stakingAddress","type":"address"}],"name":"setStakingAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setWhitelistMintEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"bool","name":"_mage","type":"bool"}],"name":"whitelistVerify","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526001600e60006101000a81548160ff0219169083151502179055506000600e60016101000a81548160ff02191690831515021790555060405180602001604052806000815250601290816200005a919062000550565b506040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525060139081620000a1919062000550565b506000601755610fa06018556000601960146101000a81548160ff0219169083151502179055506000601960156101000a81548160ff0219169083151502179055506000601e60146101000a81548160ff0219169083151502179055503480156200010b57600080fd5b50604051620067d0380380620067d0833981810160405281019062000131919062000831565b8484816002908162000144919062000550565b50806003908162000156919062000550565b5062000167620001ff60201b60201c565b60008190555050506200018f620001836200020860201b60201c565b6200021060201b60201c565b600160098190555082600d8190555081601b8190555080601960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506683185ac0364000600c819055505050505050620008f7565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200035857607f821691505b6020821081036200036e576200036d62000310565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003d87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000399565b620003e4868362000399565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620004316200042b6200042584620003fc565b62000406565b620003fc565b9050919050565b6000819050919050565b6200044d8362000410565b620004656200045c8262000438565b848454620003a6565b825550505050565b600090565b6200047c6200046d565b6200048981848462000442565b505050565b5b81811015620004b157620004a560008262000472565b6001810190506200048f565b5050565b601f8211156200050057620004ca8162000374565b620004d58462000389565b81016020851015620004e5578190505b620004fd620004f48562000389565b8301826200048e565b50505b505050565b600082821c905092915050565b6000620005256000198460080262000505565b1980831691505092915050565b600062000540838362000512565b9150826002028217905092915050565b6200055b82620002d6565b67ffffffffffffffff811115620005775762000576620002e1565b5b6200058382546200033f565b62000590828285620004b5565b600060209050601f831160018114620005c85760008415620005b3578287015190505b620005bf858262000532565b8655506200062f565b601f198416620005d88662000374565b60005b828110156200060257848901518255600182019150602085019450602081019050620005db565b868310156200062257848901516200061e601f89168262000512565b8355505b6001600288020188555050505b505050505050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b620006718262000655565b810181811067ffffffffffffffff82111715620006935762000692620002e1565b5b80604052505050565b6000620006a862000637565b9050620006b6828262000666565b919050565b600067ffffffffffffffff821115620006d957620006d8620002e1565b5b620006e48262000655565b9050602081019050919050565b60005b8381101562000711578082015181840152602081019050620006f4565b60008484015250505050565b6000620007346200072e84620006bb565b6200069c565b90508281526020810184848401111562000753576200075262000650565b5b62000760848285620006f1565b509392505050565b600082601f83011262000780576200077f6200064b565b5b8151620007928482602086016200071d565b91505092915050565b620007a681620003fc565b8114620007b257600080fd5b50565b600081519050620007c6816200079b565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620007f982620007cc565b9050919050565b6200080b81620007ec565b81146200081757600080fd5b50565b6000815190506200082b8162000800565b92915050565b600080600080600060a0868803121562000850576200084f62000641565b5b600086015167ffffffffffffffff81111562000871576200087062000646565b5b6200087f8882890162000768565b955050602086015167ffffffffffffffff811115620008a357620008a262000646565b5b620008b18882890162000768565b9450506040620008c488828901620007b5565b9350506060620008d788828901620007b5565b9250506080620008ea888289016200081a565b9150509295509295909350565b615ec980620009076000396000f3fe6080604052600436106103355760003560e01c8063715018a6116101ab578063c87b56dd116100f7578063d869a1e711610095578063efbd73f41161006f578063efbd73f414610b9d578063f084b7f414610bc6578063f2fde38b14610bef578063f4e0d9ac14610c1857610335565b8063d869a1e714610b0c578063e84e4a8d14610b35578063e985e9c514610b6057610335565b8063cf5e7f16116100d1578063cf5e7f1614610a73578063d2cab05614610a8a578063d5608f9a14610aa6578063d624cac414610acf57610335565b8063c87b56dd146109e2578063cd3fa95614610a1f578063ce845d1d14610a4857610335565b806397541c3211610164578063abd4b9961161013e578063abd4b99614610947578063af231a5814610974578063b767a0981461099d578063b88d4fde146109c657610335565b806397541c32146108d9578063a0712d6814610902578063a22cb4651461091e57610335565b8063715018a6146107db57806375edcbe0146107f25780637ec4a6591461081b57806385b54f0e146108445780638da5cb5b1461088357806395d89b41146108ae57610335565b8063340a7ca9116102855780634a66db95116102235780636805b84b116101fd5780636805b84b146107215780636f8b44b01461074c578063704b6c021461077557806370a082311461079e57610335565b80634a66db95146106925780634fb2e45d146106bb5780636352211e146106e457610335565b806342842e0e1161025f57806342842e0e146105e457806344a0d68a1461060057806347c78fef14610629578063495906571461066657610335565b8063340a7ca9146105675780633ccfd60b146105a4578063407fa476146105bb57610335565b806316ba10e0116102f25780631f85e3ca116102cc5780631f85e3ca146104ce57806323b872dd146104f75780632a3f300c1461051357806330e07a5e1461053c57610335565b806316ba10e01461045157806316c38b3c1461047a57806318160ddd146104a357610335565b806301ffc9a71461033a57806306fdde0314610377578063081812fc146103a2578063095ea7b3146103df57806312b58349146103fb57806313faede614610426575b600080fd5b34801561034657600080fd5b50610361600480360381019061035c919061458a565b610c41565b60405161036e91906145d2565b60405180910390f35b34801561038357600080fd5b5061038c610cd3565b604051610399919061467d565b60405180910390f35b3480156103ae57600080fd5b506103c960048036038101906103c491906146d5565b610d65565b6040516103d69190614743565b60405180910390f35b6103f960048036038101906103f4919061478a565b610de4565b005b34801561040757600080fd5b50610410610e97565b60405161041d91906147d9565b60405180910390f35b34801561043257600080fd5b5061043b610ea1565b60405161044891906147d9565b60405180910390f35b34801561045d57600080fd5b5061047860048036038101906104739190614929565b610ea7565b005b34801561048657600080fd5b506104a1600480360381019061049c919061499e565b610ec2565b005b3480156104af57600080fd5b506104b8610fb5565b6040516104c591906147d9565b60405180910390f35b3480156104da57600080fd5b506104f560048036038101906104f0919061499e565b610fcc565b005b610511600480360381019061050c91906149cb565b6110bf565b005b34801561051f57600080fd5b5061053a6004803603810190610535919061499e565b611174565b005b34801561054857600080fd5b50610551611199565b60405161055e91906145d2565b60405180910390f35b34801561057357600080fd5b5061058e60048036038101906105899190614a7e565b6111b0565b60405161059b91906145d2565b60405180910390f35b3480156105b057600080fd5b506105b9611307565b005b3480156105c757600080fd5b506105e260048036038101906105dd91906146d5565b61150d565b005b6105fe60048036038101906105f991906149cb565b6115ed565b005b34801561060c57600080fd5b50610627600480360381019061062291906146d5565b6116b2565b005b34801561063557600080fd5b50610650600480360381019061064b9190614ade565b611792565b60405161065d91906145d2565b60405180910390f35b34801561067257600080fd5b5061067b6117e8565b604051610689929190614b24565b60405180910390f35b34801561069e57600080fd5b506106b960048036038101906106b49190614b4d565b6117f9565b005b3480156106c757600080fd5b506106e260048036038101906106dd9190614ade565b61199c565b005b3480156106f057600080fd5b5061070b600480360381019061070691906146d5565b6119b0565b6040516107189190614743565b60405180910390f35b34801561072d57600080fd5b506107366119c2565b60405161074391906145d2565b60405180910390f35b34801561075857600080fd5b50610773600480360381019061076e91906146d5565b6119d9565b005b34801561078157600080fd5b5061079c60048036038101906107979190614ade565b611ab9565b005b3480156107aa57600080fd5b506107c560048036038101906107c09190614ade565b611b05565b6040516107d291906147d9565b60405180910390f35b3480156107e757600080fd5b506107f0611bbd565b005b3480156107fe57600080fd5b5061081960048036038101906108149190614bb9565b611bd1565b005b34801561082757600080fd5b50610842600480360381019061083d9190614929565b611beb565b005b34801561085057600080fd5b5061086b600480360381019061086691906146d5565b611c06565b60405161087a93929190614bf9565b60405180910390f35b34801561088f57600080fd5b50610898611c61565b6040516108a59190614743565b60405180910390f35b3480156108ba57600080fd5b506108c3611c8b565b6040516108d0919061467d565b60405180910390f35b3480156108e557600080fd5b5061090060048036038101906108fb91906146d5565b611d1d565b005b61091c600480360381019061091791906146d5565b611dff565b005b34801561092a57600080fd5b5061094560048036038101906109409190614c30565b612089565b005b34801561095357600080fd5b5061095c61213c565b60405161096b93929190614c70565b60405180910390f35b34801561098057600080fd5b5061099b60048036038101906109969190614ce5565b612155565b005b3480156109a957600080fd5b506109c460048036038101906109bf919061499e565b6121a1565b005b6109e060048036038101906109db9190614db3565b612294565b005b3480156109ee57600080fd5b50610a096004803603810190610a0491906146d5565b61234b565b604051610a16919061467d565b60405180910390f35b348015610a2b57600080fd5b50610a466004803603810190610a419190614e36565b612484565b005b348015610a5457600080fd5b50610a5d612574565b604051610a6a91906147d9565b60405180910390f35b348015610a7f57600080fd5b50610a8861257c565b005b610aa46004803603810190610a9f9190614e89565b612633565b005b348015610ab257600080fd5b50610acd6004803603810190610ac891906146d5565b612bd1565b005b348015610adb57600080fd5b50610af66004803603810190610af19190614ade565b612e7f565b604051610b0391906147d9565b60405180910390f35b348015610b1857600080fd5b50610b336004803603810190610b2e919061499e565b612ec8565b005b348015610b4157600080fd5b50610b4a612eed565b604051610b5791906147d9565b60405180910390f35b348015610b6c57600080fd5b50610b876004803603810190610b829190614ee9565b612ef3565b604051610b9491906145d2565b60405180910390f35b348015610ba957600080fd5b50610bc46004803603810190610bbf9190614f29565b612f87565b005b348015610bd257600080fd5b50610bed6004803603810190610be89190615015565b61313c565b005b348015610bfb57600080fd5b50610c166004803603810190610c119190614ade565b61337f565b005b348015610c2457600080fd5b50610c3f6004803603810190610c3a9190614ade565b613402565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c9c57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ccc5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610ce2906150d9565b80601f0160208091040260200160405190810160405280929190818152602001828054610d0e906150d9565b8015610d5b5780601f10610d3057610100808354040283529160200191610d5b565b820191906000526020600020905b815481529060010190602001808311610d3e57829003601f168201915b5050505050905090565b6000610d708261344e565b610da6576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614610e8957601e60149054906101000a900460ff16610e88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7f90615156565b60405180910390fd5b5b610e9382826134ad565b5050565b6000601d54905090565b600c5481565b610eaf6135f1565b8060139081610ebe9190615322565b5050565b610eca61366f565b73ffffffffffffffffffffffffffffffffffffffff16610ee8611c61565b73ffffffffffffffffffffffffffffffffffffffff1614158015610f615750610f0f61366f565b73ffffffffffffffffffffffffffffffffffffffff16601f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b15610f98576040517fdce3812500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600e60006101000a81548160ff02191690831515021790555050565b6000610fbf613677565b6001546000540303905090565b610fd461366f565b73ffffffffffffffffffffffffffffffffffffffff16610ff2611c61565b73ffffffffffffffffffffffffffffffffffffffff161415801561106b575061101961366f565b73ffffffffffffffffffffffffffffffffffffffff16601f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b156110a2576040517fdce3812500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80601e60146101000a81548160ff02191690831515021790555050565b601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461116457601e60149054906101000a900460ff16611163576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115a90615440565b60405180910390fd5b5b61116f838383613680565b505050565b61117c6135f1565b80601960156101000a81548160ff02191690831515021790555050565b6000600e60019054906101000a900460ff16905090565b60003373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611220576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611217906154ac565b60405180910390fd5b600061122a61366f565b60405160200161123a9190615514565b60405160208183030381529060405280519060200120905082156112ae576112a6858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600b54836139a2565b915050611300565b6112fc858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600a54836139a2565b9150505b9392505050565b61130f6139b9565b61131761366f565b73ffffffffffffffffffffffffffffffffffffffff16611335611c61565b73ffffffffffffffffffffffffffffffffffffffff16141580156113ae575061135c61366f565b73ffffffffffffffffffffffffffffffffffffffff16601f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b156113e5576040517fdce3812500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60004711611428576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141f906155a1565b60405180910390fd5b601960149054906101000a900460ff1615611503576000601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1647604051611485906155f2565b60006040518083038185875af1925050503d80600081146114c2576040519150601f19603f3d011682016040523d82523d6000602084013e6114c7565b606091505b50509050806114d557600080fd5b7fdc7454dd8274035c58b00ecc8f69fcf7b164f037f05811c3e23059b491cd0dc160405160405180910390a1505b61150b613a08565b565b61151561366f565b73ffffffffffffffffffffffffffffffffffffffff16611533611c61565b73ffffffffffffffffffffffffffffffffffffffff16141580156115ac575061155a61366f565b73ffffffffffffffffffffffffffffffffffffffff16601f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b156115e3576040517fdce3812500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80601b8190555050565b601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461169257601e60149054906101000a900460ff16611691576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168890615653565b60405180910390fd5b5b6116ad83838360405180602001604052806000815250613a12565b505050565b6116ba61366f565b73ffffffffffffffffffffffffffffffffffffffff166116d8611c61565b73ffffffffffffffffffffffffffffffffffffffff161415801561175157506116ff61366f565b73ffffffffffffffffffffffffffffffffffffffff16601f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b15611788576040517fdce3812500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600c8190555050565b6000601c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600080600a549150600b5490509091565b61180161366f565b73ffffffffffffffffffffffffffffffffffffffff16601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611887576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61188f61366f565b73ffffffffffffffffffffffffffffffffffffffff166118ae836119b0565b73ffffffffffffffffffffffffffffffffffffffff16146118fb576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119048261344e565b61193a576040517f7371492200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008111801561196857506014600083815260200190815260200160002060009054906101000a900460ff16155b15611998578060156000848152602001908152602001600020600082825461199091906156a2565b925050819055505b5050565b6119a46135f1565b6119ad8161337f565b50565b60006119bb82613a85565b9050919050565b6000600e60009054906101000a900460ff16905090565b6119e161366f565b73ffffffffffffffffffffffffffffffffffffffff166119ff611c61565b73ffffffffffffffffffffffffffffffffffffffff1614158015611a785750611a2661366f565b73ffffffffffffffffffffffffffffffffffffffff16601f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b15611aaf576040517fdce3812500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600d8190555050565b611ac16135f1565b80601f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611b6c576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611bc56135f1565b611bcf6000613b51565b565b611bd96135f1565b81600a8190555080600b819055505050565b611bf36135f1565b8060129081611c029190615322565b5050565b60008060006014600085815260200190815260200160002060009054906101000a900460ff16601560008681526020019081526020016000205460166000878152602001908152602001600020549250925092509193909250565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054611c9a906150d9565b80601f0160208091040260200160405190810160405280929190818152602001828054611cc6906150d9565b8015611d135780601f10611ce857610100808354040283529160200191611d13565b820191906000526020600020905b815481529060010190602001808311611cf657829003601f168201915b5050505050905090565b611d268161344e565b611d5c576040517f7371492200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d6461366f565b73ffffffffffffffffffffffffffffffffffffffff16611d83826119b0565b73ffffffffffffffffffffffffffffffffffffffff1614611dd0576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611dfc601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682610de4565b50565b8060008111611e43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3a90615722565b60405180910390fd5b600d5481611e4f610fb5565b611e5991906156a2565b1115611e9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e919061578e565b60405180910390fd5b80600c54611ea891906157ae565b341015611eea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee19061583c565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611f58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4f906154ac565b60405180910390fd5b600e60009054906101000a900460ff1615611fa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9f906158a8565b60405180910390fd5b601b54821115611fe4576040517fb551f2a800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b34601d6000828254611ff691906156a2565b92505081905550600d5482612009610fb5565b61201391906156a2565b10612034576001601e60146101000a81548160ff0219169083151502179055505b61204561203f61366f565b83613c17565b7fb7656808f0e04b4af7a20f7ef1caa7669f0d781f1ca4cba31a3ba467880766c961206e61366f565b8360405161207d9291906158c8565b60405180910390a15050565b601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461212e57601e60149054906101000a900460ff1661212d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121249061593d565b60405180910390fd5b5b6121388282613c35565b5050565b6000806000600f54925060105491506011549050909192565b61215d6135f1565b80601960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6121a961366f565b73ffffffffffffffffffffffffffffffffffffffff166121c7611c61565b73ffffffffffffffffffffffffffffffffffffffff161415801561224057506121ee61366f565b73ffffffffffffffffffffffffffffffffffffffff16601f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b15612277576040517fdce3812500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600e60016101000a81548160ff02191690831515021790555050565b601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461233957601e60149054906101000a900460ff16612338576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232f906159a9565b60405180910390fd5b5b61234584848484613a12565b50505050565b60606123568261344e565b61238c576040517f7371492200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6014600083815260200190815260200160002060009054906101000a900460ff161561242c5760006016600084815260200190815260200160002054905060006123d4613d40565b51116123ef5760405180602001604052806000815250612424565b6123f7613d40565b61240082613dd2565b601360405160200161241493929190615a88565b6040516020818303038152906040525b91505061247f565b6000612436613d40565b5111612451576040518060200160405280600081525061247c565b612459613d40565b601360405160200161246c929190615b05565b6040516020818303038152906040525b90505b919050565b61248c61366f565b73ffffffffffffffffffffffffffffffffffffffff166124aa611c61565b73ffffffffffffffffffffffffffffffffffffffff161415801561252357506124d161366f565b73ffffffffffffffffffffffffffffffffffffffff16601f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b1561255a576040517fdce3812500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82600f819055508160108190555080601181905550505050565b600047905090565b600073ffffffffffffffffffffffffffffffffffffffff16601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612604576040517f8d064b1c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612631601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166001612089565b565b8260008111612677576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266e90615722565b60405180910390fd5b600d5481612683610fb5565b61268d91906156a2565b11156126ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c59061578e565b60405180910390fd5b80600c546126dc91906157ae565b34101561271e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127159061583c565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461278c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612783906154ac565b60405180910390fd5b600e60019054906101000a900460ff166127d2576040517fc54ef16d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600f5442101580156127e5575060105442105b1561299d57601b5484601a60006127fa61366f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461283f91906156a2565b116128a65783601a600061285161366f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461289a91906156a2565b925050819055506128d8565b6040517f42ea785a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006128e261366f565b6040516020016128f29190615514565b604051602081830303815290604052805190602001209050612958848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600b54836139a2565b612997576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298e90615b80565b60405180910390fd5b50612b61565b60105442101580156129b0575060115442105b15612b6057601c60006129c161366f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612a40576040517f7b38500b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001601c6000612a4e61366f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000612aa961366f565b604051602001612ab99190615514565b604051602081830303815290604052805190602001209050612b1f848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600a54836139a2565b612b5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b5590615b80565b60405180910390fd5b505b5b34601d6000828254612b7391906156a2565b92505081905550612b8b612b8561366f565b85613c17565b7fce77e469b386be007f957632f6f65216f2e74c5daa303aff682e8296f628d010612bb461366f565b85604051612bc39291906158c8565b60405180910390a150505050565b612bd961366f565b73ffffffffffffffffffffffffffffffffffffffff16612bf8826119b0565b73ffffffffffffffffffffffffffffffffffffffff1614612c45576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6014600082815260200190815260200160002060009054906101000a900460ff1615612c9d576040517fa89ac15100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ca68161344e565b612cdc576040517f7371492200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601960159054906101000a900460ff16612d22576040517fd896054600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008062278d0060156000858152602001908152602001600020541015612d6957610fa06001601754612d5591906156a2565b11612d635760019150612d68565b600090505b5b62278d00601560008581526020019081526020016000205410612dac57611f406001601854612d9891906156a2565b11612da65760019050612dab565b600091505b5b8115612e1357600160176000828254612dc591906156a2565b92505081905550601754601660008581526020019081526020016000208190555060016014600085815260200190815260200160002060006101000a81548160ff0219169083151502179055505b8015612e7a57600160186000828254612e2c91906156a2565b92505081905550601854601660008581526020019081526020016000208190555060016014600085815260200190815260200160002060006101000a81548160ff0219169083151502179055505b505050565b6000601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b612ed06135f1565b80601960146101000a81548160ff02191690831515021790555050565b601b5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612f8f61366f565b73ffffffffffffffffffffffffffffffffffffffff16612fad611c61565b73ffffffffffffffffffffffffffffffffffffffff16141580156130265750612fd461366f565b73ffffffffffffffffffffffffffffffffffffffff16601f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b1561305d576040517fdce3812500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082116130a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161309790615722565b60405180910390fd5b600d54826130ac610fb5565b6130b691906156a2565b11156130f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130ee9061578e565b60405180910390fd5b600d5482613103610fb5565b61310d91906156a2565b1061312e576001601e60146101000a81548160ff0219169083151502179055505b6131388183613c17565b5050565b61314461366f565b73ffffffffffffffffffffffffffffffffffffffff16613162611c61565b73ffffffffffffffffffffffffffffffffffffffff16141580156131db575061318961366f565b73ffffffffffffffffffffffffffffffffffffffff16601f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b15613212576040517fdce3812500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008111613255576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161324c90615722565b60405180910390fd5b600d5481613261610fb5565b61326b91906156a2565b11156132ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132a39061578e565b60405180910390fd5b6000805b8686905081101561333f576133058787838181106132d1576132d0615ba0565b5b90506020020160208101906132e69190614ade565b8686848181106132f9576132f8615ba0565b5b90506020020135613c17565b84848281811061331857613317615ba0565b5b905060200201358261332a91906156a2565b9150808061333790615bcf565b9150506132b0565b50600d548161334c610fb5565b61335691906156a2565b10613377576001601e60146101000a81548160ff0219169083151502179055505b505050505050565b6133876135f1565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036133f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133ed90615c89565b60405180910390fd5b6133ff81613b51565b50565b61340a6135f1565b80601e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600081613459613677565b11158015613468575060005482105b80156134a6575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60006134b8826119b0565b90508073ffffffffffffffffffffffffffffffffffffffff166134d9613ea0565b73ffffffffffffffffffffffffffffffffffffffff161461353c5761350581613500613ea0565b612ef3565b61353b576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6135f961366f565b73ffffffffffffffffffffffffffffffffffffffff16613617611c61565b73ffffffffffffffffffffffffffffffffffffffff161461366d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161366490615cf5565b60405180910390fd5b565b600033905090565b60006001905090565b600061368b82613a85565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146136f2576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806136fe84613ea8565b91509150613714818761370f613ea0565b613ecf565b6137605761372986613724613ea0565b612ef3565b61375f576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036137c6576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6137d38686866001613f13565b80156137de57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506138ac85613888888887613f19565b7c020000000000000000000000000000000000000000000000000000000017613f41565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603613932576000600185019050600060046000838152602001908152602001600020540361393057600054811461392f578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461399a8686866001613f6c565b505050505050565b6000826139af8584613f72565b1490509392505050565b6002600954036139fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139f590615d61565b60405180910390fd5b6002600981905550565b6001600981905550565b613a1d8484846110bf565b60008373ffffffffffffffffffffffffffffffffffffffff163b14613a7f57613a4884848484613fc8565b613a7e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60008082905080613a94613677565b11613b1a57600054811015613b195760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603613b17575b60008103613b0d576004600083600190039350838152602001908152602001600020549050613ae3565b8092505050613b4c565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b613c31828260405180602001604052806000815250614118565b5050565b8060076000613c42613ea0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16613cef613ea0565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051613d3491906145d2565b60405180910390a35050565b606060128054613d4f906150d9565b80601f0160208091040260200160405190810160405280929190818152602001828054613d7b906150d9565b8015613dc85780601f10613d9d57610100808354040283529160200191613dc8565b820191906000526020600020905b815481529060010190602001808311613dab57829003601f168201915b5050505050905090565b606060006001613de1846141b5565b01905060008167ffffffffffffffff811115613e0057613dff6147fe565b5b6040519080825280601f01601f191660200182016040528015613e325781602001600182028036833780820191505090505b509050600082602001820190505b600115613e95578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581613e8957613e88615d81565b5b04945060008503613e40575b819350505050919050565b600033905090565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8613f30868684614308565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60008082905060005b8451811015613fbd57613fa882868381518110613f9b57613f9a615ba0565b5b6020026020010151614311565b91508080613fb590615bcf565b915050613f7b565b508091505092915050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613fee613ea0565b8786866040518563ffffffff1660e01b81526004016140109493929190615e05565b6020604051808303816000875af192505050801561404c57506040513d601f19601f820116820180604052508101906140499190615e66565b60015b6140c5573d806000811461407c576040519150601f19603f3d011682016040523d82523d6000602084013e614081565b606091505b5060008151036140bd576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b614122838361433c565b60008373ffffffffffffffffffffffffffffffffffffffff163b146141b057600080549050600083820390505b6141626000868380600101945086613fc8565b614198576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061414f5781600054146141ad57600080fd5b50505b505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310614213577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161420957614208615d81565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310614250576d04ee2d6d415b85acef8100000000838161424657614245615d81565b5b0492506020810190505b662386f26fc10000831061427f57662386f26fc10000838161427557614274615d81565b5b0492506010810190505b6305f5e10083106142a8576305f5e100838161429e5761429d615d81565b5b0492506008810190505b61271083106142cd5761271083816142c3576142c2615d81565b5b0492506004810190505b606483106142f057606483816142e6576142e5615d81565b5b0492506002810190505b600a83106142ff576001810190505b80915050919050565b60009392505050565b60008183106143295761432482846144f7565b614334565b61433383836144f7565b5b905092915050565b6000805490506000820361437c576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6143896000848385613f13565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550614400836143f16000866000613f19565b6143fa8561450e565b17613f41565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b8181146144a157808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050614466565b50600082036144dc576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506144f26000848385613f6c565b505050565b600082600052816020526040600020905092915050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61456781614532565b811461457257600080fd5b50565b6000813590506145848161455e565b92915050565b6000602082840312156145a05761459f614528565b5b60006145ae84828501614575565b91505092915050565b60008115159050919050565b6145cc816145b7565b82525050565b60006020820190506145e760008301846145c3565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561462757808201518184015260208101905061460c565b60008484015250505050565b6000601f19601f8301169050919050565b600061464f826145ed565b61465981856145f8565b9350614669818560208601614609565b61467281614633565b840191505092915050565b600060208201905081810360008301526146978184614644565b905092915050565b6000819050919050565b6146b28161469f565b81146146bd57600080fd5b50565b6000813590506146cf816146a9565b92915050565b6000602082840312156146eb576146ea614528565b5b60006146f9848285016146c0565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061472d82614702565b9050919050565b61473d81614722565b82525050565b60006020820190506147586000830184614734565b92915050565b61476781614722565b811461477257600080fd5b50565b6000813590506147848161475e565b92915050565b600080604083850312156147a1576147a0614528565b5b60006147af85828601614775565b92505060206147c0858286016146c0565b9150509250929050565b6147d38161469f565b82525050565b60006020820190506147ee60008301846147ca565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61483682614633565b810181811067ffffffffffffffff82111715614855576148546147fe565b5b80604052505050565b600061486861451e565b9050614874828261482d565b919050565b600067ffffffffffffffff821115614894576148936147fe565b5b61489d82614633565b9050602081019050919050565b82818337600083830152505050565b60006148cc6148c784614879565b61485e565b9050828152602081018484840111156148e8576148e76147f9565b5b6148f38482856148aa565b509392505050565b600082601f8301126149105761490f6147f4565b5b81356149208482602086016148b9565b91505092915050565b60006020828403121561493f5761493e614528565b5b600082013567ffffffffffffffff81111561495d5761495c61452d565b5b614969848285016148fb565b91505092915050565b61497b816145b7565b811461498657600080fd5b50565b60008135905061499881614972565b92915050565b6000602082840312156149b4576149b3614528565b5b60006149c284828501614989565b91505092915050565b6000806000606084860312156149e4576149e3614528565b5b60006149f286828701614775565b9350506020614a0386828701614775565b9250506040614a14868287016146c0565b9150509250925092565b600080fd5b600080fd5b60008083601f840112614a3e57614a3d6147f4565b5b8235905067ffffffffffffffff811115614a5b57614a5a614a1e565b5b602083019150836020820283011115614a7757614a76614a23565b5b9250929050565b600080600060408486031215614a9757614a96614528565b5b600084013567ffffffffffffffff811115614ab557614ab461452d565b5b614ac186828701614a28565b93509350506020614ad486828701614989565b9150509250925092565b600060208284031215614af457614af3614528565b5b6000614b0284828501614775565b91505092915050565b6000819050919050565b614b1e81614b0b565b82525050565b6000604082019050614b396000830185614b15565b614b466020830184614b15565b9392505050565b60008060408385031215614b6457614b63614528565b5b6000614b72858286016146c0565b9250506020614b83858286016146c0565b9150509250929050565b614b9681614b0b565b8114614ba157600080fd5b50565b600081359050614bb381614b8d565b92915050565b60008060408385031215614bd057614bcf614528565b5b6000614bde85828601614ba4565b9250506020614bef85828601614ba4565b9150509250929050565b6000606082019050614c0e60008301866145c3565b614c1b60208301856147ca565b614c2860408301846147ca565b949350505050565b60008060408385031215614c4757614c46614528565b5b6000614c5585828601614775565b9250506020614c6685828601614989565b9150509250929050565b6000606082019050614c8560008301866147ca565b614c9260208301856147ca565b614c9f60408301846147ca565b949350505050565b6000614cb282614702565b9050919050565b614cc281614ca7565b8114614ccd57600080fd5b50565b600081359050614cdf81614cb9565b92915050565b600060208284031215614cfb57614cfa614528565b5b6000614d0984828501614cd0565b91505092915050565b600067ffffffffffffffff821115614d2d57614d2c6147fe565b5b614d3682614633565b9050602081019050919050565b6000614d56614d5184614d12565b61485e565b905082815260208101848484011115614d7257614d716147f9565b5b614d7d8482856148aa565b509392505050565b600082601f830112614d9a57614d996147f4565b5b8135614daa848260208601614d43565b91505092915050565b60008060008060808587031215614dcd57614dcc614528565b5b6000614ddb87828801614775565b9450506020614dec87828801614775565b9350506040614dfd878288016146c0565b925050606085013567ffffffffffffffff811115614e1e57614e1d61452d565b5b614e2a87828801614d85565b91505092959194509250565b600080600060608486031215614e4f57614e4e614528565b5b6000614e5d868287016146c0565b9350506020614e6e868287016146c0565b9250506040614e7f868287016146c0565b9150509250925092565b600080600060408486031215614ea257614ea1614528565b5b6000614eb0868287016146c0565b935050602084013567ffffffffffffffff811115614ed157614ed061452d565b5b614edd86828701614a28565b92509250509250925092565b60008060408385031215614f0057614eff614528565b5b6000614f0e85828601614775565b9250506020614f1f85828601614775565b9150509250929050565b60008060408385031215614f4057614f3f614528565b5b6000614f4e858286016146c0565b9250506020614f5f85828601614775565b9150509250929050565b60008083601f840112614f7f57614f7e6147f4565b5b8235905067ffffffffffffffff811115614f9c57614f9b614a1e565b5b602083019150836020820283011115614fb857614fb7614a23565b5b9250929050565b60008083601f840112614fd557614fd46147f4565b5b8235905067ffffffffffffffff811115614ff257614ff1614a1e565b5b60208301915083602082028301111561500e5761500d614a23565b5b9250929050565b60008060008060006060868803121561503157615030614528565b5b600086013567ffffffffffffffff81111561504f5761504e61452d565b5b61505b88828901614f69565b9550955050602086013567ffffffffffffffff81111561507e5761507d61452d565b5b61508a88828901614fbf565b9350935050604061509d888289016146c0565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806150f157607f821691505b602082108103615104576151036150aa565b5b50919050565b7f417070726f76653a2043616e27742053656c6c204e6f77000000000000000000600082015250565b60006151406017836145f8565b915061514b8261510a565b602082019050919050565b6000602082019050818103600083015261516f81615133565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026151d87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261519b565b6151e2868361519b565b95508019841693508086168417925050509392505050565b6000819050919050565b600061521f61521a6152158461469f565b6151fa565b61469f565b9050919050565b6000819050919050565b61523983615204565b61524d61524582615226565b8484546151a8565b825550505050565b600090565b615262615255565b61526d818484615230565b505050565b5b818110156152915761528660008261525a565b600181019050615273565b5050565b601f8211156152d6576152a781615176565b6152b08461518b565b810160208510156152bf578190505b6152d36152cb8561518b565b830182615272565b50505b505050565b600082821c905092915050565b60006152f9600019846008026152db565b1980831691505092915050565b600061531283836152e8565b9150826002028217905092915050565b61532b826145ed565b67ffffffffffffffff811115615344576153436147fe565b5b61534e82546150d9565b615359828285615295565b600060209050601f83116001811461538c576000841561537a578287015190505b6153848582615306565b8655506153ec565b601f19841661539a86615176565b60005b828110156153c25784890151825560018201915060208501945060208101905061539d565b868310156153df57848901516153db601f8916826152e8565b8355505b6001600288020188555050505b505050505050565b7f5472616e736665723a2043616e27742053656c6c204e6f770000000000000000600082015250565b600061542a6018836145f8565b9150615435826153f4565b602082019050919050565b600060208201905081810360008301526154598161541d565b9050919050565b7f496e76616c69642057616c6c6574204164647265737300000000000000000000600082015250565b60006154966016836145f8565b91506154a182615460565b602082019050919050565b600060208201905081810360008301526154c581615489565b9050919050565b60008160601b9050919050565b60006154e4826154cc565b9050919050565b60006154f6826154d9565b9050919050565b61550e61550982614722565b6154eb565b82525050565b600061552082846154fd565b60148201915081905092915050565b7f52656c6561736520616d6f756e742073686f756c64206265206772656174657260008201527f207468616e207a65726f00000000000000000000000000000000000000000000602082015250565b600061558b602a836145f8565b91506155968261552f565b604082019050919050565b600060208201905081810360008301526155ba8161557e565b9050919050565b600081905092915050565b50565b60006155dc6000836155c1565b91506155e7826155cc565b600082019050919050565b60006155fd826155cf565b9150819050919050565b7f535472616e736665723a2043616e27742053656c6c204e6f7700000000000000600082015250565b600061563d6019836145f8565b915061564882615607565b602082019050919050565b6000602082019050818103600083015261566c81615630565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006156ad8261469f565b91506156b88361469f565b92508282019050808211156156d0576156cf615673565b5b92915050565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b600061570c6014836145f8565b9150615717826156d6565b602082019050919050565b6000602082019050818103600083015261573b816156ff565b9050919050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b60006157786014836145f8565b915061578382615742565b602082019050919050565b600060208201905081810360008301526157a78161576b565b9050919050565b60006157b98261469f565b91506157c48361469f565b92508282026157d28161469f565b915082820484148315176157e9576157e8615673565b5b5092915050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b60006158266013836145f8565b9150615831826157f0565b602082019050919050565b6000602082019050818103600083015261585581615819565b9050919050565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b60006158926017836145f8565b915061589d8261585c565b602082019050919050565b600060208201905081810360008301526158c181615885565b9050919050565b60006040820190506158dd6000830185614734565b6158ea60208301846147ca565b9392505050565b7f417070726f766520416c6c3a2043616e27742053656c6c204e6f770000000000600082015250565b6000615927601b836145f8565b9150615932826158f1565b602082019050919050565b600060208201905081810360008301526159568161591a565b9050919050565b7f535472616e73666572443a2043616e27742053656c6c204e6f77000000000000600082015250565b6000615993601a836145f8565b915061599e8261595d565b602082019050919050565b600060208201905081810360008301526159c281615986565b9050919050565b600081905092915050565b60006159df826145ed565b6159e981856159c9565b93506159f9818560208601614609565b80840191505092915050565b60008154615a12816150d9565b615a1c81866159c9565b94506001821660008114615a375760018114615a4c57615a7f565b60ff1983168652811515820286019350615a7f565b615a5585615176565b60005b83811015615a7757815481890152600182019150602081019050615a58565b838801955050505b50505092915050565b6000615a9482866159d4565b9150615aa082856159d4565b9150615aac8284615a05565b9150819050949350505050565b7f68696464656e0000000000000000000000000000000000000000000000000000600082015250565b6000615aef6006836159c9565b9150615afa82615ab9565b600682019050919050565b6000615b1182856159d4565b9150615b1c82615ae2565b9150615b288284615a05565b91508190509392505050565b7f496e76616c69642070726f6f6621000000000000000000000000000000000000600082015250565b6000615b6a600e836145f8565b9150615b7582615b34565b602082019050919050565b60006020820190508181036000830152615b9981615b5d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000615bda8261469f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615c0c57615c0b615673565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615c736026836145f8565b9150615c7e82615c17565b604082019050919050565b60006020820190508181036000830152615ca281615c66565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000615cdf6020836145f8565b9150615cea82615ca9565b602082019050919050565b60006020820190508181036000830152615d0e81615cd2565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000615d4b601f836145f8565b9150615d5682615d15565b602082019050919050565b60006020820190508181036000830152615d7a81615d3e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000615dd782615db0565b615de18185615dbb565b9350615df1818560208601614609565b615dfa81614633565b840191505092915050565b6000608082019050615e1a6000830187614734565b615e276020830186614734565b615e3460408301856147ca565b8181036060830152615e468184615dcc565b905095945050505050565b600081519050615e608161455e565b92915050565b600060208284031215615e7c57615e7b614528565b5b6000615e8a84828501615e51565b9150509291505056fea264697066735822122006996680c152b6f16c1200f9ca26a6ee5e25698531b4afb260027b57e8b22e4664736f6c6343000811003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000001f400000000000000000000000000000000000000000000000000000000000000002000000000000000000000000262ac903718b9e45e272cfb94ed0f3530541b2990000000000000000000000000000000000000000000000000000000000000008386c656d656e74730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002384c000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106103355760003560e01c8063715018a6116101ab578063c87b56dd116100f7578063d869a1e711610095578063efbd73f41161006f578063efbd73f414610b9d578063f084b7f414610bc6578063f2fde38b14610bef578063f4e0d9ac14610c1857610335565b8063d869a1e714610b0c578063e84e4a8d14610b35578063e985e9c514610b6057610335565b8063cf5e7f16116100d1578063cf5e7f1614610a73578063d2cab05614610a8a578063d5608f9a14610aa6578063d624cac414610acf57610335565b8063c87b56dd146109e2578063cd3fa95614610a1f578063ce845d1d14610a4857610335565b806397541c3211610164578063abd4b9961161013e578063abd4b99614610947578063af231a5814610974578063b767a0981461099d578063b88d4fde146109c657610335565b806397541c32146108d9578063a0712d6814610902578063a22cb4651461091e57610335565b8063715018a6146107db57806375edcbe0146107f25780637ec4a6591461081b57806385b54f0e146108445780638da5cb5b1461088357806395d89b41146108ae57610335565b8063340a7ca9116102855780634a66db95116102235780636805b84b116101fd5780636805b84b146107215780636f8b44b01461074c578063704b6c021461077557806370a082311461079e57610335565b80634a66db95146106925780634fb2e45d146106bb5780636352211e146106e457610335565b806342842e0e1161025f57806342842e0e146105e457806344a0d68a1461060057806347c78fef14610629578063495906571461066657610335565b8063340a7ca9146105675780633ccfd60b146105a4578063407fa476146105bb57610335565b806316ba10e0116102f25780631f85e3ca116102cc5780631f85e3ca146104ce57806323b872dd146104f75780632a3f300c1461051357806330e07a5e1461053c57610335565b806316ba10e01461045157806316c38b3c1461047a57806318160ddd146104a357610335565b806301ffc9a71461033a57806306fdde0314610377578063081812fc146103a2578063095ea7b3146103df57806312b58349146103fb57806313faede614610426575b600080fd5b34801561034657600080fd5b50610361600480360381019061035c919061458a565b610c41565b60405161036e91906145d2565b60405180910390f35b34801561038357600080fd5b5061038c610cd3565b604051610399919061467d565b60405180910390f35b3480156103ae57600080fd5b506103c960048036038101906103c491906146d5565b610d65565b6040516103d69190614743565b60405180910390f35b6103f960048036038101906103f4919061478a565b610de4565b005b34801561040757600080fd5b50610410610e97565b60405161041d91906147d9565b60405180910390f35b34801561043257600080fd5b5061043b610ea1565b60405161044891906147d9565b60405180910390f35b34801561045d57600080fd5b5061047860048036038101906104739190614929565b610ea7565b005b34801561048657600080fd5b506104a1600480360381019061049c919061499e565b610ec2565b005b3480156104af57600080fd5b506104b8610fb5565b6040516104c591906147d9565b60405180910390f35b3480156104da57600080fd5b506104f560048036038101906104f0919061499e565b610fcc565b005b610511600480360381019061050c91906149cb565b6110bf565b005b34801561051f57600080fd5b5061053a6004803603810190610535919061499e565b611174565b005b34801561054857600080fd5b50610551611199565b60405161055e91906145d2565b60405180910390f35b34801561057357600080fd5b5061058e60048036038101906105899190614a7e565b6111b0565b60405161059b91906145d2565b60405180910390f35b3480156105b057600080fd5b506105b9611307565b005b3480156105c757600080fd5b506105e260048036038101906105dd91906146d5565b61150d565b005b6105fe60048036038101906105f991906149cb565b6115ed565b005b34801561060c57600080fd5b50610627600480360381019061062291906146d5565b6116b2565b005b34801561063557600080fd5b50610650600480360381019061064b9190614ade565b611792565b60405161065d91906145d2565b60405180910390f35b34801561067257600080fd5b5061067b6117e8565b604051610689929190614b24565b60405180910390f35b34801561069e57600080fd5b506106b960048036038101906106b49190614b4d565b6117f9565b005b3480156106c757600080fd5b506106e260048036038101906106dd9190614ade565b61199c565b005b3480156106f057600080fd5b5061070b600480360381019061070691906146d5565b6119b0565b6040516107189190614743565b60405180910390f35b34801561072d57600080fd5b506107366119c2565b60405161074391906145d2565b60405180910390f35b34801561075857600080fd5b50610773600480360381019061076e91906146d5565b6119d9565b005b34801561078157600080fd5b5061079c60048036038101906107979190614ade565b611ab9565b005b3480156107aa57600080fd5b506107c560048036038101906107c09190614ade565b611b05565b6040516107d291906147d9565b60405180910390f35b3480156107e757600080fd5b506107f0611bbd565b005b3480156107fe57600080fd5b5061081960048036038101906108149190614bb9565b611bd1565b005b34801561082757600080fd5b50610842600480360381019061083d9190614929565b611beb565b005b34801561085057600080fd5b5061086b600480360381019061086691906146d5565b611c06565b60405161087a93929190614bf9565b60405180910390f35b34801561088f57600080fd5b50610898611c61565b6040516108a59190614743565b60405180910390f35b3480156108ba57600080fd5b506108c3611c8b565b6040516108d0919061467d565b60405180910390f35b3480156108e557600080fd5b5061090060048036038101906108fb91906146d5565b611d1d565b005b61091c600480360381019061091791906146d5565b611dff565b005b34801561092a57600080fd5b5061094560048036038101906109409190614c30565b612089565b005b34801561095357600080fd5b5061095c61213c565b60405161096b93929190614c70565b60405180910390f35b34801561098057600080fd5b5061099b60048036038101906109969190614ce5565b612155565b005b3480156109a957600080fd5b506109c460048036038101906109bf919061499e565b6121a1565b005b6109e060048036038101906109db9190614db3565b612294565b005b3480156109ee57600080fd5b50610a096004803603810190610a0491906146d5565b61234b565b604051610a16919061467d565b60405180910390f35b348015610a2b57600080fd5b50610a466004803603810190610a419190614e36565b612484565b005b348015610a5457600080fd5b50610a5d612574565b604051610a6a91906147d9565b60405180910390f35b348015610a7f57600080fd5b50610a8861257c565b005b610aa46004803603810190610a9f9190614e89565b612633565b005b348015610ab257600080fd5b50610acd6004803603810190610ac891906146d5565b612bd1565b005b348015610adb57600080fd5b50610af66004803603810190610af19190614ade565b612e7f565b604051610b0391906147d9565b60405180910390f35b348015610b1857600080fd5b50610b336004803603810190610b2e919061499e565b612ec8565b005b348015610b4157600080fd5b50610b4a612eed565b604051610b5791906147d9565b60405180910390f35b348015610b6c57600080fd5b50610b876004803603810190610b829190614ee9565b612ef3565b604051610b9491906145d2565b60405180910390f35b348015610ba957600080fd5b50610bc46004803603810190610bbf9190614f29565b612f87565b005b348015610bd257600080fd5b50610bed6004803603810190610be89190615015565b61313c565b005b348015610bfb57600080fd5b50610c166004803603810190610c119190614ade565b61337f565b005b348015610c2457600080fd5b50610c3f6004803603810190610c3a9190614ade565b613402565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c9c57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ccc5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610ce2906150d9565b80601f0160208091040260200160405190810160405280929190818152602001828054610d0e906150d9565b8015610d5b5780601f10610d3057610100808354040283529160200191610d5b565b820191906000526020600020905b815481529060010190602001808311610d3e57829003601f168201915b5050505050905090565b6000610d708261344e565b610da6576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614610e8957601e60149054906101000a900460ff16610e88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7f90615156565b60405180910390fd5b5b610e9382826134ad565b5050565b6000601d54905090565b600c5481565b610eaf6135f1565b8060139081610ebe9190615322565b5050565b610eca61366f565b73ffffffffffffffffffffffffffffffffffffffff16610ee8611c61565b73ffffffffffffffffffffffffffffffffffffffff1614158015610f615750610f0f61366f565b73ffffffffffffffffffffffffffffffffffffffff16601f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b15610f98576040517fdce3812500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600e60006101000a81548160ff02191690831515021790555050565b6000610fbf613677565b6001546000540303905090565b610fd461366f565b73ffffffffffffffffffffffffffffffffffffffff16610ff2611c61565b73ffffffffffffffffffffffffffffffffffffffff161415801561106b575061101961366f565b73ffffffffffffffffffffffffffffffffffffffff16601f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b156110a2576040517fdce3812500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80601e60146101000a81548160ff02191690831515021790555050565b601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461116457601e60149054906101000a900460ff16611163576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115a90615440565b60405180910390fd5b5b61116f838383613680565b505050565b61117c6135f1565b80601960156101000a81548160ff02191690831515021790555050565b6000600e60019054906101000a900460ff16905090565b60003373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611220576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611217906154ac565b60405180910390fd5b600061122a61366f565b60405160200161123a9190615514565b60405160208183030381529060405280519060200120905082156112ae576112a6858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600b54836139a2565b915050611300565b6112fc858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600a54836139a2565b9150505b9392505050565b61130f6139b9565b61131761366f565b73ffffffffffffffffffffffffffffffffffffffff16611335611c61565b73ffffffffffffffffffffffffffffffffffffffff16141580156113ae575061135c61366f565b73ffffffffffffffffffffffffffffffffffffffff16601f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b156113e5576040517fdce3812500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60004711611428576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141f906155a1565b60405180910390fd5b601960149054906101000a900460ff1615611503576000601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1647604051611485906155f2565b60006040518083038185875af1925050503d80600081146114c2576040519150601f19603f3d011682016040523d82523d6000602084013e6114c7565b606091505b50509050806114d557600080fd5b7fdc7454dd8274035c58b00ecc8f69fcf7b164f037f05811c3e23059b491cd0dc160405160405180910390a1505b61150b613a08565b565b61151561366f565b73ffffffffffffffffffffffffffffffffffffffff16611533611c61565b73ffffffffffffffffffffffffffffffffffffffff16141580156115ac575061155a61366f565b73ffffffffffffffffffffffffffffffffffffffff16601f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b156115e3576040517fdce3812500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80601b8190555050565b601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461169257601e60149054906101000a900460ff16611691576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168890615653565b60405180910390fd5b5b6116ad83838360405180602001604052806000815250613a12565b505050565b6116ba61366f565b73ffffffffffffffffffffffffffffffffffffffff166116d8611c61565b73ffffffffffffffffffffffffffffffffffffffff161415801561175157506116ff61366f565b73ffffffffffffffffffffffffffffffffffffffff16601f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b15611788576040517fdce3812500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600c8190555050565b6000601c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600080600a549150600b5490509091565b61180161366f565b73ffffffffffffffffffffffffffffffffffffffff16601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611887576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61188f61366f565b73ffffffffffffffffffffffffffffffffffffffff166118ae836119b0565b73ffffffffffffffffffffffffffffffffffffffff16146118fb576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119048261344e565b61193a576040517f7371492200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008111801561196857506014600083815260200190815260200160002060009054906101000a900460ff16155b15611998578060156000848152602001908152602001600020600082825461199091906156a2565b925050819055505b5050565b6119a46135f1565b6119ad8161337f565b50565b60006119bb82613a85565b9050919050565b6000600e60009054906101000a900460ff16905090565b6119e161366f565b73ffffffffffffffffffffffffffffffffffffffff166119ff611c61565b73ffffffffffffffffffffffffffffffffffffffff1614158015611a785750611a2661366f565b73ffffffffffffffffffffffffffffffffffffffff16601f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b15611aaf576040517fdce3812500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600d8190555050565b611ac16135f1565b80601f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611b6c576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611bc56135f1565b611bcf6000613b51565b565b611bd96135f1565b81600a8190555080600b819055505050565b611bf36135f1565b8060129081611c029190615322565b5050565b60008060006014600085815260200190815260200160002060009054906101000a900460ff16601560008681526020019081526020016000205460166000878152602001908152602001600020549250925092509193909250565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054611c9a906150d9565b80601f0160208091040260200160405190810160405280929190818152602001828054611cc6906150d9565b8015611d135780601f10611ce857610100808354040283529160200191611d13565b820191906000526020600020905b815481529060010190602001808311611cf657829003601f168201915b5050505050905090565b611d268161344e565b611d5c576040517f7371492200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d6461366f565b73ffffffffffffffffffffffffffffffffffffffff16611d83826119b0565b73ffffffffffffffffffffffffffffffffffffffff1614611dd0576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611dfc601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682610de4565b50565b8060008111611e43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3a90615722565b60405180910390fd5b600d5481611e4f610fb5565b611e5991906156a2565b1115611e9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e919061578e565b60405180910390fd5b80600c54611ea891906157ae565b341015611eea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee19061583c565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611f58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4f906154ac565b60405180910390fd5b600e60009054906101000a900460ff1615611fa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9f906158a8565b60405180910390fd5b601b54821115611fe4576040517fb551f2a800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b34601d6000828254611ff691906156a2565b92505081905550600d5482612009610fb5565b61201391906156a2565b10612034576001601e60146101000a81548160ff0219169083151502179055505b61204561203f61366f565b83613c17565b7fb7656808f0e04b4af7a20f7ef1caa7669f0d781f1ca4cba31a3ba467880766c961206e61366f565b8360405161207d9291906158c8565b60405180910390a15050565b601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461212e57601e60149054906101000a900460ff1661212d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121249061593d565b60405180910390fd5b5b6121388282613c35565b5050565b6000806000600f54925060105491506011549050909192565b61215d6135f1565b80601960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6121a961366f565b73ffffffffffffffffffffffffffffffffffffffff166121c7611c61565b73ffffffffffffffffffffffffffffffffffffffff161415801561224057506121ee61366f565b73ffffffffffffffffffffffffffffffffffffffff16601f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b15612277576040517fdce3812500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600e60016101000a81548160ff02191690831515021790555050565b601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461233957601e60149054906101000a900460ff16612338576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232f906159a9565b60405180910390fd5b5b61234584848484613a12565b50505050565b60606123568261344e565b61238c576040517f7371492200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6014600083815260200190815260200160002060009054906101000a900460ff161561242c5760006016600084815260200190815260200160002054905060006123d4613d40565b51116123ef5760405180602001604052806000815250612424565b6123f7613d40565b61240082613dd2565b601360405160200161241493929190615a88565b6040516020818303038152906040525b91505061247f565b6000612436613d40565b5111612451576040518060200160405280600081525061247c565b612459613d40565b601360405160200161246c929190615b05565b6040516020818303038152906040525b90505b919050565b61248c61366f565b73ffffffffffffffffffffffffffffffffffffffff166124aa611c61565b73ffffffffffffffffffffffffffffffffffffffff161415801561252357506124d161366f565b73ffffffffffffffffffffffffffffffffffffffff16601f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b1561255a576040517fdce3812500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82600f819055508160108190555080601181905550505050565b600047905090565b600073ffffffffffffffffffffffffffffffffffffffff16601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612604576040517f8d064b1c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612631601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166001612089565b565b8260008111612677576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266e90615722565b60405180910390fd5b600d5481612683610fb5565b61268d91906156a2565b11156126ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c59061578e565b60405180910390fd5b80600c546126dc91906157ae565b34101561271e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127159061583c565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461278c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612783906154ac565b60405180910390fd5b600e60019054906101000a900460ff166127d2576040517fc54ef16d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600f5442101580156127e5575060105442105b1561299d57601b5484601a60006127fa61366f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461283f91906156a2565b116128a65783601a600061285161366f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461289a91906156a2565b925050819055506128d8565b6040517f42ea785a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006128e261366f565b6040516020016128f29190615514565b604051602081830303815290604052805190602001209050612958848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600b54836139a2565b612997576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298e90615b80565b60405180910390fd5b50612b61565b60105442101580156129b0575060115442105b15612b6057601c60006129c161366f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612a40576040517f7b38500b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001601c6000612a4e61366f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000612aa961366f565b604051602001612ab99190615514565b604051602081830303815290604052805190602001209050612b1f848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600a54836139a2565b612b5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b5590615b80565b60405180910390fd5b505b5b34601d6000828254612b7391906156a2565b92505081905550612b8b612b8561366f565b85613c17565b7fce77e469b386be007f957632f6f65216f2e74c5daa303aff682e8296f628d010612bb461366f565b85604051612bc39291906158c8565b60405180910390a150505050565b612bd961366f565b73ffffffffffffffffffffffffffffffffffffffff16612bf8826119b0565b73ffffffffffffffffffffffffffffffffffffffff1614612c45576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6014600082815260200190815260200160002060009054906101000a900460ff1615612c9d576040517fa89ac15100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ca68161344e565b612cdc576040517f7371492200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601960159054906101000a900460ff16612d22576040517fd896054600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008062278d0060156000858152602001908152602001600020541015612d6957610fa06001601754612d5591906156a2565b11612d635760019150612d68565b600090505b5b62278d00601560008581526020019081526020016000205410612dac57611f406001601854612d9891906156a2565b11612da65760019050612dab565b600091505b5b8115612e1357600160176000828254612dc591906156a2565b92505081905550601754601660008581526020019081526020016000208190555060016014600085815260200190815260200160002060006101000a81548160ff0219169083151502179055505b8015612e7a57600160186000828254612e2c91906156a2565b92505081905550601854601660008581526020019081526020016000208190555060016014600085815260200190815260200160002060006101000a81548160ff0219169083151502179055505b505050565b6000601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b612ed06135f1565b80601960146101000a81548160ff02191690831515021790555050565b601b5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612f8f61366f565b73ffffffffffffffffffffffffffffffffffffffff16612fad611c61565b73ffffffffffffffffffffffffffffffffffffffff16141580156130265750612fd461366f565b73ffffffffffffffffffffffffffffffffffffffff16601f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b1561305d576040517fdce3812500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082116130a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161309790615722565b60405180910390fd5b600d54826130ac610fb5565b6130b691906156a2565b11156130f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130ee9061578e565b60405180910390fd5b600d5482613103610fb5565b61310d91906156a2565b1061312e576001601e60146101000a81548160ff0219169083151502179055505b6131388183613c17565b5050565b61314461366f565b73ffffffffffffffffffffffffffffffffffffffff16613162611c61565b73ffffffffffffffffffffffffffffffffffffffff16141580156131db575061318961366f565b73ffffffffffffffffffffffffffffffffffffffff16601f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b15613212576040517fdce3812500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008111613255576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161324c90615722565b60405180910390fd5b600d5481613261610fb5565b61326b91906156a2565b11156132ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132a39061578e565b60405180910390fd5b6000805b8686905081101561333f576133058787838181106132d1576132d0615ba0565b5b90506020020160208101906132e69190614ade565b8686848181106132f9576132f8615ba0565b5b90506020020135613c17565b84848281811061331857613317615ba0565b5b905060200201358261332a91906156a2565b9150808061333790615bcf565b9150506132b0565b50600d548161334c610fb5565b61335691906156a2565b10613377576001601e60146101000a81548160ff0219169083151502179055505b505050505050565b6133876135f1565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036133f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133ed90615c89565b60405180910390fd5b6133ff81613b51565b50565b61340a6135f1565b80601e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600081613459613677565b11158015613468575060005482105b80156134a6575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60006134b8826119b0565b90508073ffffffffffffffffffffffffffffffffffffffff166134d9613ea0565b73ffffffffffffffffffffffffffffffffffffffff161461353c5761350581613500613ea0565b612ef3565b61353b576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6135f961366f565b73ffffffffffffffffffffffffffffffffffffffff16613617611c61565b73ffffffffffffffffffffffffffffffffffffffff161461366d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161366490615cf5565b60405180910390fd5b565b600033905090565b60006001905090565b600061368b82613a85565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146136f2576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806136fe84613ea8565b91509150613714818761370f613ea0565b613ecf565b6137605761372986613724613ea0565b612ef3565b61375f576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036137c6576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6137d38686866001613f13565b80156137de57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506138ac85613888888887613f19565b7c020000000000000000000000000000000000000000000000000000000017613f41565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603613932576000600185019050600060046000838152602001908152602001600020540361393057600054811461392f578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461399a8686866001613f6c565b505050505050565b6000826139af8584613f72565b1490509392505050565b6002600954036139fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139f590615d61565b60405180910390fd5b6002600981905550565b6001600981905550565b613a1d8484846110bf565b60008373ffffffffffffffffffffffffffffffffffffffff163b14613a7f57613a4884848484613fc8565b613a7e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60008082905080613a94613677565b11613b1a57600054811015613b195760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603613b17575b60008103613b0d576004600083600190039350838152602001908152602001600020549050613ae3565b8092505050613b4c565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b613c31828260405180602001604052806000815250614118565b5050565b8060076000613c42613ea0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16613cef613ea0565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051613d3491906145d2565b60405180910390a35050565b606060128054613d4f906150d9565b80601f0160208091040260200160405190810160405280929190818152602001828054613d7b906150d9565b8015613dc85780601f10613d9d57610100808354040283529160200191613dc8565b820191906000526020600020905b815481529060010190602001808311613dab57829003601f168201915b5050505050905090565b606060006001613de1846141b5565b01905060008167ffffffffffffffff811115613e0057613dff6147fe565b5b6040519080825280601f01601f191660200182016040528015613e325781602001600182028036833780820191505090505b509050600082602001820190505b600115613e95578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581613e8957613e88615d81565b5b04945060008503613e40575b819350505050919050565b600033905090565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8613f30868684614308565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60008082905060005b8451811015613fbd57613fa882868381518110613f9b57613f9a615ba0565b5b6020026020010151614311565b91508080613fb590615bcf565b915050613f7b565b508091505092915050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613fee613ea0565b8786866040518563ffffffff1660e01b81526004016140109493929190615e05565b6020604051808303816000875af192505050801561404c57506040513d601f19601f820116820180604052508101906140499190615e66565b60015b6140c5573d806000811461407c576040519150601f19603f3d011682016040523d82523d6000602084013e614081565b606091505b5060008151036140bd576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b614122838361433c565b60008373ffffffffffffffffffffffffffffffffffffffff163b146141b057600080549050600083820390505b6141626000868380600101945086613fc8565b614198576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061414f5781600054146141ad57600080fd5b50505b505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310614213577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161420957614208615d81565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310614250576d04ee2d6d415b85acef8100000000838161424657614245615d81565b5b0492506020810190505b662386f26fc10000831061427f57662386f26fc10000838161427557614274615d81565b5b0492506010810190505b6305f5e10083106142a8576305f5e100838161429e5761429d615d81565b5b0492506008810190505b61271083106142cd5761271083816142c3576142c2615d81565b5b0492506004810190505b606483106142f057606483816142e6576142e5615d81565b5b0492506002810190505b600a83106142ff576001810190505b80915050919050565b60009392505050565b60008183106143295761432482846144f7565b614334565b61433383836144f7565b5b905092915050565b6000805490506000820361437c576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6143896000848385613f13565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550614400836143f16000866000613f19565b6143fa8561450e565b17613f41565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b8181146144a157808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050614466565b50600082036144dc576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506144f26000848385613f6c565b505050565b600082600052816020526040600020905092915050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61456781614532565b811461457257600080fd5b50565b6000813590506145848161455e565b92915050565b6000602082840312156145a05761459f614528565b5b60006145ae84828501614575565b91505092915050565b60008115159050919050565b6145cc816145b7565b82525050565b60006020820190506145e760008301846145c3565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561462757808201518184015260208101905061460c565b60008484015250505050565b6000601f19601f8301169050919050565b600061464f826145ed565b61465981856145f8565b9350614669818560208601614609565b61467281614633565b840191505092915050565b600060208201905081810360008301526146978184614644565b905092915050565b6000819050919050565b6146b28161469f565b81146146bd57600080fd5b50565b6000813590506146cf816146a9565b92915050565b6000602082840312156146eb576146ea614528565b5b60006146f9848285016146c0565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061472d82614702565b9050919050565b61473d81614722565b82525050565b60006020820190506147586000830184614734565b92915050565b61476781614722565b811461477257600080fd5b50565b6000813590506147848161475e565b92915050565b600080604083850312156147a1576147a0614528565b5b60006147af85828601614775565b92505060206147c0858286016146c0565b9150509250929050565b6147d38161469f565b82525050565b60006020820190506147ee60008301846147ca565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61483682614633565b810181811067ffffffffffffffff82111715614855576148546147fe565b5b80604052505050565b600061486861451e565b9050614874828261482d565b919050565b600067ffffffffffffffff821115614894576148936147fe565b5b61489d82614633565b9050602081019050919050565b82818337600083830152505050565b60006148cc6148c784614879565b61485e565b9050828152602081018484840111156148e8576148e76147f9565b5b6148f38482856148aa565b509392505050565b600082601f8301126149105761490f6147f4565b5b81356149208482602086016148b9565b91505092915050565b60006020828403121561493f5761493e614528565b5b600082013567ffffffffffffffff81111561495d5761495c61452d565b5b614969848285016148fb565b91505092915050565b61497b816145b7565b811461498657600080fd5b50565b60008135905061499881614972565b92915050565b6000602082840312156149b4576149b3614528565b5b60006149c284828501614989565b91505092915050565b6000806000606084860312156149e4576149e3614528565b5b60006149f286828701614775565b9350506020614a0386828701614775565b9250506040614a14868287016146c0565b9150509250925092565b600080fd5b600080fd5b60008083601f840112614a3e57614a3d6147f4565b5b8235905067ffffffffffffffff811115614a5b57614a5a614a1e565b5b602083019150836020820283011115614a7757614a76614a23565b5b9250929050565b600080600060408486031215614a9757614a96614528565b5b600084013567ffffffffffffffff811115614ab557614ab461452d565b5b614ac186828701614a28565b93509350506020614ad486828701614989565b9150509250925092565b600060208284031215614af457614af3614528565b5b6000614b0284828501614775565b91505092915050565b6000819050919050565b614b1e81614b0b565b82525050565b6000604082019050614b396000830185614b15565b614b466020830184614b15565b9392505050565b60008060408385031215614b6457614b63614528565b5b6000614b72858286016146c0565b9250506020614b83858286016146c0565b9150509250929050565b614b9681614b0b565b8114614ba157600080fd5b50565b600081359050614bb381614b8d565b92915050565b60008060408385031215614bd057614bcf614528565b5b6000614bde85828601614ba4565b9250506020614bef85828601614ba4565b9150509250929050565b6000606082019050614c0e60008301866145c3565b614c1b60208301856147ca565b614c2860408301846147ca565b949350505050565b60008060408385031215614c4757614c46614528565b5b6000614c5585828601614775565b9250506020614c6685828601614989565b9150509250929050565b6000606082019050614c8560008301866147ca565b614c9260208301856147ca565b614c9f60408301846147ca565b949350505050565b6000614cb282614702565b9050919050565b614cc281614ca7565b8114614ccd57600080fd5b50565b600081359050614cdf81614cb9565b92915050565b600060208284031215614cfb57614cfa614528565b5b6000614d0984828501614cd0565b91505092915050565b600067ffffffffffffffff821115614d2d57614d2c6147fe565b5b614d3682614633565b9050602081019050919050565b6000614d56614d5184614d12565b61485e565b905082815260208101848484011115614d7257614d716147f9565b5b614d7d8482856148aa565b509392505050565b600082601f830112614d9a57614d996147f4565b5b8135614daa848260208601614d43565b91505092915050565b60008060008060808587031215614dcd57614dcc614528565b5b6000614ddb87828801614775565b9450506020614dec87828801614775565b9350506040614dfd878288016146c0565b925050606085013567ffffffffffffffff811115614e1e57614e1d61452d565b5b614e2a87828801614d85565b91505092959194509250565b600080600060608486031215614e4f57614e4e614528565b5b6000614e5d868287016146c0565b9350506020614e6e868287016146c0565b9250506040614e7f868287016146c0565b9150509250925092565b600080600060408486031215614ea257614ea1614528565b5b6000614eb0868287016146c0565b935050602084013567ffffffffffffffff811115614ed157614ed061452d565b5b614edd86828701614a28565b92509250509250925092565b60008060408385031215614f0057614eff614528565b5b6000614f0e85828601614775565b9250506020614f1f85828601614775565b9150509250929050565b60008060408385031215614f4057614f3f614528565b5b6000614f4e858286016146c0565b9250506020614f5f85828601614775565b9150509250929050565b60008083601f840112614f7f57614f7e6147f4565b5b8235905067ffffffffffffffff811115614f9c57614f9b614a1e565b5b602083019150836020820283011115614fb857614fb7614a23565b5b9250929050565b60008083601f840112614fd557614fd46147f4565b5b8235905067ffffffffffffffff811115614ff257614ff1614a1e565b5b60208301915083602082028301111561500e5761500d614a23565b5b9250929050565b60008060008060006060868803121561503157615030614528565b5b600086013567ffffffffffffffff81111561504f5761504e61452d565b5b61505b88828901614f69565b9550955050602086013567ffffffffffffffff81111561507e5761507d61452d565b5b61508a88828901614fbf565b9350935050604061509d888289016146c0565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806150f157607f821691505b602082108103615104576151036150aa565b5b50919050565b7f417070726f76653a2043616e27742053656c6c204e6f77000000000000000000600082015250565b60006151406017836145f8565b915061514b8261510a565b602082019050919050565b6000602082019050818103600083015261516f81615133565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026151d87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261519b565b6151e2868361519b565b95508019841693508086168417925050509392505050565b6000819050919050565b600061521f61521a6152158461469f565b6151fa565b61469f565b9050919050565b6000819050919050565b61523983615204565b61524d61524582615226565b8484546151a8565b825550505050565b600090565b615262615255565b61526d818484615230565b505050565b5b818110156152915761528660008261525a565b600181019050615273565b5050565b601f8211156152d6576152a781615176565b6152b08461518b565b810160208510156152bf578190505b6152d36152cb8561518b565b830182615272565b50505b505050565b600082821c905092915050565b60006152f9600019846008026152db565b1980831691505092915050565b600061531283836152e8565b9150826002028217905092915050565b61532b826145ed565b67ffffffffffffffff811115615344576153436147fe565b5b61534e82546150d9565b615359828285615295565b600060209050601f83116001811461538c576000841561537a578287015190505b6153848582615306565b8655506153ec565b601f19841661539a86615176565b60005b828110156153c25784890151825560018201915060208501945060208101905061539d565b868310156153df57848901516153db601f8916826152e8565b8355505b6001600288020188555050505b505050505050565b7f5472616e736665723a2043616e27742053656c6c204e6f770000000000000000600082015250565b600061542a6018836145f8565b9150615435826153f4565b602082019050919050565b600060208201905081810360008301526154598161541d565b9050919050565b7f496e76616c69642057616c6c6574204164647265737300000000000000000000600082015250565b60006154966016836145f8565b91506154a182615460565b602082019050919050565b600060208201905081810360008301526154c581615489565b9050919050565b60008160601b9050919050565b60006154e4826154cc565b9050919050565b60006154f6826154d9565b9050919050565b61550e61550982614722565b6154eb565b82525050565b600061552082846154fd565b60148201915081905092915050565b7f52656c6561736520616d6f756e742073686f756c64206265206772656174657260008201527f207468616e207a65726f00000000000000000000000000000000000000000000602082015250565b600061558b602a836145f8565b91506155968261552f565b604082019050919050565b600060208201905081810360008301526155ba8161557e565b9050919050565b600081905092915050565b50565b60006155dc6000836155c1565b91506155e7826155cc565b600082019050919050565b60006155fd826155cf565b9150819050919050565b7f535472616e736665723a2043616e27742053656c6c204e6f7700000000000000600082015250565b600061563d6019836145f8565b915061564882615607565b602082019050919050565b6000602082019050818103600083015261566c81615630565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006156ad8261469f565b91506156b88361469f565b92508282019050808211156156d0576156cf615673565b5b92915050565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b600061570c6014836145f8565b9150615717826156d6565b602082019050919050565b6000602082019050818103600083015261573b816156ff565b9050919050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b60006157786014836145f8565b915061578382615742565b602082019050919050565b600060208201905081810360008301526157a78161576b565b9050919050565b60006157b98261469f565b91506157c48361469f565b92508282026157d28161469f565b915082820484148315176157e9576157e8615673565b5b5092915050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b60006158266013836145f8565b9150615831826157f0565b602082019050919050565b6000602082019050818103600083015261585581615819565b9050919050565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b60006158926017836145f8565b915061589d8261585c565b602082019050919050565b600060208201905081810360008301526158c181615885565b9050919050565b60006040820190506158dd6000830185614734565b6158ea60208301846147ca565b9392505050565b7f417070726f766520416c6c3a2043616e27742053656c6c204e6f770000000000600082015250565b6000615927601b836145f8565b9150615932826158f1565b602082019050919050565b600060208201905081810360008301526159568161591a565b9050919050565b7f535472616e73666572443a2043616e27742053656c6c204e6f77000000000000600082015250565b6000615993601a836145f8565b915061599e8261595d565b602082019050919050565b600060208201905081810360008301526159c281615986565b9050919050565b600081905092915050565b60006159df826145ed565b6159e981856159c9565b93506159f9818560208601614609565b80840191505092915050565b60008154615a12816150d9565b615a1c81866159c9565b94506001821660008114615a375760018114615a4c57615a7f565b60ff1983168652811515820286019350615a7f565b615a5585615176565b60005b83811015615a7757815481890152600182019150602081019050615a58565b838801955050505b50505092915050565b6000615a9482866159d4565b9150615aa082856159d4565b9150615aac8284615a05565b9150819050949350505050565b7f68696464656e0000000000000000000000000000000000000000000000000000600082015250565b6000615aef6006836159c9565b9150615afa82615ab9565b600682019050919050565b6000615b1182856159d4565b9150615b1c82615ae2565b9150615b288284615a05565b91508190509392505050565b7f496e76616c69642070726f6f6621000000000000000000000000000000000000600082015250565b6000615b6a600e836145f8565b9150615b7582615b34565b602082019050919050565b60006020820190508181036000830152615b9981615b5d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000615bda8261469f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615c0c57615c0b615673565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615c736026836145f8565b9150615c7e82615c17565b604082019050919050565b60006020820190508181036000830152615ca281615c66565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000615cdf6020836145f8565b9150615cea82615ca9565b602082019050919050565b60006020820190508181036000830152615d0e81615cd2565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000615d4b601f836145f8565b9150615d5682615d15565b602082019050919050565b60006020820190508181036000830152615d7a81615d3e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000615dd782615db0565b615de18185615dbb565b9350615df1818560208601614609565b615dfa81614633565b840191505092915050565b6000608082019050615e1a6000830187614734565b615e276020830186614734565b615e3460408301856147ca565b8181036060830152615e468184615dcc565b905095945050505050565b600081519050615e608161455e565b92915050565b600060208284031215615e7c57615e7b614528565b5b6000615e8a84828501615e51565b9150509291505056fea264697066735822122006996680c152b6f16c1200f9ca26a6ee5e25698531b4afb260027b57e8b22e4664736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000001f400000000000000000000000000000000000000000000000000000000000000002000000000000000000000000262ac903718b9e45e272cfb94ed0f3530541b2990000000000000000000000000000000000000000000000000000000000000008386c656d656e74730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002384c000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _tokenName (string): 8lements
Arg [1] : _tokenSymbol (string): 8L
Arg [2] : _maxSupply (uint256): 8000
Arg [3] : _mageListAllowedNFTs (uint256): 2
Arg [4] : _payments (address): 0x262ac903718B9e45E272cFb94Ed0f3530541B299
-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000001f40
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [4] : 000000000000000000000000262ac903718b9e45e272cfb94ed0f3530541b299
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [6] : 386c656d656e7473000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [8] : 384c000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
83287:12302:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49703:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50605:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57096:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;94523:260;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;92965:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;83463:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;91533:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;91641:84;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46356:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;94787:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;93553:307;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;94984:80;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;92642:111;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85970:366;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;95259:327;;;;;;;;;;;;;:::i;:::-;;92151:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;93236:311;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;91125:83;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;92407:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;91980:167;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;88701:363;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;91216:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51998:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;91729:81;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;92757:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;95068:77;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47540:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30482:103;;;;;;;;;;;;;:::i;:::-;;91814:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;91427:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;93060:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;29834:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50781:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;90737:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;88277:418;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;94223:294;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;85780:186;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;95149:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;92526:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;93866:351;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;89070:529;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85588:188;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;92862:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;90967:152;;;;;;;;;;;;;:::i;:::-;;87157:1114;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;86342:809;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;92285:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;94892:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;84201:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58045:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;89715:338;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;90059:553;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30740:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;90618:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49703:639;49788:4;50127:10;50112:25;;:11;:25;;;;:102;;;;50204:10;50189:25;;:11;:25;;;;50112:102;:179;;;;50281:10;50266:25;;:11;:25;;;;50112:179;50092:199;;49703:639;;;:::o;50605:100::-;50659:13;50692:5;50685:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50605:100;:::o;57096:218::-;57172:7;57197:16;57205:7;57197;:16::i;:::-;57192:64;;57222:34;;;;;;;;;;;;;;57192:64;57276:15;:24;57292:7;57276:24;;;;;;;;;;;:30;;;;;;;;;;;;57269:37;;57096:218;;;:::o;94523:260::-;94635:14;;;;;;;;;;;94629:20;;:2;:20;;;94626:105;;94671:10;;;;;;;;;;;94663:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;94626:105;94741:26;94755:2;94759:7;94741:13;:26::i;:::-;94523:260;;:::o;92965:91::-;93012:7;93038:12;;93031:19;;92965:91;:::o;83463:19::-;;;;:::o;91533:100::-;29720:13;:11;:13::i;:::-;91617:10:::1;91605:9;:22;;;;;;:::i;:::-;;91533:100:::0;:::o;91641:84::-;85370:12;:10;:12::i;:::-;85359:23;;:7;:5;:7::i;:::-;:23;;;;:48;;;;;85395:12;:10;:12::i;:::-;85386:21;;:5;;;;;;;;;;;:21;;;;85359:48;85355:96;;;85427:24;;;;;;;;;;;;;;85355:96;91713:6:::1;91704;;:15;;;;;;;;;;;;;;;;;;91641:84:::0;:::o;46356:323::-;46417:7;46645:15;:13;:15::i;:::-;46630:12;;46614:13;;:28;:46;46607:53;;46356:323;:::o;94787:101::-;85370:12;:10;:12::i;:::-;85359:23;;:7;:5;:7::i;:::-;:23;;;;:48;;;;;85395:12;:10;:12::i;:::-;85386:21;;:5;;;;;;;;;;;:21;;;;85359:48;85355:96;;;85427:24;;;;;;;;;;;;;;85355:96;94871:11:::1;94858:10;;:24;;;;;;;;;;;;;;;;;;94787:101:::0;:::o;93553:307::-;93711:14;;;;;;;;;;;93705:20;;:2;:20;;;93702:106;;93745:10;;;;;;;;;;;93737:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;93702:106;93816:37;93835:4;93841:2;93845:7;93816:18;:37::i;:::-;93553:307;;;:::o;94984:80::-;29720:13;:11;:13::i;:::-;95051:7:::1;95042:6;;:16;;;;;;;;;;;;;;;;;;94984:80:::0;:::o;92642:111::-;92697:11;92726:20;;;;;;;;;;;92717:29;;92642:111;:::o;85970:366::-;86083:4;85532:10;85519:23;;:9;:23;;;85511:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;86095:12:::1;86137;:10;:12::i;:::-;86120:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;86110:41;;;;;;86095:56;;86161:5;86158:173;;;86183:54;86202:12;;86183:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;86216:14;;86232:4;86183:18;:54::i;:::-;86176:61;;;;;86158:173;86269:50;86288:12;;86269:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;86302:10;;86314:4;86269:18;:50::i;:::-;86262:57;;;85575:1;85970:366:::0;;;;;:::o;95259:327::-;17544:21;:19;:21::i;:::-;85370:12:::1;:10;:12::i;:::-;85359:23;;:7;:5;:7::i;:::-;:23;;;;:48;;;;;85395:12;:10;:12::i;:::-;85386:21;;:5;;;;;;;;;;;:21;;;;85359:48;85355:96;;;85427:24;;;;;;;;;;;;;;85355:96;95354:1:::2;95332:21;:23;95324:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;95411:13;;;;;;;;;;;95408:173;;;95435:12;95461:8;;;;;;;;;;;95453:22;;95483:21;95453:56;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;95434:75;;;95531:7;95523:16;;;::::0;::::2;;95557;;;;;;;;;;95425:156;95408:173;17588:20:::0;:18;:20::i;:::-;95259:327::o;92151:130::-;85370:12;:10;:12::i;:::-;85359:23;;:7;:5;:7::i;:::-;:23;;;;:48;;;;;85395:12;:10;:12::i;:::-;85386:21;;:5;;;;;;;;;;;:21;;;;85359:48;85355:96;;;85427:24;;;;;;;;;;;;;;85355:96;92255:20:::1;92233:19;:42;;;;92151:130:::0;:::o;93236:311::-;93389:14;;;;;;;;;;;93383:20;;:2;:20;;;93380:107;;93423:10;;;;;;;;;;;93415:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;93380:107;93495:45;93518:4;93524:2;93528:7;93495:45;;;;;;;;;;;;:22;:45::i;:::-;93236:311;;;:::o;91125:83::-;85370:12;:10;:12::i;:::-;85359:23;;:7;:5;:7::i;:::-;:23;;;;:48;;;;;85395:12;:10;:12::i;:::-;85386:21;;:5;;;;;;;;;;;:21;;;;85359:48;85355:96;;;85427:24;;;;;;;;;;;;;;85355:96;91197:5:::1;91190:4;:12;;;;91125:83:::0;:::o;92407:115::-;92467:11;92495;:21;92507:8;92495:21;;;;;;;;;;;;;;;;;;;;;;;;;92486:30;;92407:115;;;:::o;91980:167::-;92025:19;92046:23;92092:10;;92078:24;;92127:14;;92109:32;;91980:167;;:::o;88701:363::-;88791:12;:10;:12::i;:::-;88775:28;;:14;;;;;;;;;;;:28;;;88772:62;;88812:22;;;;;;;;;;;;;;88772:62;88865:12;:10;:12::i;:::-;88844:33;;:17;88852:8;88844:7;:17::i;:::-;:33;;;88841:62;;88886:17;;;;;;;;;;;;;;88841:62;88914:17;88922:8;88914:7;:17::i;:::-;88910:57;;88940:27;;;;;;;;;;;;;;88910:57;88986:1;88977:6;:10;:33;;;;;88992:8;:18;89001:8;88992:18;;;;;;;;;;;;;;;;;;;;;88991:19;88977:33;88974:85;;;89045:6;89020:11;:21;89032:8;89020:21;;;;;;;;;;;;:31;;;;;;;:::i;:::-;;;;;;;;88974:85;88701:363;;:::o;91216:103::-;29720:13;:11;:13::i;:::-;91280:33:::1;91304:8;91280:23;:33::i;:::-;91216:103:::0;:::o;51998:152::-;52070:7;52113:27;52132:7;52113:18;:27::i;:::-;52090:52;;51998:152;;;:::o;91729:81::-;91770:11;91798:6;;;;;;;;;;;91789:15;;91729:81;:::o;92757:99::-;85370:12;:10;:12::i;:::-;85359:23;;:7;:5;:7::i;:::-;:23;;;;:48;;;;;85395:12;:10;:12::i;:::-;85386:21;;:5;;;;;;;;;;;:21;;;;85359:48;85355:96;;;85427:24;;;;;;;;;;;;;;85355:96;92840:10:::1;92828:9;:22;;;;92757:99:::0;:::o;95068:77::-;29720:13;:11;:13::i;:::-;95133:6:::1;95125:5;;:14;;;;;;;;;;;;;;;;;;95068:77:::0;:::o;47540:233::-;47612:7;47653:1;47636:19;;:5;:19;;;47632:60;;47664:28;;;;;;;;;;;;;;47632:60;41699:13;47710:18;:25;47729:5;47710:25;;;;;;;;;;;;;;;;:55;47703:62;;47540:233;;;:::o;30482:103::-;29720:13;:11;:13::i;:::-;30547:30:::1;30574:1;30547:18;:30::i;:::-;30482:103::o:0;91814:162::-;29720:13;:11;:13::i;:::-;91920:11:::1;91907:10;:24;;;;91955:15;91938:14;:32;;;;91814:162:::0;;:::o;91427:100::-;29720:13;:11;:13::i;:::-;91511:10:::1;91499:9;:22;;;;;;:::i;:::-;;91427:100:::0;:::o;93060:172::-;93125:4;93130:7;93138;93161:8;:18;93170:8;93161:18;;;;;;;;;;;;;;;;;;;;;93180:11;:21;93192:8;93180:21;;;;;;;;;;;;93202:13;:23;93216:8;93202:23;;;;;;;;;;;;93153:73;;;;;;93060:172;;;;;:::o;29834:87::-;29880:7;29907:6;;;;;;;;;;;29900:13;;29834:87;:::o;50781:104::-;50837:13;50870:7;50863:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50781:104;:::o;90737:224::-;90793:17;90801:8;90793:7;:17::i;:::-;90789:57;;90819:27;;;;;;;;;;;;;;90789:57;90877:12;:10;:12::i;:::-;90856:33;;:17;90864:8;90856:7;:17::i;:::-;:33;;;90853:62;;90898:17;;;;;;;;;;;;;;90853:62;90922:33;90930:14;;;;;;;;;;;90946:8;90922:7;:33::i;:::-;90737:224;:::o;88277:418::-;88342:11;85118:1;85102:13;:17;85094:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;85192:9;;85175:13;85159;:11;:13::i;:::-;:29;;;;:::i;:::-;:42;;85151:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;85261:13;85254:4;;:20;;;;:::i;:::-;85241:9;:33;;85233:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;85532:10:::1;85519:23;;:9;:23;;;85511:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;88391:6:::2;;;;;;;;;;;88390:7;88382:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;88449:19;;88435:11;:33;88432:68;;;88477:23;;;;;;;;;;;;;;88432:68;88523:9;88507:12;;:25;;;;;;;:::i;:::-;;;;;;;;88572:9;;88558:11;88542:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:39;88539:63;;88596:4;88583:10;;:17;;;;;;;;;;;;;;;;;;88539:63;88608:36;88618:12;:10;:12::i;:::-;88632:11;88608:9;:36::i;:::-;88656:33;88663:12;:10;:12::i;:::-;88677:11;88656:33;;;;;;;:::i;:::-;;;;;;;;88277:418:::0;;:::o;94223:294::-;94343:14;;;;;;;;;;;94337:20;;:2;:20;;;94334:113;;94379:10;;;;;;;;;;;94371:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;94334:113;94457:37;94481:2;94485:8;94457:23;:37::i;:::-;94223:294;;:::o;85780:186::-;85823:17;85841:15;85858:19;85898:8;;85886:20;;85923:6;;85913:16;;85950:10;;85936:24;;85780:186;;;:::o;95149:106::-;29720:13;:11;:13::i;:::-;95239:9:::1;95220:8;;:29;;;;;;;;;;;;;;;;;;95149:106:::0;:::o;92526:112::-;85370:12;:10;:12::i;:::-;85359:23;;:7;:5;:7::i;:::-;:23;;;;:48;;;;;85395:12;:10;:12::i;:::-;85386:21;;:5;;;;;;;;;;;:21;;;;85359:48;85355:96;;;85427:24;;;;;;;;;;;;;;85355:96;92626:6:::1;92603:20;;:29;;;;;;;;;;;;;;;;;;92526:112:::0;:::o;93866:351::-;94047:14;;;;;;;;;;;94041:20;;:2;:20;;;94038:116;;94081:10;;;;;;;;;;;94073:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;94038:116;94162:45;94185:4;94190:2;94193:7;94201:5;94162:22;:45::i;:::-;93866:351;;;;:::o;89070:529::-;89144:13;89170:17;89178:8;89170:7;:17::i;:::-;89166:57;;89196:27;;;;;;;;;;;;;;89166:57;89233:8;:18;89242:8;89233:18;;;;;;;;;;;;;;;;;;;;;89230:364;;;89261:15;89279:13;:23;89293:8;89279:23;;;;;;;;;;;;89261:41;;89345:1;89324:10;:8;:10::i;:::-;89318:24;:28;:125;;;;;;;;;;;;;;;;;89384:10;:8;:10::i;:::-;89396:18;:7;:16;:18::i;:::-;89416:9;89367:59;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;89318:125;89311:132;;;;;89230:364;89498:1;89477:10;:8;:10::i;:::-;89471:24;:28;:115;;;;;;;;;;;;;;;;;89537:10;:8;:10::i;:::-;89559:9;89520:49;;;;;;;;;:::i;:::-;;;;;;;;;;;;;89471:115;89464:122;;89070:529;;;;:::o;85588:188::-;85370:12;:10;:12::i;:::-;85359:23;;:7;:5;:7::i;:::-;:23;;;;:48;;;;;85395:12;:10;:12::i;:::-;85386:21;;:5;;;;;;;;;;;:21;;;;85359:48;85355:96;;;85427:24;;;;;;;;;;;;;;85355:96;85707:9:::1;85696:8;:20;;;;85732:7;85723:6;:16;;;;85759:11;85746:10;:24;;;;85588:188:::0;;;:::o;92862:95::-;92908:7;92930:21;92923:28;;92862:95;:::o;90967:152::-;91033:1;91009:26;;:14;;;;;;;;;;;:26;;;91006:60;;91044:22;;;;;;;;;;;;;;91006:60;91073:38;91091:14;;;;;;;;;;;91106:4;91073:17;:38::i;:::-;90967:152::o;87157:1114::-;87266:11;85118:1;85102:13;:17;85094:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;85192:9;;85175:13;85159;:11;:13::i;:::-;:29;;;;:::i;:::-;:42;;85151:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;85261:13;85254:4;;:20;;;;:::i;:::-;85241:9;:33;;85233:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;85532:10:::1;85519:23;;:9;:23;;;85511:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;87311:20:::2;;;;;;;;;;;87307:57;;87340:24;;;;;;;;;;;;;;87307:57;87393:8;;87374:15;:27;;:55;;;;;87423:6;;87405:15;:24;87374:55;87371:762;;;87482:19;;87467:11;87442:8;:22;87451:12;:10;:12::i;:::-;87442:22;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;:59;87439:162;;87540:11;87514:8;:22;87523:12;:10;:12::i;:::-;87514:22;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;87439:162;;;87574:27;;;;;;;;;;;;;;87439:162;87610:12;87652;:10;:12::i;:::-;87635:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;87625:41;;;;;;87610:56;;87683:54;87702:12;;87683:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;87716:14;;87732:4;87683:18;:54::i;:::-;87675:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;87430:337;87371:762;;;87792:6;;87775:15;:23;;:55;;;;;87820:10;;87802:15;:28;87775:55;87772:361;;;87843:11;:25;87855:12;:10;:12::i;:::-;87843:25;;;;;;;;;;;;;;;;;;;;;;;;;87840:132;;;87887:18;;;;;;;;;;;;;;87840:132;87958:4;87930:11;:25;87942:12;:10;:12::i;:::-;87930:25;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;87980:12;88022;:10;:12::i;:::-;88005:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;87995:41;;;;;;87980:56;;88053:50;88072:12;;88053:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;88086:10;;88098:4;88053:18;:50::i;:::-;88045:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;87831:302;87772:361;87371:762;88155:9;88139:12;;:25;;;;;;;:::i;:::-;;;;;;;;88171:36;88181:12;:10;:12::i;:::-;88195:11;88171:9;:36::i;:::-;88223:42;88239:12;:10;:12::i;:::-;88253:11;88223:42;;;;;;;:::i;:::-;;;;;;;;87157:1114:::0;;;;:::o;86342:809::-;86415:12;:10;:12::i;:::-;86396:31;;:17;86404:8;86396:7;:17::i;:::-;:31;;;86393:60;;86436:17;;;;;;;;;;;;;;86393:60;86463:8;:18;86472:8;86463:18;;;;;;;;;;;;;;;;;;;;;86460:54;;;86490:24;;;;;;;;;;;;;;86460:54;86525:17;86533:8;86525:7;:17::i;:::-;86521:57;;86551:27;;;;;;;;;;;;;;86521:57;86589:6;;;;;;;;;;;86585:40;;86604:21;;;;;;;;;;;;;;86585:40;86632:10;86657;86709:7;86685:11;:21;86697:8;86685:21;;;;;;;;;;;;:31;86682:108;;;86744:4;86739:1;86730:6;;:10;;;;:::i;:::-;:18;86727:55;;86758:4;86750:12;;86727:55;;;86777:5;86769:13;;86727:55;86682:108;86827:7;86801:11;:21;86813:8;86801:21;;;;;;;;;;;;:33;86798:111;;86863:4;86858:1;86849:6;;:10;;;;:::i;:::-;:18;86846:55;;86877:4;86869:12;;86846:55;;;86896:5;86888:13;;86846:55;86798:111;86918:5;86915:112;;;86943:1;86933:6;;:11;;;;;;;:::i;:::-;;;;;;;;86979:6;;86953:13;:23;86967:8;86953:23;;;;;;;;;;;:32;;;;87015:4;86994:8;:18;87003:8;86994:18;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;86915:112;87037:5;87034:112;;;87062:1;87052:6;;:11;;;;;;;:::i;:::-;;;;;;;;87098:6;;87072:13;:23;87086:8;87072:23;;;;;;;;;;;:32;;;;87134:4;87113:8;:18;87122:8;87113:18;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;87034:112;86386:765;;86342:809;:::o;92285:116::-;92344:15;92377:8;:18;92386:8;92377:18;;;;;;;;;;;;;;;;92367:28;;92285:116;;;:::o;94892:88::-;29720:13;:11;:13::i;:::-;94967:7:::1;94951:13;;:23;;;;;;;;;;;;;;;;;;94892:88:::0;:::o;84201:34::-;;;;:::o;58045:164::-;58142:4;58166:18;:25;58185:5;58166:25;;;;;;;;;;;;;;;:35;58192:8;58166:35;;;;;;;;;;;;;;;;;;;;;;;;;58159:42;;58045:164;;;;:::o;89715:338::-;85370:12;:10;:12::i;:::-;85359:23;;:7;:5;:7::i;:::-;:23;;;;:48;;;;;85395:12;:10;:12::i;:::-;85386:21;;:5;;;;;;;;;;;:21;;;;85359:48;85355:96;;;85427:24;;;;;;;;;;;;;;85355:96;89832:1:::1;89818:11;:15;89810:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;89904:9;;89889:11;89873:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;89865:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;89978:9;;89964:11;89948:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:39;89945:63;;90002:4;89989:10;;:17;;;;;;;;;;;;;;;;;;89945:63;90014:33;90024:9;90035:11;90014:9;:33::i;:::-;89715:338:::0;;:::o;90059:553::-;85370:12;:10;:12::i;:::-;85359:23;;:7;:5;:7::i;:::-;:23;;;;:48;;;;;85395:12;:10;:12::i;:::-;85386:21;;:5;;;;;;;;;;;:21;;;;85359:48;85355:96;;;85427:24;;;;;;;;;;;;;;85355:96;90234:1:::1;90215:16;:20;90207:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;90311:9;;90291:16;90275:13;:11;:13::i;:::-;:32;;;;:::i;:::-;:45;;90267:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;90354:18;90390:9:::0;90385:152:::1;90409:10;;:17;;90405:1;:21;90385:152;;;90446:40;90456:10;;90467:1;90456:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;90471:11;;90483:1;90471:14;;;;;;;:::i;:::-;;;;;;;;90446:9;:40::i;:::-;90513:11;;90525:1;90513:14;;;;;;;:::i;:::-;;;;;;;;90499:28;;;;;:::i;:::-;;;90428:3;;;;;:::i;:::-;;;;90385:152;;;;90577:9;;90564:10;90548:13;:11;:13::i;:::-;:26;;;;:::i;:::-;:38;90545:62;;90601:4;90588:10;;:17;;;;;;;;;;;;;;;;;;90545:62;90200:412;90059:553:::0;;;;;:::o;30740:201::-;29720:13;:11;:13::i;:::-;30849:1:::1;30829:22;;:8;:22;;::::0;30821:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;30905:28;30924:8;30905:18;:28::i;:::-;30740:201:::0;:::o;90618:113::-;29720:13;:11;:13::i;:::-;90710:15:::1;90693:14;;:32;;;;;;;;;;;;;;;;;;90618:113:::0;:::o;58467:282::-;58532:4;58588:7;58569:15;:13;:15::i;:::-;:26;;:66;;;;;58622:13;;58612:7;:23;58569:66;:153;;;;;58721:1;42475:8;58673:17;:26;58691:7;58673:26;;;;;;;;;;;;:44;:49;58569:153;58549:173;;58467:282;;;:::o;56529:408::-;56618:13;56634:16;56642:7;56634;:16::i;:::-;56618:32;;56690:5;56667:28;;:19;:17;:19::i;:::-;:28;;;56663:175;;56715:44;56732:5;56739:19;:17;:19::i;:::-;56715:16;:44::i;:::-;56710:128;;56787:35;;;;;;;;;;;;;;56710:128;56663:175;56883:2;56850:15;:24;56866:7;56850:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;56921:7;56917:2;56901:28;;56910:5;56901:28;;;;;;;;;;;;56607:330;56529:408;;:::o;29999:132::-;30074:12;:10;:12::i;:::-;30063:23;;:7;:5;:7::i;:::-;:23;;;30055:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;29999:132::o;28385:98::-;28438:7;28465:10;28458:17;;28385:98;:::o;91326:95::-;91391:7;91414:1;91407:8;;91326:95;:::o;60735:2825::-;60877:27;60907;60926:7;60907:18;:27::i;:::-;60877:57;;60992:4;60951:45;;60967:19;60951:45;;;60947:86;;61005:28;;;;;;;;;;;;;;60947:86;61047:27;61076:23;61103:35;61130:7;61103:26;:35::i;:::-;61046:92;;;;61238:68;61263:15;61280:4;61286:19;:17;:19::i;:::-;61238:24;:68::i;:::-;61233:180;;61326:43;61343:4;61349:19;:17;:19::i;:::-;61326:16;:43::i;:::-;61321:92;;61378:35;;;;;;;;;;;;;;61321:92;61233:180;61444:1;61430:16;;:2;:16;;;61426:52;;61455:23;;;;;;;;;;;;;;61426:52;61491:43;61513:4;61519:2;61523:7;61532:1;61491:21;:43::i;:::-;61627:15;61624:160;;;61767:1;61746:19;61739:30;61624:160;62164:18;:24;62183:4;62164:24;;;;;;;;;;;;;;;;62162:26;;;;;;;;;;;;62233:18;:22;62252:2;62233:22;;;;;;;;;;;;;;;;62231:24;;;;;;;;;;;62555:146;62592:2;62641:45;62656:4;62662:2;62666:19;62641:14;:45::i;:::-;42755:8;62613:73;62555:18;:146::i;:::-;62526:17;:26;62544:7;62526:26;;;;;;;;;;;:175;;;;62872:1;42755:8;62821:19;:47;:52;62817:627;;62894:19;62926:1;62916:7;:11;62894:33;;63083:1;63049:17;:30;63067:11;63049:30;;;;;;;;;;;;:35;63045:384;;63187:13;;63172:11;:28;63168:242;;63367:19;63334:17;:30;63352:11;63334:30;;;;;;;;;;;:52;;;;63168:242;63045:384;62875:569;62817:627;63491:7;63487:2;63472:27;;63481:4;63472:27;;;;;;;;;;;;63510:42;63531:4;63537:2;63541:7;63550:1;63510:20;:42::i;:::-;60866:2694;;;60735:2825;;;:::o;19367:190::-;19492:4;19545;19516:25;19529:5;19536:4;19516:12;:25::i;:::-;:33;19509:40;;19367:190;;;;;:::o;17624:293::-;17026:1;17758:7;;:19;17750:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;17026:1;17891:7;:18;;;;17624:293::o;17925:213::-;16982:1;18108:7;:22;;;;17925:213::o;64447:407::-;64622:31;64635:4;64641:2;64645:7;64622:12;:31::i;:::-;64686:1;64668:2;:14;;;:19;64664:183;;64707:56;64738:4;64744:2;64748:7;64757:5;64707:30;:56::i;:::-;64702:145;;64791:40;;;;;;;;;;;;;;64702:145;64664:183;64447:407;;;;:::o;53153:1275::-;53220:7;53240:12;53255:7;53240:22;;53323:4;53304:15;:13;:15::i;:::-;:23;53300:1061;;53357:13;;53350:4;:20;53346:1015;;;53395:14;53412:17;:23;53430:4;53412:23;;;;;;;;;;;;53395:40;;53529:1;42475:8;53501:6;:24;:29;53497:845;;54166:113;54183:1;54173:6;:11;54166:113;;54226:17;:25;54244:6;;;;;;;54226:25;;;;;;;;;;;;54217:34;;54166:113;;;54312:6;54305:13;;;;;;53497:845;53372:989;53346:1015;53300:1061;54389:31;;;;;;;;;;;;;;53153:1275;;;;:::o;31101:191::-;31175:16;31194:6;;;;;;;;;;;31175:25;;31220:8;31211:6;;:17;;;;;;;;;;;;;;;;;;31275:8;31244:40;;31265:8;31244:40;;;;;;;;;;;;31164:128;31101:191;:::o;74607:112::-;74684:27;74694:2;74698:8;74684:27;;;;;;;;;;;;:9;:27::i;:::-;74607:112;;:::o;57654:234::-;57801:8;57749:18;:39;57768:19;:17;:19::i;:::-;57749:39;;;;;;;;;;;;;;;:49;57789:8;57749:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;57861:8;57825:55;;57840:19;:17;:19::i;:::-;57825:55;;;57871:8;57825:55;;;;;;:::i;:::-;;;;;;;;57654:234;;:::o;89605:104::-;89665:13;89694:9;89687:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;89605:104;:::o;13305:716::-;13361:13;13412:14;13449:1;13429:17;13440:5;13429:10;:17::i;:::-;:21;13412:38;;13465:20;13499:6;13488:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13465:41;;13521:11;13650:6;13646:2;13642:15;13634:6;13630:28;13623:35;;13687:288;13694:4;13687:288;;;13719:5;;;;;;;;13861:8;13856:2;13849:5;13845:14;13840:30;13835:3;13827:44;13917:2;13908:11;;;;;;:::i;:::-;;;;;13951:1;13942:5;:10;13687:288;13938:21;13687:288;13996:6;13989:13;;;;;13305:716;;;:::o;80775:105::-;80835:7;80862:10;80855:17;;80775:105;:::o;59630:485::-;59732:27;59761:23;59802:38;59843:15;:24;59859:7;59843:24;;;;;;;;;;;59802:65;;60020:18;59997:41;;60077:19;60071:26;60052:45;;59982:126;59630:485;;;:::o;58858:659::-;59007:11;59172:16;59165:5;59161:28;59152:37;;59332:16;59321:9;59317:32;59304:45;;59482:15;59471:9;59468:30;59460:5;59449:9;59446:20;59443:56;59433:66;;58858:659;;;;;:::o;65516:159::-;;;;;:::o;80084:311::-;80219:7;80239:16;42879:3;80265:19;:41;;80239:68;;42879:3;80333:31;80344:4;80350:2;80354:9;80333:10;:31::i;:::-;80325:40;;:62;;80318:69;;;80084:311;;;;;:::o;54976:450::-;55056:14;55224:16;55217:5;55213:28;55204:37;;55401:5;55387:11;55362:23;55358:41;55355:52;55348:5;55345:63;55335:73;;54976:450;;;;:::o;66340:158::-;;;;;:::o;20234:296::-;20317:7;20337:20;20360:4;20337:27;;20380:9;20375:118;20399:5;:12;20395:1;:16;20375:118;;;20448:33;20458:12;20472:5;20478:1;20472:8;;;;;;;;:::i;:::-;;;;;;;;20448:9;:33::i;:::-;20433:48;;20413:3;;;;;:::i;:::-;;;;20375:118;;;;20510:12;20503:19;;;20234:296;;;;:::o;66938:716::-;67101:4;67147:2;67122:45;;;67168:19;:17;:19::i;:::-;67189:4;67195:7;67204:5;67122:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;67118:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67422:1;67405:6;:13;:18;67401:235;;67451:40;;;;;;;;;;;;;;67401:235;67594:6;67588:13;67579:6;67575:2;67571:15;67564:38;67118:529;67291:54;;;67281:64;;;:6;:64;;;;67274:71;;;66938:716;;;;;;:::o;73834:689::-;73965:19;73971:2;73975:8;73965:5;:19::i;:::-;74044:1;74026:2;:14;;;:19;74022:483;;74066:11;74080:13;;74066:27;;74112:13;74134:8;74128:3;:14;74112:30;;74161:233;74192:62;74231:1;74235:2;74239:7;;;;;;74248:5;74192:30;:62::i;:::-;74187:167;;74290:40;;;;;;;;;;;;;;74187:167;74389:3;74381:5;:11;74161:233;;74476:3;74459:13;;:20;74455:34;;74481:8;;;74455:34;74047:458;;74022:483;73834:689;;;:::o;10171:922::-;10224:7;10244:14;10261:1;10244:18;;10311:6;10302:5;:15;10298:102;;10347:6;10338:15;;;;;;:::i;:::-;;;;;10382:2;10372:12;;;;10298:102;10427:6;10418:5;:15;10414:102;;10463:6;10454:15;;;;;;:::i;:::-;;;;;10498:2;10488:12;;;;10414:102;10543:6;10534:5;:15;10530:102;;10579:6;10570:15;;;;;;:::i;:::-;;;;;10614:2;10604:12;;;;10530:102;10659:5;10650;:14;10646:99;;10694:5;10685:14;;;;;;:::i;:::-;;;;;10728:1;10718:11;;;;10646:99;10772:5;10763;:14;10759:99;;10807:5;10798:14;;;;;;:::i;:::-;;;;;10841:1;10831:11;;;;10759:99;10885:5;10876;:14;10872:99;;10920:5;10911:14;;;;;;:::i;:::-;;;;;10954:1;10944:11;;;;10872:99;10998:5;10989;:14;10985:66;;11034:1;11024:11;;;;10985:66;11079:6;11072:13;;;10171:922;;;:::o;79785:147::-;79922:6;79785:147;;;;;:::o;27274:149::-;27337:7;27368:1;27364;:5;:51;;27395:20;27410:1;27413;27395:14;:20::i;:::-;27364:51;;;27372:20;27387:1;27390;27372:14;:20::i;:::-;27364:51;27357:58;;27274:149;;;;:::o;68116:2966::-;68189:20;68212:13;;68189:36;;68252:1;68240:8;:13;68236:44;;68262:18;;;;;;;;;;;;;;68236:44;68293:61;68323:1;68327:2;68331:12;68345:8;68293:21;:61::i;:::-;68837:1;41837:2;68807:1;:26;;68806:32;68794:8;:45;68768:18;:22;68787:2;68768:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;69116:139;69153:2;69207:33;69230:1;69234:2;69238:1;69207:14;:33::i;:::-;69174:30;69195:8;69174:20;:30::i;:::-;:66;69116:18;:139::i;:::-;69082:17;:31;69100:12;69082:31;;;;;;;;;;;:173;;;;69272:16;69303:11;69332:8;69317:12;:23;69303:37;;69853:16;69849:2;69845:25;69833:37;;70225:12;70185:8;70144:1;70082:25;70023:1;69962;69935:335;70596:1;70582:12;70578:20;70536:346;70637:3;70628:7;70625:16;70536:346;;70855:7;70845:8;70842:1;70815:25;70812:1;70809;70804:59;70690:1;70681:7;70677:15;70666:26;;70536:346;;;70540:77;70927:1;70915:8;:13;70911:45;;70937:19;;;;;;;;;;;;;;70911:45;70989:3;70973:13;:19;;;;68542:2462;;71014:60;71043:1;71047:2;71051:12;71065:8;71014:20;:60::i;:::-;68178:2904;68116:2966;;:::o;27431:268::-;27499:13;27606:1;27600:4;27593:15;27635:1;27629:4;27622:15;27676:4;27670;27660:21;27651:30;;27431:268;;;;:::o;55528:324::-;55598:14;55831:1;55821:8;55818:15;55792:24;55788:46;55778:56;;55528:324;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:117::-;5351:1;5348;5341:12;5365:117;5474:1;5471;5464:12;5488:180;5536:77;5533:1;5526:88;5633:4;5630:1;5623:15;5657:4;5654:1;5647:15;5674:281;5757:27;5779:4;5757:27;:::i;:::-;5749:6;5745:40;5887:6;5875:10;5872:22;5851:18;5839:10;5836:34;5833:62;5830:88;;;5898:18;;:::i;:::-;5830:88;5938:10;5934:2;5927:22;5717:238;5674:281;;:::o;5961:129::-;5995:6;6022:20;;:::i;:::-;6012:30;;6051:33;6079:4;6071:6;6051:33;:::i;:::-;5961:129;;;:::o;6096:308::-;6158:4;6248:18;6240:6;6237:30;6234:56;;;6270:18;;:::i;:::-;6234:56;6308:29;6330:6;6308:29;:::i;:::-;6300:37;;6392:4;6386;6382:15;6374:23;;6096:308;;;:::o;6410:146::-;6507:6;6502:3;6497;6484:30;6548:1;6539:6;6534:3;6530:16;6523:27;6410:146;;;:::o;6562:425::-;6640:5;6665:66;6681:49;6723:6;6681:49;:::i;:::-;6665:66;:::i;:::-;6656:75;;6754:6;6747:5;6740:21;6792:4;6785:5;6781:16;6830:3;6821:6;6816:3;6812:16;6809:25;6806:112;;;6837:79;;:::i;:::-;6806:112;6927:54;6974:6;6969:3;6964;6927:54;:::i;:::-;6646:341;6562:425;;;;;:::o;7007:340::-;7063:5;7112:3;7105:4;7097:6;7093:17;7089:27;7079:122;;7120:79;;:::i;:::-;7079:122;7237:6;7224:20;7262:79;7337:3;7329:6;7322:4;7314:6;7310:17;7262:79;:::i;:::-;7253:88;;7069:278;7007:340;;;;:::o;7353:509::-;7422:6;7471:2;7459:9;7450:7;7446:23;7442:32;7439:119;;;7477:79;;:::i;:::-;7439:119;7625:1;7614:9;7610:17;7597:31;7655:18;7647:6;7644:30;7641:117;;;7677:79;;:::i;:::-;7641:117;7782:63;7837:7;7828:6;7817:9;7813:22;7782:63;:::i;:::-;7772:73;;7568:287;7353:509;;;;:::o;7868:116::-;7938:21;7953:5;7938:21;:::i;:::-;7931:5;7928:32;7918:60;;7974:1;7971;7964:12;7918:60;7868:116;:::o;7990:133::-;8033:5;8071:6;8058:20;8049:29;;8087:30;8111:5;8087:30;:::i;:::-;7990:133;;;;:::o;8129:323::-;8185:6;8234:2;8222:9;8213:7;8209:23;8205:32;8202:119;;;8240:79;;:::i;:::-;8202:119;8360:1;8385:50;8427:7;8418:6;8407:9;8403:22;8385:50;:::i;:::-;8375:60;;8331:114;8129:323;;;;:::o;8458:619::-;8535:6;8543;8551;8600:2;8588:9;8579:7;8575:23;8571:32;8568:119;;;8606:79;;:::i;:::-;8568:119;8726:1;8751:53;8796:7;8787:6;8776:9;8772:22;8751:53;:::i;:::-;8741:63;;8697:117;8853:2;8879:53;8924:7;8915:6;8904:9;8900:22;8879:53;:::i;:::-;8869:63;;8824:118;8981:2;9007:53;9052:7;9043:6;9032:9;9028:22;9007:53;:::i;:::-;8997:63;;8952:118;8458:619;;;;;:::o;9083:117::-;9192:1;9189;9182:12;9206:117;9315:1;9312;9305:12;9346:568;9419:8;9429:6;9479:3;9472:4;9464:6;9460:17;9456:27;9446:122;;9487:79;;:::i;:::-;9446:122;9600:6;9587:20;9577:30;;9630:18;9622:6;9619:30;9616:117;;;9652:79;;:::i;:::-;9616:117;9766:4;9758:6;9754:17;9742:29;;9820:3;9812:4;9804:6;9800:17;9790:8;9786:32;9783:41;9780:128;;;9827:79;;:::i;:::-;9780:128;9346:568;;;;;:::o;9920:698::-;10012:6;10020;10028;10077:2;10065:9;10056:7;10052:23;10048:32;10045:119;;;10083:79;;:::i;:::-;10045:119;10231:1;10220:9;10216:17;10203:31;10261:18;10253:6;10250:30;10247:117;;;10283:79;;:::i;:::-;10247:117;10396:80;10468:7;10459:6;10448:9;10444:22;10396:80;:::i;:::-;10378:98;;;;10174:312;10525:2;10551:50;10593:7;10584:6;10573:9;10569:22;10551:50;:::i;:::-;10541:60;;10496:115;9920:698;;;;;:::o;10624:329::-;10683:6;10732:2;10720:9;10711:7;10707:23;10703:32;10700:119;;;10738:79;;:::i;:::-;10700:119;10858:1;10883:53;10928:7;10919:6;10908:9;10904:22;10883:53;:::i;:::-;10873:63;;10829:117;10624:329;;;;:::o;10959:77::-;10996:7;11025:5;11014:16;;10959:77;;;:::o;11042:118::-;11129:24;11147:5;11129:24;:::i;:::-;11124:3;11117:37;11042:118;;:::o;11166:332::-;11287:4;11325:2;11314:9;11310:18;11302:26;;11338:71;11406:1;11395:9;11391:17;11382:6;11338:71;:::i;:::-;11419:72;11487:2;11476:9;11472:18;11463:6;11419:72;:::i;:::-;11166:332;;;;;:::o;11504:474::-;11572:6;11580;11629:2;11617:9;11608:7;11604:23;11600:32;11597:119;;;11635:79;;:::i;:::-;11597:119;11755:1;11780:53;11825:7;11816:6;11805:9;11801:22;11780:53;:::i;:::-;11770:63;;11726:117;11882:2;11908:53;11953:7;11944:6;11933:9;11929:22;11908:53;:::i;:::-;11898:63;;11853:118;11504:474;;;;;:::o;11984:122::-;12057:24;12075:5;12057:24;:::i;:::-;12050:5;12047:35;12037:63;;12096:1;12093;12086:12;12037:63;11984:122;:::o;12112:139::-;12158:5;12196:6;12183:20;12174:29;;12212:33;12239:5;12212:33;:::i;:::-;12112:139;;;;:::o;12257:474::-;12325:6;12333;12382:2;12370:9;12361:7;12357:23;12353:32;12350:119;;;12388:79;;:::i;:::-;12350:119;12508:1;12533:53;12578:7;12569:6;12558:9;12554:22;12533:53;:::i;:::-;12523:63;;12479:117;12635:2;12661:53;12706:7;12697:6;12686:9;12682:22;12661:53;:::i;:::-;12651:63;;12606:118;12257:474;;;;;:::o;12737:430::-;12880:4;12918:2;12907:9;12903:18;12895:26;;12931:65;12993:1;12982:9;12978:17;12969:6;12931:65;:::i;:::-;13006:72;13074:2;13063:9;13059:18;13050:6;13006:72;:::i;:::-;13088;13156:2;13145:9;13141:18;13132:6;13088:72;:::i;:::-;12737:430;;;;;;:::o;13173:468::-;13238:6;13246;13295:2;13283:9;13274:7;13270:23;13266:32;13263:119;;;13301:79;;:::i;:::-;13263:119;13421:1;13446:53;13491:7;13482:6;13471:9;13467:22;13446:53;:::i;:::-;13436:63;;13392:117;13548:2;13574:50;13616:7;13607:6;13596:9;13592:22;13574:50;:::i;:::-;13564:60;;13519:115;13173:468;;;;;:::o;13647:442::-;13796:4;13834:2;13823:9;13819:18;13811:26;;13847:71;13915:1;13904:9;13900:17;13891:6;13847:71;:::i;:::-;13928:72;13996:2;13985:9;13981:18;13972:6;13928:72;:::i;:::-;14010;14078:2;14067:9;14063:18;14054:6;14010:72;:::i;:::-;13647:442;;;;;;:::o;14095:104::-;14140:7;14169:24;14187:5;14169:24;:::i;:::-;14158:35;;14095:104;;;:::o;14205:138::-;14286:32;14312:5;14286:32;:::i;:::-;14279:5;14276:43;14266:71;;14333:1;14330;14323:12;14266:71;14205:138;:::o;14349:155::-;14403:5;14441:6;14428:20;14419:29;;14457:41;14492:5;14457:41;:::i;:::-;14349:155;;;;:::o;14510:345::-;14577:6;14626:2;14614:9;14605:7;14601:23;14597:32;14594:119;;;14632:79;;:::i;:::-;14594:119;14752:1;14777:61;14830:7;14821:6;14810:9;14806:22;14777:61;:::i;:::-;14767:71;;14723:125;14510:345;;;;:::o;14861:307::-;14922:4;15012:18;15004:6;15001:30;14998:56;;;15034:18;;:::i;:::-;14998:56;15072:29;15094:6;15072:29;:::i;:::-;15064:37;;15156:4;15150;15146:15;15138:23;;14861:307;;;:::o;15174:423::-;15251:5;15276:65;15292:48;15333:6;15292:48;:::i;:::-;15276:65;:::i;:::-;15267:74;;15364:6;15357:5;15350:21;15402:4;15395:5;15391:16;15440:3;15431:6;15426:3;15422:16;15419:25;15416:112;;;15447:79;;:::i;:::-;15416:112;15537:54;15584:6;15579:3;15574;15537:54;:::i;:::-;15257:340;15174:423;;;;;:::o;15616:338::-;15671:5;15720:3;15713:4;15705:6;15701:17;15697:27;15687:122;;15728:79;;:::i;:::-;15687:122;15845:6;15832:20;15870:78;15944:3;15936:6;15929:4;15921:6;15917:17;15870:78;:::i;:::-;15861:87;;15677:277;15616:338;;;;:::o;15960:943::-;16055:6;16063;16071;16079;16128:3;16116:9;16107:7;16103:23;16099:33;16096:120;;;16135:79;;:::i;:::-;16096:120;16255:1;16280:53;16325:7;16316:6;16305:9;16301:22;16280:53;:::i;:::-;16270:63;;16226:117;16382:2;16408:53;16453:7;16444:6;16433:9;16429:22;16408:53;:::i;:::-;16398:63;;16353:118;16510:2;16536:53;16581:7;16572:6;16561:9;16557:22;16536:53;:::i;:::-;16526:63;;16481:118;16666:2;16655:9;16651:18;16638:32;16697:18;16689:6;16686:30;16683:117;;;16719:79;;:::i;:::-;16683:117;16824:62;16878:7;16869:6;16858:9;16854:22;16824:62;:::i;:::-;16814:72;;16609:287;15960:943;;;;;;;:::o;16909:619::-;16986:6;16994;17002;17051:2;17039:9;17030:7;17026:23;17022:32;17019:119;;;17057:79;;:::i;:::-;17019:119;17177:1;17202:53;17247:7;17238:6;17227:9;17223:22;17202:53;:::i;:::-;17192:63;;17148:117;17304:2;17330:53;17375:7;17366:6;17355:9;17351:22;17330:53;:::i;:::-;17320:63;;17275:118;17432:2;17458:53;17503:7;17494:6;17483:9;17479:22;17458:53;:::i;:::-;17448:63;;17403:118;16909:619;;;;;:::o;17534:704::-;17629:6;17637;17645;17694:2;17682:9;17673:7;17669:23;17665:32;17662:119;;;17700:79;;:::i;:::-;17662:119;17820:1;17845:53;17890:7;17881:6;17870:9;17866:22;17845:53;:::i;:::-;17835:63;;17791:117;17975:2;17964:9;17960:18;17947:32;18006:18;17998:6;17995:30;17992:117;;;18028:79;;:::i;:::-;17992:117;18141:80;18213:7;18204:6;18193:9;18189:22;18141:80;:::i;:::-;18123:98;;;;17918:313;17534:704;;;;;:::o;18244:474::-;18312:6;18320;18369:2;18357:9;18348:7;18344:23;18340:32;18337:119;;;18375:79;;:::i;:::-;18337:119;18495:1;18520:53;18565:7;18556:6;18545:9;18541:22;18520:53;:::i;:::-;18510:63;;18466:117;18622:2;18648:53;18693:7;18684:6;18673:9;18669:22;18648:53;:::i;:::-;18638:63;;18593:118;18244:474;;;;;:::o;18724:::-;18792:6;18800;18849:2;18837:9;18828:7;18824:23;18820:32;18817:119;;;18855:79;;:::i;:::-;18817:119;18975:1;19000:53;19045:7;19036:6;19025:9;19021:22;19000:53;:::i;:::-;18990:63;;18946:117;19102:2;19128:53;19173:7;19164:6;19153:9;19149:22;19128:53;:::i;:::-;19118:63;;19073:118;18724:474;;;;;:::o;19221:568::-;19294:8;19304:6;19354:3;19347:4;19339:6;19335:17;19331:27;19321:122;;19362:79;;:::i;:::-;19321:122;19475:6;19462:20;19452:30;;19505:18;19497:6;19494:30;19491:117;;;19527:79;;:::i;:::-;19491:117;19641:4;19633:6;19629:17;19617:29;;19695:3;19687:4;19679:6;19675:17;19665:8;19661:32;19658:41;19655:128;;;19702:79;;:::i;:::-;19655:128;19221:568;;;;;:::o;19812:::-;19885:8;19895:6;19945:3;19938:4;19930:6;19926:17;19922:27;19912:122;;19953:79;;:::i;:::-;19912:122;20066:6;20053:20;20043:30;;20096:18;20088:6;20085:30;20082:117;;;20118:79;;:::i;:::-;20082:117;20232:4;20224:6;20220:17;20208:29;;20286:3;20278:4;20270:6;20266:17;20256:8;20252:32;20249:41;20246:128;;;20293:79;;:::i;:::-;20246:128;19812:568;;;;;:::o;20386:1079::-;20517:6;20525;20533;20541;20549;20598:2;20586:9;20577:7;20573:23;20569:32;20566:119;;;20604:79;;:::i;:::-;20566:119;20752:1;20741:9;20737:17;20724:31;20782:18;20774:6;20771:30;20768:117;;;20804:79;;:::i;:::-;20768:117;20917:80;20989:7;20980:6;20969:9;20965:22;20917:80;:::i;:::-;20899:98;;;;20695:312;21074:2;21063:9;21059:18;21046:32;21105:18;21097:6;21094:30;21091:117;;;21127:79;;:::i;:::-;21091:117;21240:80;21312:7;21303:6;21292:9;21288:22;21240:80;:::i;:::-;21222:98;;;;21017:313;21369:2;21395:53;21440:7;21431:6;21420:9;21416:22;21395:53;:::i;:::-;21385:63;;21340:118;20386:1079;;;;;;;;:::o;21471:180::-;21519:77;21516:1;21509:88;21616:4;21613:1;21606:15;21640:4;21637:1;21630:15;21657:320;21701:6;21738:1;21732:4;21728:12;21718:22;;21785:1;21779:4;21775:12;21806:18;21796:81;;21862:4;21854:6;21850:17;21840:27;;21796:81;21924:2;21916:6;21913:14;21893:18;21890:38;21887:84;;21943:18;;:::i;:::-;21887:84;21708:269;21657:320;;;:::o;21983:173::-;22123:25;22119:1;22111:6;22107:14;22100:49;21983:173;:::o;22162:366::-;22304:3;22325:67;22389:2;22384:3;22325:67;:::i;:::-;22318:74;;22401:93;22490:3;22401:93;:::i;:::-;22519:2;22514:3;22510:12;22503:19;;22162:366;;;:::o;22534:419::-;22700:4;22738:2;22727:9;22723:18;22715:26;;22787:9;22781:4;22777:20;22773:1;22762:9;22758:17;22751:47;22815:131;22941:4;22815:131;:::i;:::-;22807:139;;22534:419;;;:::o;22959:141::-;23008:4;23031:3;23023:11;;23054:3;23051:1;23044:14;23088:4;23085:1;23075:18;23067:26;;22959:141;;;:::o;23106:93::-;23143:6;23190:2;23185;23178:5;23174:14;23170:23;23160:33;;23106:93;;;:::o;23205:107::-;23249:8;23299:5;23293:4;23289:16;23268:37;;23205:107;;;;:::o;23318:393::-;23387:6;23437:1;23425:10;23421:18;23460:97;23490:66;23479:9;23460:97;:::i;:::-;23578:39;23608:8;23597:9;23578:39;:::i;:::-;23566:51;;23650:4;23646:9;23639:5;23635:21;23626:30;;23699:4;23689:8;23685:19;23678:5;23675:30;23665:40;;23394:317;;23318:393;;;;;:::o;23717:60::-;23745:3;23766:5;23759:12;;23717:60;;;:::o;23783:142::-;23833:9;23866:53;23884:34;23893:24;23911:5;23893:24;:::i;:::-;23884:34;:::i;:::-;23866:53;:::i;:::-;23853:66;;23783:142;;;:::o;23931:75::-;23974:3;23995:5;23988:12;;23931:75;;;:::o;24012:269::-;24122:39;24153:7;24122:39;:::i;:::-;24183:91;24232:41;24256:16;24232:41;:::i;:::-;24224:6;24217:4;24211:11;24183:91;:::i;:::-;24177:4;24170:105;24088:193;24012:269;;;:::o;24287:73::-;24332:3;24287:73;:::o;24366:189::-;24443:32;;:::i;:::-;24484:65;24542:6;24534;24528:4;24484:65;:::i;:::-;24419:136;24366:189;;:::o;24561:186::-;24621:120;24638:3;24631:5;24628:14;24621:120;;;24692:39;24729:1;24722:5;24692:39;:::i;:::-;24665:1;24658:5;24654:13;24645:22;;24621:120;;;24561:186;;:::o;24753:543::-;24854:2;24849:3;24846:11;24843:446;;;24888:38;24920:5;24888:38;:::i;:::-;24972:29;24990:10;24972:29;:::i;:::-;24962:8;24958:44;25155:2;25143:10;25140:18;25137:49;;;25176:8;25161:23;;25137:49;25199:80;25255:22;25273:3;25255:22;:::i;:::-;25245:8;25241:37;25228:11;25199:80;:::i;:::-;24858:431;;24843:446;24753:543;;;:::o;25302:117::-;25356:8;25406:5;25400:4;25396:16;25375:37;;25302:117;;;;:::o;25425:169::-;25469:6;25502:51;25550:1;25546:6;25538:5;25535:1;25531:13;25502:51;:::i;:::-;25498:56;25583:4;25577;25573:15;25563:25;;25476:118;25425:169;;;;:::o;25599:295::-;25675:4;25821:29;25846:3;25840:4;25821:29;:::i;:::-;25813:37;;25883:3;25880:1;25876:11;25870:4;25867:21;25859:29;;25599:295;;;;:::o;25899:1395::-;26016:37;26049:3;26016:37;:::i;:::-;26118:18;26110:6;26107:30;26104:56;;;26140:18;;:::i;:::-;26104:56;26184:38;26216:4;26210:11;26184:38;:::i;:::-;26269:67;26329:6;26321;26315:4;26269:67;:::i;:::-;26363:1;26387:4;26374:17;;26419:2;26411:6;26408:14;26436:1;26431:618;;;;27093:1;27110:6;27107:77;;;27159:9;27154:3;27150:19;27144:26;27135:35;;27107:77;27210:67;27270:6;27263:5;27210:67;:::i;:::-;27204:4;27197:81;27066:222;26401:887;;26431:618;26483:4;26479:9;26471:6;26467:22;26517:37;26549:4;26517:37;:::i;:::-;26576:1;26590:208;26604:7;26601:1;26598:14;26590:208;;;26683:9;26678:3;26674:19;26668:26;26660:6;26653:42;26734:1;26726:6;26722:14;26712:24;;26781:2;26770:9;26766:18;26753:31;;26627:4;26624:1;26620:12;26615:17;;26590:208;;;26826:6;26817:7;26814:19;26811:179;;;26884:9;26879:3;26875:19;26869:26;26927:48;26969:4;26961:6;26957:17;26946:9;26927:48;:::i;:::-;26919:6;26912:64;26834:156;26811:179;27036:1;27032;27024:6;27020:14;27016:22;27010:4;27003:36;26438:611;;;26401:887;;25991:1303;;;25899:1395;;:::o;27300:174::-;27440:26;27436:1;27428:6;27424:14;27417:50;27300:174;:::o;27480:366::-;27622:3;27643:67;27707:2;27702:3;27643:67;:::i;:::-;27636:74;;27719:93;27808:3;27719:93;:::i;:::-;27837:2;27832:3;27828:12;27821:19;;27480:366;;;:::o;27852:419::-;28018:4;28056:2;28045:9;28041:18;28033:26;;28105:9;28099:4;28095:20;28091:1;28080:9;28076:17;28069:47;28133:131;28259:4;28133:131;:::i;:::-;28125:139;;27852:419;;;:::o;28277:172::-;28417:24;28413:1;28405:6;28401:14;28394:48;28277:172;:::o;28455:366::-;28597:3;28618:67;28682:2;28677:3;28618:67;:::i;:::-;28611:74;;28694:93;28783:3;28694:93;:::i;:::-;28812:2;28807:3;28803:12;28796:19;;28455:366;;;:::o;28827:419::-;28993:4;29031:2;29020:9;29016:18;29008:26;;29080:9;29074:4;29070:20;29066:1;29055:9;29051:17;29044:47;29108:131;29234:4;29108:131;:::i;:::-;29100:139;;28827:419;;;:::o;29252:94::-;29285:8;29333:5;29329:2;29325:14;29304:35;;29252:94;;;:::o;29352:::-;29391:7;29420:20;29434:5;29420:20;:::i;:::-;29409:31;;29352:94;;;:::o;29452:100::-;29491:7;29520:26;29540:5;29520:26;:::i;:::-;29509:37;;29452:100;;;:::o;29558:157::-;29663:45;29683:24;29701:5;29683:24;:::i;:::-;29663:45;:::i;:::-;29658:3;29651:58;29558:157;;:::o;29721:256::-;29833:3;29848:75;29919:3;29910:6;29848:75;:::i;:::-;29948:2;29943:3;29939:12;29932:19;;29968:3;29961:10;;29721:256;;;;:::o;29983:229::-;30123:34;30119:1;30111:6;30107:14;30100:58;30192:12;30187:2;30179:6;30175:15;30168:37;29983:229;:::o;30218:366::-;30360:3;30381:67;30445:2;30440:3;30381:67;:::i;:::-;30374:74;;30457:93;30546:3;30457:93;:::i;:::-;30575:2;30570:3;30566:12;30559:19;;30218:366;;;:::o;30590:419::-;30756:4;30794:2;30783:9;30779:18;30771:26;;30843:9;30837:4;30833:20;30829:1;30818:9;30814:17;30807:47;30871:131;30997:4;30871:131;:::i;:::-;30863:139;;30590:419;;;:::o;31015:147::-;31116:11;31153:3;31138:18;;31015:147;;;;:::o;31168:114::-;;:::o;31288:398::-;31447:3;31468:83;31549:1;31544:3;31468:83;:::i;:::-;31461:90;;31560:93;31649:3;31560:93;:::i;:::-;31678:1;31673:3;31669:11;31662:18;;31288:398;;;:::o;31692:379::-;31876:3;31898:147;32041:3;31898:147;:::i;:::-;31891:154;;32062:3;32055:10;;31692:379;;;:::o;32077:175::-;32217:27;32213:1;32205:6;32201:14;32194:51;32077:175;:::o;32258:366::-;32400:3;32421:67;32485:2;32480:3;32421:67;:::i;:::-;32414:74;;32497:93;32586:3;32497:93;:::i;:::-;32615:2;32610:3;32606:12;32599:19;;32258:366;;;:::o;32630:419::-;32796:4;32834:2;32823:9;32819:18;32811:26;;32883:9;32877:4;32873:20;32869:1;32858:9;32854:17;32847:47;32911:131;33037:4;32911:131;:::i;:::-;32903:139;;32630:419;;;:::o;33055:180::-;33103:77;33100:1;33093:88;33200:4;33197:1;33190:15;33224:4;33221:1;33214:15;33241:191;33281:3;33300:20;33318:1;33300:20;:::i;:::-;33295:25;;33334:20;33352:1;33334:20;:::i;:::-;33329:25;;33377:1;33374;33370:9;33363:16;;33398:3;33395:1;33392:10;33389:36;;;33405:18;;:::i;:::-;33389:36;33241:191;;;;:::o;33438:170::-;33578:22;33574:1;33566:6;33562:14;33555:46;33438:170;:::o;33614:366::-;33756:3;33777:67;33841:2;33836:3;33777:67;:::i;:::-;33770:74;;33853:93;33942:3;33853:93;:::i;:::-;33971:2;33966:3;33962:12;33955:19;;33614:366;;;:::o;33986:419::-;34152:4;34190:2;34179:9;34175:18;34167:26;;34239:9;34233:4;34229:20;34225:1;34214:9;34210:17;34203:47;34267:131;34393:4;34267:131;:::i;:::-;34259:139;;33986:419;;;:::o;34411:170::-;34551:22;34547:1;34539:6;34535:14;34528:46;34411:170;:::o;34587:366::-;34729:3;34750:67;34814:2;34809:3;34750:67;:::i;:::-;34743:74;;34826:93;34915:3;34826:93;:::i;:::-;34944:2;34939:3;34935:12;34928:19;;34587:366;;;:::o;34959:419::-;35125:4;35163:2;35152:9;35148:18;35140:26;;35212:9;35206:4;35202:20;35198:1;35187:9;35183:17;35176:47;35240:131;35366:4;35240:131;:::i;:::-;35232:139;;34959:419;;;:::o;35384:410::-;35424:7;35447:20;35465:1;35447:20;:::i;:::-;35442:25;;35481:20;35499:1;35481:20;:::i;:::-;35476:25;;35536:1;35533;35529:9;35558:30;35576:11;35558:30;:::i;:::-;35547:41;;35737:1;35728:7;35724:15;35721:1;35718:22;35698:1;35691:9;35671:83;35648:139;;35767:18;;:::i;:::-;35648:139;35432:362;35384:410;;;;:::o;35800:169::-;35940:21;35936:1;35928:6;35924:14;35917:45;35800:169;:::o;35975:366::-;36117:3;36138:67;36202:2;36197:3;36138:67;:::i;:::-;36131:74;;36214:93;36303:3;36214:93;:::i;:::-;36332:2;36327:3;36323:12;36316:19;;35975:366;;;:::o;36347:419::-;36513:4;36551:2;36540:9;36536:18;36528:26;;36600:9;36594:4;36590:20;36586:1;36575:9;36571:17;36564:47;36628:131;36754:4;36628:131;:::i;:::-;36620:139;;36347:419;;;:::o;36772:173::-;36912:25;36908:1;36900:6;36896:14;36889:49;36772:173;:::o;36951:366::-;37093:3;37114:67;37178:2;37173:3;37114:67;:::i;:::-;37107:74;;37190:93;37279:3;37190:93;:::i;:::-;37308:2;37303:3;37299:12;37292:19;;36951:366;;;:::o;37323:419::-;37489:4;37527:2;37516:9;37512:18;37504:26;;37576:9;37570:4;37566:20;37562:1;37551:9;37547:17;37540:47;37604:131;37730:4;37604:131;:::i;:::-;37596:139;;37323:419;;;:::o;37748:332::-;37869:4;37907:2;37896:9;37892:18;37884:26;;37920:71;37988:1;37977:9;37973:17;37964:6;37920:71;:::i;:::-;38001:72;38069:2;38058:9;38054:18;38045:6;38001:72;:::i;:::-;37748:332;;;;;:::o;38086:177::-;38226:29;38222:1;38214:6;38210:14;38203:53;38086:177;:::o;38269:366::-;38411:3;38432:67;38496:2;38491:3;38432:67;:::i;:::-;38425:74;;38508:93;38597:3;38508:93;:::i;:::-;38626:2;38621:3;38617:12;38610:19;;38269:366;;;:::o;38641:419::-;38807:4;38845:2;38834:9;38830:18;38822:26;;38894:9;38888:4;38884:20;38880:1;38869:9;38865:17;38858:47;38922:131;39048:4;38922:131;:::i;:::-;38914:139;;38641:419;;;:::o;39066:176::-;39206:28;39202:1;39194:6;39190:14;39183:52;39066:176;:::o;39248:366::-;39390:3;39411:67;39475:2;39470:3;39411:67;:::i;:::-;39404:74;;39487:93;39576:3;39487:93;:::i;:::-;39605:2;39600:3;39596:12;39589:19;;39248:366;;;:::o;39620:419::-;39786:4;39824:2;39813:9;39809:18;39801:26;;39873:9;39867:4;39863:20;39859:1;39848:9;39844:17;39837:47;39901:131;40027:4;39901:131;:::i;:::-;39893:139;;39620:419;;;:::o;40045:148::-;40147:11;40184:3;40169:18;;40045:148;;;;:::o;40199:390::-;40305:3;40333:39;40366:5;40333:39;:::i;:::-;40388:89;40470:6;40465:3;40388:89;:::i;:::-;40381:96;;40486:65;40544:6;40539:3;40532:4;40525:5;40521:16;40486:65;:::i;:::-;40576:6;40571:3;40567:16;40560:23;;40309:280;40199:390;;;;:::o;40619:874::-;40722:3;40759:5;40753:12;40788:36;40814:9;40788:36;:::i;:::-;40840:89;40922:6;40917:3;40840:89;:::i;:::-;40833:96;;40960:1;40949:9;40945:17;40976:1;40971:166;;;;41151:1;41146:341;;;;40938:549;;40971:166;41055:4;41051:9;41040;41036:25;41031:3;41024:38;41117:6;41110:14;41103:22;41095:6;41091:35;41086:3;41082:45;41075:52;;40971:166;;41146:341;41213:38;41245:5;41213:38;:::i;:::-;41273:1;41287:154;41301:6;41298:1;41295:13;41287:154;;;41375:7;41369:14;41365:1;41360:3;41356:11;41349:35;41425:1;41416:7;41412:15;41401:26;;41323:4;41320:1;41316:12;41311:17;;41287:154;;;41470:6;41465:3;41461:16;41454:23;;41153:334;;40938:549;;40726:767;;40619:874;;;;:::o;41499:589::-;41724:3;41746:95;41837:3;41828:6;41746:95;:::i;:::-;41739:102;;41858:95;41949:3;41940:6;41858:95;:::i;:::-;41851:102;;41970:92;42058:3;42049:6;41970:92;:::i;:::-;41963:99;;42079:3;42072:10;;41499:589;;;;;;:::o;42094:156::-;42234:8;42230:1;42222:6;42218:14;42211:32;42094:156;:::o;42256:400::-;42416:3;42437:84;42519:1;42514:3;42437:84;:::i;:::-;42430:91;;42530:93;42619:3;42530:93;:::i;:::-;42648:1;42643:3;42639:11;42632:18;;42256:400;;;:::o;42662:695::-;42940:3;42962:95;43053:3;43044:6;42962:95;:::i;:::-;42955:102;;43074:148;43218:3;43074:148;:::i;:::-;43067:155;;43239:92;43327:3;43318:6;43239:92;:::i;:::-;43232:99;;43348:3;43341:10;;42662:695;;;;;:::o;43363:164::-;43503:16;43499:1;43491:6;43487:14;43480:40;43363:164;:::o;43533:366::-;43675:3;43696:67;43760:2;43755:3;43696:67;:::i;:::-;43689:74;;43772:93;43861:3;43772:93;:::i;:::-;43890:2;43885:3;43881:12;43874:19;;43533:366;;;:::o;43905:419::-;44071:4;44109:2;44098:9;44094:18;44086:26;;44158:9;44152:4;44148:20;44144:1;44133:9;44129:17;44122:47;44186:131;44312:4;44186:131;:::i;:::-;44178:139;;43905:419;;;:::o;44330:180::-;44378:77;44375:1;44368:88;44475:4;44472:1;44465:15;44499:4;44496:1;44489:15;44516:233;44555:3;44578:24;44596:5;44578:24;:::i;:::-;44569:33;;44624:66;44617:5;44614:77;44611:103;;44694:18;;:::i;:::-;44611:103;44741:1;44734:5;44730:13;44723:20;;44516:233;;;:::o;44755:225::-;44895:34;44891:1;44883:6;44879:14;44872:58;44964:8;44959:2;44951:6;44947:15;44940:33;44755:225;:::o;44986:366::-;45128:3;45149:67;45213:2;45208:3;45149:67;:::i;:::-;45142:74;;45225:93;45314:3;45225:93;:::i;:::-;45343:2;45338:3;45334:12;45327:19;;44986:366;;;:::o;45358:419::-;45524:4;45562:2;45551:9;45547:18;45539:26;;45611:9;45605:4;45601:20;45597:1;45586:9;45582:17;45575:47;45639:131;45765:4;45639:131;:::i;:::-;45631:139;;45358:419;;;:::o;45783:182::-;45923:34;45919:1;45911:6;45907:14;45900:58;45783:182;:::o;45971:366::-;46113:3;46134:67;46198:2;46193:3;46134:67;:::i;:::-;46127:74;;46210:93;46299:3;46210:93;:::i;:::-;46328:2;46323:3;46319:12;46312:19;;45971:366;;;:::o;46343:419::-;46509:4;46547:2;46536:9;46532:18;46524:26;;46596:9;46590:4;46586:20;46582:1;46571:9;46567:17;46560:47;46624:131;46750:4;46624:131;:::i;:::-;46616:139;;46343:419;;;:::o;46768:181::-;46908:33;46904:1;46896:6;46892:14;46885:57;46768:181;:::o;46955:366::-;47097:3;47118:67;47182:2;47177:3;47118:67;:::i;:::-;47111:74;;47194:93;47283:3;47194:93;:::i;:::-;47312:2;47307:3;47303:12;47296:19;;46955:366;;;:::o;47327:419::-;47493:4;47531:2;47520:9;47516:18;47508:26;;47580:9;47574:4;47570:20;47566:1;47555:9;47551:17;47544:47;47608:131;47734:4;47608:131;:::i;:::-;47600:139;;47327:419;;;:::o;47752:180::-;47800:77;47797:1;47790:88;47897:4;47894:1;47887:15;47921:4;47918:1;47911:15;47938:98;47989:6;48023:5;48017:12;48007:22;;47938:98;;;:::o;48042:168::-;48125:11;48159:6;48154:3;48147:19;48199:4;48194:3;48190:14;48175:29;;48042:168;;;;:::o;48216:373::-;48302:3;48330:38;48362:5;48330:38;:::i;:::-;48384:70;48447:6;48442:3;48384:70;:::i;:::-;48377:77;;48463:65;48521:6;48516:3;48509:4;48502:5;48498:16;48463:65;:::i;:::-;48553:29;48575:6;48553:29;:::i;:::-;48548:3;48544:39;48537:46;;48306:283;48216:373;;;;:::o;48595:640::-;48790:4;48828:3;48817:9;48813:19;48805:27;;48842:71;48910:1;48899:9;48895:17;48886:6;48842:71;:::i;:::-;48923:72;48991:2;48980:9;48976:18;48967:6;48923:72;:::i;:::-;49005;49073:2;49062:9;49058:18;49049:6;49005:72;:::i;:::-;49124:9;49118:4;49114:20;49109:2;49098:9;49094:18;49087:48;49152:76;49223:4;49214:6;49152:76;:::i;:::-;49144:84;;48595:640;;;;;;;:::o;49241:141::-;49297:5;49328:6;49322:13;49313:22;;49344:32;49370:5;49344:32;:::i;:::-;49241:141;;;;:::o;49388:349::-;49457:6;49506:2;49494:9;49485:7;49481:23;49477:32;49474:119;;;49512:79;;:::i;:::-;49474:119;49632:1;49657:63;49712:7;49703:6;49692:9;49688:22;49657:63;:::i;:::-;49647:73;;49603:127;49388:349;;;;:::o
Swarm Source
ipfs://06996680c152b6f16c1200f9ca26a6ee5e25698531b4afb260027b57e8b22e46
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.