Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
Castile_Tarot_Contract
Compiler Version
v0.8.25+commit.b61c2a91
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2024-05-20
*/
// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol
// OpenZeppelin Contracts (last updated v5.0.0) (utils/cryptography/MerkleProof.sol)
pragma solidity ^0.8.20;
/**
* @dev These functions deal with verification of Merkle Tree proofs.
*
* The tree and the proofs can be generated using our
* https://github.com/OpenZeppelin/merkle-tree[JavaScript library].
* You will find a quickstart guide in the readme.
*
* WARNING: You should avoid using leaf values that are 64 bytes long prior to
* hashing, or use a hash function other than keccak256 for hashing leaves.
* This is because the concatenation of a sorted pair of internal nodes in
* the Merkle tree could be reinterpreted as a leaf value.
* OpenZeppelin's JavaScript library generates Merkle trees that are safe
* against this attack out of the box.
*/
library MerkleProof {
/**
*@dev The multiproof provided is not valid.
*/
error MerkleProofInvalidMultiproof();
/**
* @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
* defined by `root`. For this, a `proof` must be provided, containing
* sibling hashes on the branch from the leaf to the root of the tree. Each
* pair of leaves and each pair of pre-images are assumed to be sorted.
*/
function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) internal pure returns (bool) {
return processProof(proof, leaf) == root;
}
/**
* @dev Calldata version of {verify}
*/
function verifyCalldata(bytes32[] calldata proof, bytes32 root, bytes32 leaf) internal pure returns (bool) {
return processProofCalldata(proof, leaf) == root;
}
/**
* @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
* from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
* hash matches the root of the tree. When processing the proof, the pairs
* of leafs & pre-images are assumed to be sorted.
*/
function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
bytes32 computedHash = leaf;
for (uint256 i = 0; i < proof.length; i++) {
computedHash = _hashPair(computedHash, proof[i]);
}
return computedHash;
}
/**
* @dev Calldata version of {processProof}
*/
function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
bytes32 computedHash = leaf;
for (uint256 i = 0; i < proof.length; i++) {
computedHash = _hashPair(computedHash, proof[i]);
}
return computedHash;
}
/**
* @dev Returns true if the `leaves` can be simultaneously proven to be a part of a Merkle tree defined by
* `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
*
* CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details.
*/
function multiProofVerify(
bytes32[] memory proof,
bool[] memory proofFlags,
bytes32 root,
bytes32[] memory leaves
) internal pure returns (bool) {
return processMultiProof(proof, proofFlags, leaves) == root;
}
/**
* @dev Calldata version of {multiProofVerify}
*
* CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details.
*/
function multiProofVerifyCalldata(
bytes32[] calldata proof,
bool[] calldata proofFlags,
bytes32 root,
bytes32[] memory leaves
) internal pure returns (bool) {
return processMultiProofCalldata(proof, proofFlags, leaves) == root;
}
/**
* @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction
* proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another
* leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false
* respectively.
*
* CAUTION: Not all Merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree
* is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the
* tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).
*/
function processMultiProof(
bytes32[] memory proof,
bool[] memory proofFlags,
bytes32[] memory leaves
) internal pure returns (bytes32 merkleRoot) {
// This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by
// consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
// `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
// the Merkle tree.
uint256 leavesLen = leaves.length;
uint256 proofLen = proof.length;
uint256 totalHashes = proofFlags.length;
// Check proof validity.
if (leavesLen + proofLen != totalHashes + 1) {
revert MerkleProofInvalidMultiproof();
}
// The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
// `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
bytes32[] memory hashes = new bytes32[](totalHashes);
uint256 leafPos = 0;
uint256 hashPos = 0;
uint256 proofPos = 0;
// At each step, we compute the next hash using two values:
// - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
// get the next hash.
// - depending on the flag, either another value from the "main queue" (merging branches) or an element from the
// `proof` array.
for (uint256 i = 0; i < totalHashes; i++) {
bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
bytes32 b = proofFlags[i]
? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])
: proof[proofPos++];
hashes[i] = _hashPair(a, b);
}
if (totalHashes > 0) {
if (proofPos != proofLen) {
revert MerkleProofInvalidMultiproof();
}
unchecked {
return hashes[totalHashes - 1];
}
} else if (leavesLen > 0) {
return leaves[0];
} else {
return proof[0];
}
}
/**
* @dev Calldata version of {processMultiProof}.
*
* CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details.
*/
function processMultiProofCalldata(
bytes32[] calldata proof,
bool[] calldata proofFlags,
bytes32[] memory leaves
) internal pure returns (bytes32 merkleRoot) {
// This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by
// consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
// `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
// the Merkle tree.
uint256 leavesLen = leaves.length;
uint256 proofLen = proof.length;
uint256 totalHashes = proofFlags.length;
// Check proof validity.
if (leavesLen + proofLen != totalHashes + 1) {
revert MerkleProofInvalidMultiproof();
}
// The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
// `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
bytes32[] memory hashes = new bytes32[](totalHashes);
uint256 leafPos = 0;
uint256 hashPos = 0;
uint256 proofPos = 0;
// At each step, we compute the next hash using two values:
// - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
// get the next hash.
// - depending on the flag, either another value from the "main queue" (merging branches) or an element from the
// `proof` array.
for (uint256 i = 0; i < totalHashes; i++) {
bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
bytes32 b = proofFlags[i]
? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])
: proof[proofPos++];
hashes[i] = _hashPair(a, b);
}
if (totalHashes > 0) {
if (proofPos != proofLen) {
revert MerkleProofInvalidMultiproof();
}
unchecked {
return hashes[totalHashes - 1];
}
} else if (leavesLen > 0) {
return leaves[0];
} else {
return proof[0];
}
}
/**
* @dev Sorts the pair (a, b) and hashes the result.
*/
function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
}
/**
* @dev Implementation of keccak256(abi.encode(a, b)) that doesn't allocate or expand memory.
*/
function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
/// @solidity memory-safe-assembly
assembly {
mstore(0x00, a)
mstore(0x20, b)
value := keccak256(0x00, 0x40)
}
}
}
// File: @openzeppelin/contracts/interfaces/draft-IERC6093.sol
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)
pragma solidity ^0.8.20;
/**
* @dev Standard ERC20 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens.
*/
interface IERC20Errors {
/**
* @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param balance Current balance for the interacting account.
* @param needed Minimum amount required to perform a transfer.
*/
error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC20InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC20InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.
* @param spender Address that may be allowed to operate on tokens without being their owner.
* @param allowance Amount of tokens a `spender` is allowed to operate with.
* @param needed Minimum amount required to perform a transfer.
*/
error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC20InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `spender` to be approved. Used in approvals.
* @param spender Address that may be allowed to operate on tokens without being their owner.
*/
error ERC20InvalidSpender(address spender);
}
/**
* @dev Standard ERC721 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens.
*/
interface IERC721Errors {
/**
* @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20.
* Used in balance queries.
* @param owner Address of the current owner of a token.
*/
error ERC721InvalidOwner(address owner);
/**
* @dev Indicates a `tokenId` whose `owner` is the zero address.
* @param tokenId Identifier number of a token.
*/
error ERC721NonexistentToken(uint256 tokenId);
/**
* @dev Indicates an error related to the ownership over a particular token. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param tokenId Identifier number of a token.
* @param owner Address of the current owner of a token.
*/
error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC721InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC721InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `operator`’s approval. Used in transfers.
* @param operator Address that may be allowed to operate on tokens without being their owner.
* @param tokenId Identifier number of a token.
*/
error ERC721InsufficientApproval(address operator, uint256 tokenId);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC721InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `operator` to be approved. Used in approvals.
* @param operator Address that may be allowed to operate on tokens without being their owner.
*/
error ERC721InvalidOperator(address operator);
}
/**
* @dev Standard ERC1155 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens.
*/
interface IERC1155Errors {
/**
* @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param balance Current balance for the interacting account.
* @param needed Minimum amount required to perform a transfer.
* @param tokenId Identifier number of a token.
*/
error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC1155InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC1155InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `operator`’s approval. Used in transfers.
* @param operator Address that may be allowed to operate on tokens without being their owner.
* @param owner Address of the current owner of a token.
*/
error ERC1155MissingApprovalForAll(address operator, address owner);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC1155InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `operator` to be approved. Used in approvals.
* @param operator Address that may be allowed to operate on tokens without being their owner.
*/
error ERC1155InvalidOperator(address operator);
/**
* @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.
* Used in batch transfers.
* @param idsLength Length of the array of token identifiers
* @param valuesLength Length of the array of token amounts
*/
error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}
// File: @openzeppelin/contracts/utils/math/SignedMath.sol
// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/SignedMath.sol)
pragma solidity ^0.8.20;
/**
* @dev Standard signed math utilities missing in the Solidity language.
*/
library SignedMath {
/**
* @dev Returns the largest of two signed numbers.
*/
function max(int256 a, int256 b) internal pure returns (int256) {
return a > b ? a : b;
}
/**
* @dev Returns the smallest of two signed numbers.
*/
function min(int256 a, int256 b) internal pure returns (int256) {
return a < b ? a : b;
}
/**
* @dev Returns the average of two signed numbers without overflow.
* The result is rounded towards zero.
*/
function average(int256 a, int256 b) internal pure returns (int256) {
// Formula from the book "Hacker's Delight"
int256 x = (a & b) + ((a ^ b) >> 1);
return x + (int256(uint256(x) >> 255) & (a ^ b));
}
/**
* @dev Returns the absolute unsigned value of a signed value.
*/
function abs(int256 n) internal pure returns (uint256) {
unchecked {
// must be unchecked in order to support `n = type(int256).min`
return uint256(n >= 0 ? n : -n);
}
}
}
// File: @openzeppelin/contracts/utils/math/Math.sol
// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/Math.sol)
pragma solidity ^0.8.20;
/**
* @dev Standard math utilities missing in the Solidity language.
*/
library Math {
/**
* @dev Muldiv operation overflow.
*/
error MathOverflowedMulDiv();
enum Rounding {
Floor, // Toward negative infinity
Ceil, // Toward positive infinity
Trunc, // Toward zero
Expand // Away from zero
}
/**
* @dev Returns the addition of two unsigned integers, with an overflow flag.
*/
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the subtraction of two unsigned integers, with an overflow flag.
*/
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b > a) return (false, 0);
return (true, a - b);
}
}
/**
* @dev Returns the multiplication of two unsigned integers, with an overflow flag.
*/
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the division of two unsigned integers, with a division by zero flag.
*/
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a / b);
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
*/
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a % b);
}
}
/**
* @dev Returns the largest of two numbers.
*/
function max(uint256 a, uint256 b) internal pure returns (uint256) {
return a > b ? a : b;
}
/**
* @dev Returns the smallest of two numbers.
*/
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return a < b ? a : b;
}
/**
* @dev Returns the average of two numbers. The result is rounded towards
* zero.
*/
function average(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b) / 2 can overflow.
return (a & b) + (a ^ b) / 2;
}
/**
* @dev Returns the ceiling of the division of two numbers.
*
* This differs from standard division with `/` in that it rounds towards infinity instead
* of rounding towards zero.
*/
function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
if (b == 0) {
// Guarantee the same behavior as in a regular Solidity division.
return a / b;
}
// (a + b - 1) / b can overflow on addition, so we distribute.
return a == 0 ? 0 : (a - 1) / b + 1;
}
/**
* @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or
* denominator == 0.
* @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by
* Uniswap Labs also under MIT license.
*/
function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {
unchecked {
// 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
// use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
// variables such that product = prod1 * 2^256 + prod0.
uint256 prod0 = x * y; // Least significant 256 bits of the product
uint256 prod1; // Most significant 256 bits of the product
assembly {
let mm := mulmod(x, y, not(0))
prod1 := sub(sub(mm, prod0), lt(mm, prod0))
}
// Handle non-overflow cases, 256 by 256 division.
if (prod1 == 0) {
// Solidity will revert if denominator == 0, unlike the div opcode on its own.
// The surrounding unchecked block does not change this fact.
// See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.
return prod0 / denominator;
}
// Make sure the result is less than 2^256. Also prevents denominator == 0.
if (denominator <= prod1) {
revert MathOverflowedMulDiv();
}
///////////////////////////////////////////////
// 512 by 256 division.
///////////////////////////////////////////////
// Make division exact by subtracting the remainder from [prod1 prod0].
uint256 remainder;
assembly {
// Compute remainder using mulmod.
remainder := mulmod(x, y, denominator)
// Subtract 256 bit number from 512 bit number.
prod1 := sub(prod1, gt(remainder, prod0))
prod0 := sub(prod0, remainder)
}
// Factor powers of two out of denominator and compute largest power of two divisor of denominator.
// Always >= 1. See https://cs.stackexchange.com/q/138556/92363.
uint256 twos = denominator & (0 - denominator);
assembly {
// Divide denominator by twos.
denominator := div(denominator, twos)
// Divide [prod1 prod0] by twos.
prod0 := div(prod0, twos)
// Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
twos := add(div(sub(0, twos), twos), 1)
}
// Shift in bits from prod1 into prod0.
prod0 |= prod1 * twos;
// Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
// that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
// four bits. That is, denominator * inv = 1 mod 2^4.
uint256 inverse = (3 * denominator) ^ 2;
// Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also
// works in modular arithmetic, doubling the correct bits in each step.
inverse *= 2 - denominator * inverse; // inverse mod 2^8
inverse *= 2 - denominator * inverse; // inverse mod 2^16
inverse *= 2 - denominator * inverse; // inverse mod 2^32
inverse *= 2 - denominator * inverse; // inverse mod 2^64
inverse *= 2 - denominator * inverse; // inverse mod 2^128
inverse *= 2 - denominator * inverse; // inverse mod 2^256
// Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
// This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
// less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
// is no longer required.
result = prod0 * inverse;
return result;
}
}
/**
* @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
*/
function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {
uint256 result = mulDiv(x, y, denominator);
if (unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0) {
result += 1;
}
return result;
}
/**
* @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded
* towards zero.
*
* Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
*/
function sqrt(uint256 a) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
// For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
//
// We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
// `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
//
// This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
// → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
// → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
//
// Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
uint256 result = 1 << (log2(a) >> 1);
// At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
// since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
// every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
// into the expected uint128 result.
unchecked {
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
return min(result, a / result);
}
}
/**
* @notice Calculates sqrt(a), following the selected rounding direction.
*/
function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = sqrt(a);
return result + (unsignedRoundsUp(rounding) && result * result < a ? 1 : 0);
}
}
/**
* @dev Return the log in base 2 of a positive value rounded towards zero.
* Returns 0 if given 0.
*/
function log2(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >> 128 > 0) {
value >>= 128;
result += 128;
}
if (value >> 64 > 0) {
value >>= 64;
result += 64;
}
if (value >> 32 > 0) {
value >>= 32;
result += 32;
}
if (value >> 16 > 0) {
value >>= 16;
result += 16;
}
if (value >> 8 > 0) {
value >>= 8;
result += 8;
}
if (value >> 4 > 0) {
value >>= 4;
result += 4;
}
if (value >> 2 > 0) {
value >>= 2;
result += 2;
}
if (value >> 1 > 0) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 2, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log2(value);
return result + (unsignedRoundsUp(rounding) && 1 << result < value ? 1 : 0);
}
}
/**
* @dev Return the log in base 10 of a positive value rounded towards zero.
* Returns 0 if given 0.
*/
function log10(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >= 10 ** 64) {
value /= 10 ** 64;
result += 64;
}
if (value >= 10 ** 32) {
value /= 10 ** 32;
result += 32;
}
if (value >= 10 ** 16) {
value /= 10 ** 16;
result += 16;
}
if (value >= 10 ** 8) {
value /= 10 ** 8;
result += 8;
}
if (value >= 10 ** 4) {
value /= 10 ** 4;
result += 4;
}
if (value >= 10 ** 2) {
value /= 10 ** 2;
result += 2;
}
if (value >= 10 ** 1) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 10, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log10(value);
return result + (unsignedRoundsUp(rounding) && 10 ** result < value ? 1 : 0);
}
}
/**
* @dev Return the log in base 256 of a positive value rounded towards zero.
* Returns 0 if given 0.
*
* Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
*/
function log256(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >> 128 > 0) {
value >>= 128;
result += 16;
}
if (value >> 64 > 0) {
value >>= 64;
result += 8;
}
if (value >> 32 > 0) {
value >>= 32;
result += 4;
}
if (value >> 16 > 0) {
value >>= 16;
result += 2;
}
if (value >> 8 > 0) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 256, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log256(value);
return result + (unsignedRoundsUp(rounding) && 1 << (result << 3) < value ? 1 : 0);
}
}
/**
* @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.
*/
function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {
return uint8(rounding) % 2 == 1;
}
}
// File: @openzeppelin/contracts/utils/Strings.sol
// OpenZeppelin Contracts (last updated v5.0.0) (utils/Strings.sol)
pragma solidity ^0.8.20;
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant HEX_DIGITS = "0123456789abcdef";
uint8 private constant ADDRESS_LENGTH = 20;
/**
* @dev The `value` string doesn't fit in the specified `length`.
*/
error StringsInsufficientHexLength(uint256 value, uint256 length);
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
unchecked {
uint256 length = Math.log10(value) + 1;
string memory buffer = new string(length);
uint256 ptr;
/// @solidity memory-safe-assembly
assembly {
ptr := add(buffer, add(32, length))
}
while (true) {
ptr--;
/// @solidity memory-safe-assembly
assembly {
mstore8(ptr, byte(mod(value, 10), HEX_DIGITS))
}
value /= 10;
if (value == 0) break;
}
return buffer;
}
}
/**
* @dev Converts a `int256` to its ASCII `string` decimal representation.
*/
function toStringSigned(int256 value) internal pure returns (string memory) {
return string.concat(value < 0 ? "-" : "", toString(SignedMath.abs(value)));
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
unchecked {
return toHexString(value, Math.log256(value) + 1);
}
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
uint256 localValue = value;
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = HEX_DIGITS[localValue & 0xf];
localValue >>= 4;
}
if (localValue != 0) {
revert StringsInsufficientHexLength(value, length);
}
return string(buffer);
}
/**
* @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal
* representation.
*/
function toHexString(address addr) internal pure returns (string memory) {
return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH);
}
/**
* @dev Returns true if the two strings are equal.
*/
function equal(string memory a, string memory b) internal pure returns (bool) {
return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b));
}
}
// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721Receiver.sol)
pragma solidity ^0.8.20;
/**
* @title ERC721 token receiver interface
* @dev Interface for any contract that wants to support safeTransfers
* from ERC721 asset contracts.
*/
interface IERC721Receiver {
/**
* @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
* by `operator` from `from`, this function is called.
*
* It must return its Solidity selector to confirm the token transfer.
* If any other value is returned or the interface is not implemented by the recipient, the transfer will be
* reverted.
*
* The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
*/
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}
// File: @openzeppelin/contracts/utils/introspection/IERC165.sol
// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
// File: @openzeppelin/contracts/interfaces/IERC2981.sol
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC2981.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface for the NFT Royalty Standard.
*
* A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
* support for royalty payments across all NFT marketplaces and ecosystem participants.
*/
interface IERC2981 is IERC165 {
/**
* @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
* exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
*/
function royaltyInfo(
uint256 tokenId,
uint256 salePrice
) external view returns (address receiver, uint256 royaltyAmount);
}
// File: @openzeppelin/contracts/token/ERC721/IERC721.sol
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721.sol)
pragma solidity ^0.8.20;
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721 is IERC165 {
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon
* a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must have been allowed to move this token by either {approve} or
* {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon
* a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(address from, address to, uint256 tokenId) external;
/**
* @dev Transfers `tokenId` token from `from` to `to`.
*
* WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
* or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
* understand this adds an external call which potentially creates a reentrancy vulnerability.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 tokenId) external;
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the zero address clears previous approvals.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function approve(address to, uint256 tokenId) external;
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the address zero.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool approved) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}
*/
function isApprovedForAll(address owner, address operator) external view returns (bool);
}
// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/extensions/IERC721Metadata.sol)
pragma solidity ^0.8.20;
/**
* @title ERC-721 Non-Fungible Token Standard, optional metadata extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721Metadata is IERC721 {
/**
* @dev Returns the token collection name.
*/
function name() external view returns (string memory);
/**
* @dev Returns the token collection symbol.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
*/
function tokenURI(uint256 tokenId) external view returns (string memory);
}
// File: @openzeppelin/contracts/utils/StorageSlot.sol
// OpenZeppelin Contracts (last updated v5.0.0) (utils/StorageSlot.sol)
// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.
pragma solidity ^0.8.20;
/**
* @dev Library for reading and writing primitive types to specific storage slots.
*
* Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.
* This library helps with reading and writing to such slots without the need for inline assembly.
*
* The functions in this library return Slot structs that contain a `value` member that can be used to read or write.
*
* Example usage to set ERC1967 implementation slot:
* ```solidity
* contract ERC1967 {
* bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
*
* function _getImplementation() internal view returns (address) {
* return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;
* }
*
* function _setImplementation(address newImplementation) internal {
* require(newImplementation.code.length > 0);
* StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;
* }
* }
* ```
*/
library StorageSlot {
struct AddressSlot {
address value;
}
struct BooleanSlot {
bool value;
}
struct Bytes32Slot {
bytes32 value;
}
struct Uint256Slot {
uint256 value;
}
struct StringSlot {
string value;
}
struct BytesSlot {
bytes value;
}
/**
* @dev Returns an `AddressSlot` with member `value` located at `slot`.
*/
function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {
/// @solidity memory-safe-assembly
assembly {
r.slot := slot
}
}
/**
* @dev Returns an `BooleanSlot` with member `value` located at `slot`.
*/
function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {
/// @solidity memory-safe-assembly
assembly {
r.slot := slot
}
}
/**
* @dev Returns an `Bytes32Slot` with member `value` located at `slot`.
*/
function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {
/// @solidity memory-safe-assembly
assembly {
r.slot := slot
}
}
/**
* @dev Returns an `Uint256Slot` with member `value` located at `slot`.
*/
function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {
/// @solidity memory-safe-assembly
assembly {
r.slot := slot
}
}
/**
* @dev Returns an `StringSlot` with member `value` located at `slot`.
*/
function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {
/// @solidity memory-safe-assembly
assembly {
r.slot := slot
}
}
/**
* @dev Returns an `StringSlot` representation of the string storage pointer `store`.
*/
function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {
/// @solidity memory-safe-assembly
assembly {
r.slot := store.slot
}
}
/**
* @dev Returns an `BytesSlot` with member `value` located at `slot`.
*/
function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {
/// @solidity memory-safe-assembly
assembly {
r.slot := slot
}
}
/**
* @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.
*/
function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {
/// @solidity memory-safe-assembly
assembly {
r.slot := store.slot
}
}
}
// File: @openzeppelin/contracts/utils/Address.sol
// OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol)
pragma solidity ^0.8.20;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev The ETH balance of the account is not enough to perform the operation.
*/
error AddressInsufficientBalance(address account);
/**
* @dev There's no code at `target` (it is not a contract).
*/
error AddressEmptyCode(address target);
/**
* @dev A call to an address target failed. The target may have reverted.
*/
error FailedInnerCall();
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
if (address(this).balance < amount) {
revert AddressInsufficientBalance(address(this));
}
(bool success, ) = recipient.call{value: amount}("");
if (!success) {
revert FailedInnerCall();
}
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason or custom error, it is bubbled
* up by this function (like regular Solidity function calls). However, if
* the call reverted with no returned reason, this function reverts with a
* {FailedInnerCall} error.
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
if (address(this).balance < value) {
revert AddressInsufficientBalance(address(this));
}
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, success, returndata);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, success, returndata);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata);
}
/**
* @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target
* was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an
* unsuccessful call.
*/
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata
) internal view returns (bytes memory) {
if (!success) {
_revert(returndata);
} else {
// only check if target is a contract if the call was successful and the return data is empty
// otherwise we already know that it was a contract
if (returndata.length == 0 && target.code.length == 0) {
revert AddressEmptyCode(target);
}
return returndata;
}
}
/**
* @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the
* revert reason or with a default {FailedInnerCall} error.
*/
function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {
if (!success) {
_revert(returndata);
} else {
return returndata;
}
}
/**
* @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}.
*/
function _revert(bytes memory returndata) private pure {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert FailedInnerCall();
}
}
}
// File: @openzeppelin/contracts/proxy/beacon/IBeacon.sol
// OpenZeppelin Contracts (last updated v5.0.0) (proxy/beacon/IBeacon.sol)
pragma solidity ^0.8.20;
/**
* @dev This is the interface that {BeaconProxy} expects of its beacon.
*/
interface IBeacon {
/**
* @dev Must return an address that can be used as a delegate call target.
*
* {UpgradeableBeacon} will check that this address is a contract.
*/
function implementation() external view returns (address);
}
// File: @openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol
// OpenZeppelin Contracts (last updated v5.0.0) (proxy/ERC1967/ERC1967Utils.sol)
pragma solidity ^0.8.20;
/**
* @dev This abstract contract provides getters and event emitting update functions for
* https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.
*/
library ERC1967Utils {
// We re-declare ERC-1967 events here because they can't be used directly from IERC1967.
// This will be fixed in Solidity 0.8.21. At that point we should remove these events.
/**
* @dev Emitted when the implementation is upgraded.
*/
event Upgraded(address indexed implementation);
/**
* @dev Emitted when the admin account has changed.
*/
event AdminChanged(address previousAdmin, address newAdmin);
/**
* @dev Emitted when the beacon is changed.
*/
event BeaconUpgraded(address indexed beacon);
/**
* @dev Storage slot with the address of the current implementation.
* This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1.
*/
// solhint-disable-next-line private-vars-leading-underscore
bytes32 internal constant IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
/**
* @dev The `implementation` of the proxy is invalid.
*/
error ERC1967InvalidImplementation(address implementation);
/**
* @dev The `admin` of the proxy is invalid.
*/
error ERC1967InvalidAdmin(address admin);
/**
* @dev The `beacon` of the proxy is invalid.
*/
error ERC1967InvalidBeacon(address beacon);
/**
* @dev An upgrade function sees `msg.value > 0` that may be lost.
*/
error ERC1967NonPayable();
/**
* @dev Returns the current implementation address.
*/
function getImplementation() internal view returns (address) {
return StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value;
}
/**
* @dev Stores a new address in the EIP1967 implementation slot.
*/
function _setImplementation(address newImplementation) private {
if (newImplementation.code.length == 0) {
revert ERC1967InvalidImplementation(newImplementation);
}
StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value = newImplementation;
}
/**
* @dev Performs implementation upgrade with additional setup call if data is nonempty.
* This function is payable only if the setup call is performed, otherwise `msg.value` is rejected
* to avoid stuck value in the contract.
*
* Emits an {IERC1967-Upgraded} event.
*/
function upgradeToAndCall(address newImplementation, bytes memory data) internal {
_setImplementation(newImplementation);
emit Upgraded(newImplementation);
if (data.length > 0) {
Address.functionDelegateCall(newImplementation, data);
} else {
_checkNonPayable();
}
}
/**
* @dev Storage slot with the admin of the contract.
* This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1.
*/
// solhint-disable-next-line private-vars-leading-underscore
bytes32 internal constant ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;
/**
* @dev Returns the current admin.
*
* TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using
* the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.
* `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`
*/
function getAdmin() internal view returns (address) {
return StorageSlot.getAddressSlot(ADMIN_SLOT).value;
}
/**
* @dev Stores a new address in the EIP1967 admin slot.
*/
function _setAdmin(address newAdmin) private {
if (newAdmin == address(0)) {
revert ERC1967InvalidAdmin(address(0));
}
StorageSlot.getAddressSlot(ADMIN_SLOT).value = newAdmin;
}
/**
* @dev Changes the admin of the proxy.
*
* Emits an {IERC1967-AdminChanged} event.
*/
function changeAdmin(address newAdmin) internal {
emit AdminChanged(getAdmin(), newAdmin);
_setAdmin(newAdmin);
}
/**
* @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.
* This is the keccak-256 hash of "eip1967.proxy.beacon" subtracted by 1.
*/
// solhint-disable-next-line private-vars-leading-underscore
bytes32 internal constant BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;
/**
* @dev Returns the current beacon.
*/
function getBeacon() internal view returns (address) {
return StorageSlot.getAddressSlot(BEACON_SLOT).value;
}
/**
* @dev Stores a new beacon in the EIP1967 beacon slot.
*/
function _setBeacon(address newBeacon) private {
if (newBeacon.code.length == 0) {
revert ERC1967InvalidBeacon(newBeacon);
}
StorageSlot.getAddressSlot(BEACON_SLOT).value = newBeacon;
address beaconImplementation = IBeacon(newBeacon).implementation();
if (beaconImplementation.code.length == 0) {
revert ERC1967InvalidImplementation(beaconImplementation);
}
}
/**
* @dev Change the beacon and trigger a setup call if data is nonempty.
* This function is payable only if the setup call is performed, otherwise `msg.value` is rejected
* to avoid stuck value in the contract.
*
* Emits an {IERC1967-BeaconUpgraded} event.
*
* CAUTION: Invoking this function has no effect on an instance of {BeaconProxy} since v5, since
* it uses an immutable beacon without looking at the value of the ERC-1967 beacon slot for
* efficiency.
*/
function upgradeBeaconToAndCall(address newBeacon, bytes memory data) internal {
_setBeacon(newBeacon);
emit BeaconUpgraded(newBeacon);
if (data.length > 0) {
Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);
} else {
_checkNonPayable();
}
}
/**
* @dev Reverts if `msg.value` is not zero. It can be used to avoid `msg.value` stuck in the contract
* if an upgrade doesn't perform an initialization call.
*/
function _checkNonPayable() private {
if (msg.value > 0) {
revert ERC1967NonPayable();
}
}
}
// File: @openzeppelin/contracts/interfaces/draft-IERC1822.sol
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC1822.sol)
pragma solidity ^0.8.20;
/**
* @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified
* proxy whose upgrades are fully controlled by the current implementation.
*/
interface IERC1822Proxiable {
/**
* @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation
* address.
*
* IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks
* bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this
* function revert if invoked through a proxy.
*/
function proxiableUUID() external view returns (bytes32);
}
// File: @openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol
// OpenZeppelin Contracts (last updated v5.0.0) (proxy/utils/Initializable.sol)
pragma solidity ^0.8.20;
/**
* @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
* behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an
* external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
* function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
*
* The initialization functions use a version number. Once a version number is used, it is consumed and cannot be
* reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in
* case an upgrade adds a module that needs to be initialized.
*
* For example:
*
* [.hljs-theme-light.nopadding]
* ```solidity
* contract MyToken is ERC20Upgradeable {
* function initialize() initializer public {
* __ERC20_init("MyToken", "MTK");
* }
* }
*
* contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {
* function initializeV2() reinitializer(2) public {
* __ERC20Permit_init("MyToken");
* }
* }
* ```
*
* TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
* possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
*
* CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
* that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
*
* [CAUTION]
* ====
* Avoid leaving a contract uninitialized.
*
* An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation
* contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke
* the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:
*
* [.hljs-theme-light.nopadding]
* ```
* /// @custom:oz-upgrades-unsafe-allow constructor
* constructor() {
* _disableInitializers();
* }
* ```
* ====
*/
abstract contract Initializable {
/**
* @dev Storage of the initializable contract.
*
* It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions
* when using with upgradeable contracts.
*
* @custom:storage-location erc7201:openzeppelin.storage.Initializable
*/
struct InitializableStorage {
/**
* @dev Indicates that the contract has been initialized.
*/
uint64 _initialized;
/**
* @dev Indicates that the contract is in the process of being initialized.
*/
bool _initializing;
}
// keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.Initializable")) - 1)) & ~bytes32(uint256(0xff))
bytes32 private constant INITIALIZABLE_STORAGE = 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00;
/**
* @dev The contract is already initialized.
*/
error InvalidInitialization();
/**
* @dev The contract is not initializing.
*/
error NotInitializing();
/**
* @dev Triggered when the contract has been initialized or reinitialized.
*/
event Initialized(uint64 version);
/**
* @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,
* `onlyInitializing` functions can be used to initialize parent contracts.
*
* Similar to `reinitializer(1)`, except that in the context of a constructor an `initializer` may be invoked any
* number of times. This behavior in the constructor can be useful during testing and is not expected to be used in
* production.
*
* Emits an {Initialized} event.
*/
modifier initializer() {
// solhint-disable-next-line var-name-mixedcase
InitializableStorage storage $ = _getInitializableStorage();
// Cache values to avoid duplicated sloads
bool isTopLevelCall = !$._initializing;
uint64 initialized = $._initialized;
// Allowed calls:
// - initialSetup: the contract is not in the initializing state and no previous version was
// initialized
// - construction: the contract is initialized at version 1 (no reininitialization) and the
// current contract is just being deployed
bool initialSetup = initialized == 0 && isTopLevelCall;
bool construction = initialized == 1 && address(this).code.length == 0;
if (!initialSetup && !construction) {
revert InvalidInitialization();
}
$._initialized = 1;
if (isTopLevelCall) {
$._initializing = true;
}
_;
if (isTopLevelCall) {
$._initializing = false;
emit Initialized(1);
}
}
/**
* @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the
* contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be
* used to initialize parent contracts.
*
* A reinitializer may be used after the original initialization step. This is essential to configure modules that
* are added through upgrades and that require initialization.
*
* When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`
* cannot be nested. If one is invoked in the context of another, execution will revert.
*
* Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in
* a contract, executing them in the right order is up to the developer or operator.
*
* WARNING: Setting the version to 2**64 - 1 will prevent any future reinitialization.
*
* Emits an {Initialized} event.
*/
modifier reinitializer(uint64 version) {
// solhint-disable-next-line var-name-mixedcase
InitializableStorage storage $ = _getInitializableStorage();
if ($._initializing || $._initialized >= version) {
revert InvalidInitialization();
}
$._initialized = version;
$._initializing = true;
_;
$._initializing = false;
emit Initialized(version);
}
/**
* @dev Modifier to protect an initialization function so that it can only be invoked by functions with the
* {initializer} and {reinitializer} modifiers, directly or indirectly.
*/
modifier onlyInitializing() {
_checkInitializing();
_;
}
/**
* @dev Reverts if the contract is not in an initializing state. See {onlyInitializing}.
*/
function _checkInitializing() internal view virtual {
if (!_isInitializing()) {
revert NotInitializing();
}
}
/**
* @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.
* Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized
* to any version. It is recommended to use this to lock implementation contracts that are designed to be called
* through proxies.
*
* Emits an {Initialized} event the first time it is successfully executed.
*/
function _disableInitializers() internal virtual {
// solhint-disable-next-line var-name-mixedcase
InitializableStorage storage $ = _getInitializableStorage();
if ($._initializing) {
revert InvalidInitialization();
}
if ($._initialized != type(uint64).max) {
$._initialized = type(uint64).max;
emit Initialized(type(uint64).max);
}
}
/**
* @dev Returns the highest version that has been initialized. See {reinitializer}.
*/
function _getInitializedVersion() internal view returns (uint64) {
return _getInitializableStorage()._initialized;
}
/**
* @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.
*/
function _isInitializing() internal view returns (bool) {
return _getInitializableStorage()._initializing;
}
/**
* @dev Returns a pointer to the storage namespace.
*/
// solhint-disable-next-line var-name-mixedcase
function _getInitializableStorage() private pure returns (InitializableStorage storage $) {
assembly {
$.slot := INITIALIZABLE_STORAGE
}
}
}
// File: @openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol
// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol)
pragma solidity ^0.8.20;
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*/
abstract contract ERC165Upgradeable is Initializable, IERC165 {
function __ERC165_init() internal onlyInitializing {
}
function __ERC165_init_unchained() internal onlyInitializing {
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}
// File: @openzeppelin/contracts-upgradeable/token/common/ERC2981Upgradeable.sol
// OpenZeppelin Contracts (last updated v5.0.0) (token/common/ERC2981.sol)
pragma solidity ^0.8.20;
/**
* @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
*
* Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
* specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
*
* Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
* fee is specified in basis points by default.
*
* IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
* https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
* voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
*/
abstract contract ERC2981Upgradeable is Initializable, IERC2981, ERC165Upgradeable {
struct RoyaltyInfo {
address receiver;
uint96 royaltyFraction;
}
/// @custom:storage-location erc7201:openzeppelin.storage.ERC2981
struct ERC2981Storage {
RoyaltyInfo _defaultRoyaltyInfo;
mapping(uint256 tokenId => RoyaltyInfo) _tokenRoyaltyInfo;
}
// keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.ERC2981")) - 1)) & ~bytes32(uint256(0xff))
bytes32 private constant ERC2981StorageLocation = 0xdaedc9ab023613a7caf35e703657e986ccfad7e3eb0af93a2853f8d65dd86b00;
function _getERC2981Storage() private pure returns (ERC2981Storage storage $) {
assembly {
$.slot := ERC2981StorageLocation
}
}
/**
* @dev The default royalty set is invalid (eg. (numerator / denominator) >= 1).
*/
error ERC2981InvalidDefaultRoyalty(uint256 numerator, uint256 denominator);
/**
* @dev The default royalty receiver is invalid.
*/
error ERC2981InvalidDefaultRoyaltyReceiver(address receiver);
/**
* @dev The royalty set for an specific `tokenId` is invalid (eg. (numerator / denominator) >= 1).
*/
error ERC2981InvalidTokenRoyalty(uint256 tokenId, uint256 numerator, uint256 denominator);
/**
* @dev The royalty receiver for `tokenId` is invalid.
*/
error ERC2981InvalidTokenRoyaltyReceiver(uint256 tokenId, address receiver);
function __ERC2981_init() internal onlyInitializing {
}
function __ERC2981_init_unchained() internal onlyInitializing {
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165Upgradeable) returns (bool) {
return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId);
}
/**
* @inheritdoc IERC2981
*/
function royaltyInfo(uint256 tokenId, uint256 salePrice) public view virtual returns (address, uint256) {
ERC2981Storage storage $ = _getERC2981Storage();
RoyaltyInfo memory royalty = $._tokenRoyaltyInfo[tokenId];
if (royalty.receiver == address(0)) {
royalty = $._defaultRoyaltyInfo;
}
uint256 royaltyAmount = (salePrice * royalty.royaltyFraction) / _feeDenominator();
return (royalty.receiver, royaltyAmount);
}
/**
* @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
* fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
* override.
*/
function _feeDenominator() internal pure virtual returns (uint96) {
return 10000;
}
/**
* @dev Sets the royalty information that all ids in this contract will default to.
*
* Requirements:
*
* - `receiver` cannot be the zero address.
* - `feeNumerator` cannot be greater than the fee denominator.
*/
function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {
ERC2981Storage storage $ = _getERC2981Storage();
uint256 denominator = _feeDenominator();
if (feeNumerator > denominator) {
// Royalty fee will exceed the sale price
revert ERC2981InvalidDefaultRoyalty(feeNumerator, denominator);
}
if (receiver == address(0)) {
revert ERC2981InvalidDefaultRoyaltyReceiver(address(0));
}
$._defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
}
/**
* @dev Removes default royalty information.
*/
function _deleteDefaultRoyalty() internal virtual {
ERC2981Storage storage $ = _getERC2981Storage();
delete $._defaultRoyaltyInfo;
}
/**
* @dev Sets the royalty information for a specific token id, overriding the global default.
*
* Requirements:
*
* - `receiver` cannot be the zero address.
* - `feeNumerator` cannot be greater than the fee denominator.
*/
function _setTokenRoyalty(uint256 tokenId, address receiver, uint96 feeNumerator) internal virtual {
ERC2981Storage storage $ = _getERC2981Storage();
uint256 denominator = _feeDenominator();
if (feeNumerator > denominator) {
// Royalty fee will exceed the sale price
revert ERC2981InvalidTokenRoyalty(tokenId, feeNumerator, denominator);
}
if (receiver == address(0)) {
revert ERC2981InvalidTokenRoyaltyReceiver(tokenId, address(0));
}
$._tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
}
/**
* @dev Resets royalty information for the token id back to the global default.
*/
function _resetTokenRoyalty(uint256 tokenId) internal virtual {
ERC2981Storage storage $ = _getERC2981Storage();
delete $._tokenRoyaltyInfo[tokenId];
}
}
// File: @openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
pragma solidity ^0.8.20;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract ContextUpgradeable is Initializable {
function __Context_init() internal onlyInitializing {
}
function __Context_init_unchained() internal onlyInitializing {
}
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}
// File: @openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)
pragma solidity ^0.8.20;
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* The initial owner is set to the address provided by the deployer. This can
* later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {
/// @custom:storage-location erc7201:openzeppelin.storage.Ownable
struct OwnableStorage {
address _owner;
}
// keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.Ownable")) - 1)) & ~bytes32(uint256(0xff))
bytes32 private constant OwnableStorageLocation = 0x9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300;
function _getOwnableStorage() private pure returns (OwnableStorage storage $) {
assembly {
$.slot := OwnableStorageLocation
}
}
/**
* @dev The caller account is not authorized to perform an operation.
*/
error OwnableUnauthorizedAccount(address account);
/**
* @dev The owner is not a valid owner account. (eg. `address(0)`)
*/
error OwnableInvalidOwner(address owner);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the address provided by the deployer as the initial owner.
*/
function __Ownable_init(address initialOwner) internal onlyInitializing {
__Ownable_init_unchained(initialOwner);
}
function __Ownable_init_unchained(address initialOwner) internal onlyInitializing {
if (initialOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(initialOwner);
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
OwnableStorage storage $ = _getOwnableStorage();
return $._owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
if (owner() != _msgSender()) {
revert OwnableUnauthorizedAccount(_msgSender());
}
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
if (newOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
OwnableStorage storage $ = _getOwnableStorage();
address oldOwner = $._owner;
$._owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
// File: @openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/ERC721.sol)
pragma solidity ^0.8.20;
/**
* @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
* the Metadata extension, but not including the Enumerable extension, which is available separately as
* {ERC721Enumerable}.
*/
abstract contract ERC721Upgradeable is Initializable, ContextUpgradeable, ERC165Upgradeable, IERC721, IERC721Metadata, IERC721Errors {
using Strings for uint256;
/// @custom:storage-location erc7201:openzeppelin.storage.ERC721
struct ERC721Storage {
// Token name
string _name;
// Token symbol
string _symbol;
mapping(uint256 tokenId => address) _owners;
mapping(address owner => uint256) _balances;
mapping(uint256 tokenId => address) _tokenApprovals;
mapping(address owner => mapping(address operator => bool)) _operatorApprovals;
}
// keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.ERC721")) - 1)) & ~bytes32(uint256(0xff))
bytes32 private constant ERC721StorageLocation = 0x80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab0079300;
function _getERC721Storage() private pure returns (ERC721Storage storage $) {
assembly {
$.slot := ERC721StorageLocation
}
}
/**
* @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
*/
function __ERC721_init(string memory name_, string memory symbol_) internal onlyInitializing {
__ERC721_init_unchained(name_, symbol_);
}
function __ERC721_init_unchained(string memory name_, string memory symbol_) internal onlyInitializing {
ERC721Storage storage $ = _getERC721Storage();
$._name = name_;
$._symbol = symbol_;
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165) returns (bool) {
return
interfaceId == type(IERC721).interfaceId ||
interfaceId == type(IERC721Metadata).interfaceId ||
super.supportsInterface(interfaceId);
}
/**
* @dev See {IERC721-balanceOf}.
*/
function balanceOf(address owner) public view virtual returns (uint256) {
ERC721Storage storage $ = _getERC721Storage();
if (owner == address(0)) {
revert ERC721InvalidOwner(address(0));
}
return $._balances[owner];
}
/**
* @dev See {IERC721-ownerOf}.
*/
function ownerOf(uint256 tokenId) public view virtual returns (address) {
return _requireOwned(tokenId);
}
/**
* @dev See {IERC721Metadata-name}.
*/
function name() public view virtual returns (string memory) {
ERC721Storage storage $ = _getERC721Storage();
return $._name;
}
/**
* @dev See {IERC721Metadata-symbol}.
*/
function symbol() public view virtual returns (string memory) {
ERC721Storage storage $ = _getERC721Storage();
return $._symbol;
}
/**
* @dev See {IERC721Metadata-tokenURI}.
*/
function tokenURI(uint256 tokenId) public view virtual returns (string memory) {
_requireOwned(tokenId);
string memory baseURI = _baseURI();
return bytes(baseURI).length > 0 ? string.concat(baseURI, tokenId.toString()) : "";
}
/**
* @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
* token will be the concatenation of the `baseURI` and the `tokenId`. Empty
* by default, can be overridden in child contracts.
*/
function _baseURI() internal view virtual returns (string memory) {
return "";
}
/**
* @dev See {IERC721-approve}.
*/
function approve(address to, uint256 tokenId) public virtual {
_approve(to, tokenId, _msgSender());
}
/**
* @dev See {IERC721-getApproved}.
*/
function getApproved(uint256 tokenId) public view virtual returns (address) {
_requireOwned(tokenId);
return _getApproved(tokenId);
}
/**
* @dev See {IERC721-setApprovalForAll}.
*/
function setApprovalForAll(address operator, bool approved) public virtual {
_setApprovalForAll(_msgSender(), operator, approved);
}
/**
* @dev See {IERC721-isApprovedForAll}.
*/
function isApprovedForAll(address owner, address operator) public view virtual returns (bool) {
ERC721Storage storage $ = _getERC721Storage();
return $._operatorApprovals[owner][operator];
}
/**
* @dev See {IERC721-transferFrom}.
*/
function transferFrom(address from, address to, uint256 tokenId) public virtual {
if (to == address(0)) {
revert ERC721InvalidReceiver(address(0));
}
// Setting an "auth" arguments enables the `_isAuthorized` check which verifies that the token exists
// (from != 0). Therefore, it is not needed to verify that the return value is not 0 here.
address previousOwner = _update(to, tokenId, _msgSender());
if (previousOwner != from) {
revert ERC721IncorrectOwner(from, tokenId, previousOwner);
}
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(address from, address to, uint256 tokenId) public {
safeTransferFrom(from, to, tokenId, "");
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public virtual {
transferFrom(from, to, tokenId);
_checkOnERC721Received(from, to, tokenId, data);
}
/**
* @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist
*
* IMPORTANT: Any overrides to this function that add ownership of tokens not tracked by the
* core ERC721 logic MUST be matched with the use of {_increaseBalance} to keep balances
* consistent with ownership. The invariant to preserve is that for any address `a` the value returned by
* `balanceOf(a)` must be equal to the number of tokens such that `_ownerOf(tokenId)` is `a`.
*/
function _ownerOf(uint256 tokenId) internal view virtual returns (address) {
ERC721Storage storage $ = _getERC721Storage();
return $._owners[tokenId];
}
/**
* @dev Returns the approved address for `tokenId`. Returns 0 if `tokenId` is not minted.
*/
function _getApproved(uint256 tokenId) internal view virtual returns (address) {
ERC721Storage storage $ = _getERC721Storage();
return $._tokenApprovals[tokenId];
}
/**
* @dev Returns whether `spender` is allowed to manage `owner`'s tokens, or `tokenId` in
* particular (ignoring whether it is owned by `owner`).
*
* WARNING: This function assumes that `owner` is the actual owner of `tokenId` and does not verify this
* assumption.
*/
function _isAuthorized(address owner, address spender, uint256 tokenId) internal view virtual returns (bool) {
return
spender != address(0) &&
(owner == spender || isApprovedForAll(owner, spender) || _getApproved(tokenId) == spender);
}
/**
* @dev Checks if `spender` can operate on `tokenId`, assuming the provided `owner` is the actual owner.
* Reverts if `spender` does not have approval from the provided `owner` for the given token or for all its assets
* the `spender` for the specific `tokenId`.
*
* WARNING: This function assumes that `owner` is the actual owner of `tokenId` and does not verify this
* assumption.
*/
function _checkAuthorized(address owner, address spender, uint256 tokenId) internal view virtual {
if (!_isAuthorized(owner, spender, tokenId)) {
if (owner == address(0)) {
revert ERC721NonexistentToken(tokenId);
} else {
revert ERC721InsufficientApproval(spender, tokenId);
}
}
}
/**
* @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override.
*
* NOTE: the value is limited to type(uint128).max. This protect against _balance overflow. It is unrealistic that
* a uint256 would ever overflow from increments when these increments are bounded to uint128 values.
*
* WARNING: Increasing an account's balance using this function tends to be paired with an override of the
* {_ownerOf} function to resolve the ownership of the corresponding tokens so that balances and ownership
* remain consistent with one another.
*/
function _increaseBalance(address account, uint128 value) internal virtual {
ERC721Storage storage $ = _getERC721Storage();
unchecked {
$._balances[account] += value;
}
}
/**
* @dev Transfers `tokenId` from its current owner to `to`, or alternatively mints (or burns) if the current owner
* (or `to`) is the zero address. Returns the owner of the `tokenId` before the update.
*
* The `auth` argument is optional. If the value passed is non 0, then this function will check that
* `auth` is either the owner of the token, or approved to operate on the token (by the owner).
*
* Emits a {Transfer} event.
*
* NOTE: If overriding this function in a way that tracks balances, see also {_increaseBalance}.
*/
function _update(address to, uint256 tokenId, address auth) internal virtual returns (address) {
ERC721Storage storage $ = _getERC721Storage();
address from = _ownerOf(tokenId);
// Perform (optional) operator check
if (auth != address(0)) {
_checkAuthorized(from, auth, tokenId);
}
// Execute the update
if (from != address(0)) {
// Clear approval. No need to re-authorize or emit the Approval event
_approve(address(0), tokenId, address(0), false);
unchecked {
$._balances[from] -= 1;
}
}
if (to != address(0)) {
unchecked {
$._balances[to] += 1;
}
}
$._owners[tokenId] = to;
emit Transfer(from, to, tokenId);
return from;
}
/**
* @dev Mints `tokenId` and transfers it to `to`.
*
* WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
*
* Requirements:
*
* - `tokenId` must not exist.
* - `to` cannot be the zero address.
*
* Emits a {Transfer} event.
*/
function _mint(address to, uint256 tokenId) internal {
if (to == address(0)) {
revert ERC721InvalidReceiver(address(0));
}
address previousOwner = _update(to, tokenId, address(0));
if (previousOwner != address(0)) {
revert ERC721InvalidSender(address(0));
}
}
/**
* @dev Mints `tokenId`, transfers it to `to` and checks for `to` acceptance.
*
* Requirements:
*
* - `tokenId` must not exist.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function _safeMint(address to, uint256 tokenId) internal {
_safeMint(to, tokenId, "");
}
/**
* @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
* forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
*/
function _safeMint(address to, uint256 tokenId, bytes memory data) internal virtual {
_mint(to, tokenId);
_checkOnERC721Received(address(0), to, tokenId, data);
}
/**
* @dev Destroys `tokenId`.
* The approval is cleared when the token is burned.
* This is an internal function that does not check if the sender is authorized to operate on the token.
*
* Requirements:
*
* - `tokenId` must exist.
*
* Emits a {Transfer} event.
*/
function _burn(uint256 tokenId) internal {
address previousOwner = _update(address(0), tokenId, address(0));
if (previousOwner == address(0)) {
revert ERC721NonexistentToken(tokenId);
}
}
/**
* @dev Transfers `tokenId` from `from` to `to`.
* As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
*
* Emits a {Transfer} event.
*/
function _transfer(address from, address to, uint256 tokenId) internal {
if (to == address(0)) {
revert ERC721InvalidReceiver(address(0));
}
address previousOwner = _update(to, tokenId, address(0));
if (previousOwner == address(0)) {
revert ERC721NonexistentToken(tokenId);
} else if (previousOwner != from) {
revert ERC721IncorrectOwner(from, tokenId, previousOwner);
}
}
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking that contract recipients
* are aware of the ERC721 standard to prevent tokens from being forever locked.
*
* `data` is additional data, it has no specified format and it is sent in call to `to`.
*
* This internal function is like {safeTransferFrom} in the sense that it invokes
* {IERC721Receiver-onERC721Received} on the receiver, and can be used to e.g.
* implement alternative mechanisms to perform token transfer, such as signature-based.
*
* Requirements:
*
* - `tokenId` token must exist and be owned by `from`.
* - `to` cannot be the zero address.
* - `from` cannot be the zero address.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function _safeTransfer(address from, address to, uint256 tokenId) internal {
_safeTransfer(from, to, tokenId, "");
}
/**
* @dev Same as {xref-ERC721-_safeTransfer-address-address-uint256-}[`_safeTransfer`], with an additional `data` parameter which is
* forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
*/
function _safeTransfer(address from, address to, uint256 tokenId, bytes memory data) internal virtual {
_transfer(from, to, tokenId);
_checkOnERC721Received(from, to, tokenId, data);
}
/**
* @dev Approve `to` to operate on `tokenId`
*
* The `auth` argument is optional. If the value passed is non 0, then this function will check that `auth` is
* either the owner of the token, or approved to operate on all tokens held by this owner.
*
* Emits an {Approval} event.
*
* Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
*/
function _approve(address to, uint256 tokenId, address auth) internal {
_approve(to, tokenId, auth, true);
}
/**
* @dev Variant of `_approve` with an optional flag to enable or disable the {Approval} event. The event is not
* emitted in the context of transfers.
*/
function _approve(address to, uint256 tokenId, address auth, bool emitEvent) internal virtual {
ERC721Storage storage $ = _getERC721Storage();
// Avoid reading the owner unless necessary
if (emitEvent || auth != address(0)) {
address owner = _requireOwned(tokenId);
// We do not use _isAuthorized because single-token approvals should not be able to call approve
if (auth != address(0) && owner != auth && !isApprovedForAll(owner, auth)) {
revert ERC721InvalidApprover(auth);
}
if (emitEvent) {
emit Approval(owner, to, tokenId);
}
}
$._tokenApprovals[tokenId] = to;
}
/**
* @dev Approve `operator` to operate on all of `owner` tokens
*
* Requirements:
* - operator can't be the address zero.
*
* Emits an {ApprovalForAll} event.
*/
function _setApprovalForAll(address owner, address operator, bool approved) internal virtual {
ERC721Storage storage $ = _getERC721Storage();
if (operator == address(0)) {
revert ERC721InvalidOperator(operator);
}
$._operatorApprovals[owner][operator] = approved;
emit ApprovalForAll(owner, operator, approved);
}
/**
* @dev Reverts if the `tokenId` doesn't have a current owner (it hasn't been minted, or it has been burned).
* Returns the owner.
*
* Overrides to ownership logic should be done to {_ownerOf}.
*/
function _requireOwned(uint256 tokenId) internal view returns (address) {
address owner = _ownerOf(tokenId);
if (owner == address(0)) {
revert ERC721NonexistentToken(tokenId);
}
return owner;
}
/**
* @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target address. This will revert if the
* recipient doesn't accept the token transfer. The call is not executed if the target address is not a contract.
*
* @param from address representing the previous owner of the given token ID
* @param to target address that will receive the tokens
* @param tokenId uint256 ID of the token to be transferred
* @param data bytes optional data to send along with the call
*/
function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory data) private {
if (to.code.length > 0) {
try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {
if (retval != IERC721Receiver.onERC721Received.selector) {
revert ERC721InvalidReceiver(to);
}
} catch (bytes memory reason) {
if (reason.length == 0) {
revert ERC721InvalidReceiver(to);
} else {
/// @solidity memory-safe-assembly
assembly {
revert(add(32, reason), mload(reason))
}
}
}
}
}
}
// File: @openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol
// OpenZeppelin Contracts (last updated v5.0.0) (proxy/utils/UUPSUpgradeable.sol)
pragma solidity ^0.8.20;
/**
* @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an
* {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.
*
* A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is
* reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing
* `UUPSUpgradeable` with a custom implementation of upgrades.
*
* The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.
*/
abstract contract UUPSUpgradeable is Initializable, IERC1822Proxiable {
/// @custom:oz-upgrades-unsafe-allow state-variable-immutable
address private immutable __self = address(this);
/**
* @dev The version of the upgrade interface of the contract. If this getter is missing, both `upgradeTo(address)`
* and `upgradeToAndCall(address,bytes)` are present, and `upgradeTo` must be used if no function should be called,
* while `upgradeToAndCall` will invoke the `receive` function if the second argument is the empty byte string.
* If the getter returns `"5.0.0"`, only `upgradeToAndCall(address,bytes)` is present, and the second argument must
* be the empty byte string if no function should be called, making it impossible to invoke the `receive` function
* during an upgrade.
*/
string public constant UPGRADE_INTERFACE_VERSION = "5.0.0";
/**
* @dev The call is from an unauthorized context.
*/
error UUPSUnauthorizedCallContext();
/**
* @dev The storage `slot` is unsupported as a UUID.
*/
error UUPSUnsupportedProxiableUUID(bytes32 slot);
/**
* @dev Check that the execution is being performed through a delegatecall call and that the execution context is
* a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case
* for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a
* function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to
* fail.
*/
modifier onlyProxy() {
_checkProxy();
_;
}
/**
* @dev Check that the execution is not being performed through a delegate call. This allows a function to be
* callable on the implementing contract but not through proxies.
*/
modifier notDelegated() {
_checkNotDelegated();
_;
}
function __UUPSUpgradeable_init() internal onlyInitializing {
}
function __UUPSUpgradeable_init_unchained() internal onlyInitializing {
}
/**
* @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the
* implementation. It is used to validate the implementation's compatibility when performing an upgrade.
*
* IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks
* bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this
* function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.
*/
function proxiableUUID() external view virtual notDelegated returns (bytes32) {
return ERC1967Utils.IMPLEMENTATION_SLOT;
}
/**
* @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call
* encoded in `data`.
*
* Calls {_authorizeUpgrade}.
*
* Emits an {Upgraded} event.
*
* @custom:oz-upgrades-unsafe-allow-reachable delegatecall
*/
function upgradeToAndCall(address newImplementation, bytes memory data) public payable virtual onlyProxy {
_authorizeUpgrade(newImplementation);
_upgradeToAndCallUUPS(newImplementation, data);
}
/**
* @dev Reverts if the execution is not performed via delegatecall or the execution
* context is not of a proxy with an ERC1967-compliant implementation pointing to self.
* See {_onlyProxy}.
*/
function _checkProxy() internal view virtual {
if (
address(this) == __self || // Must be called through delegatecall
ERC1967Utils.getImplementation() != __self // Must be called through an active proxy
) {
revert UUPSUnauthorizedCallContext();
}
}
/**
* @dev Reverts if the execution is performed via delegatecall.
* See {notDelegated}.
*/
function _checkNotDelegated() internal view virtual {
if (address(this) != __self) {
// Must not be called through delegatecall
revert UUPSUnauthorizedCallContext();
}
}
/**
* @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by
* {upgradeToAndCall}.
*
* Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.
*
* ```solidity
* function _authorizeUpgrade(address) internal onlyOwner {}
* ```
*/
function _authorizeUpgrade(address newImplementation) internal virtual;
/**
* @dev Performs an implementation upgrade with a security check for UUPS proxies, and additional setup call.
*
* As a security check, {proxiableUUID} is invoked in the new implementation, and the return value
* is expected to be the implementation slot in ERC1967.
*
* Emits an {IERC1967-Upgraded} event.
*/
function _upgradeToAndCallUUPS(address newImplementation, bytes memory data) private {
try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {
if (slot != ERC1967Utils.IMPLEMENTATION_SLOT) {
revert UUPSUnsupportedProxiableUUID(slot);
}
ERC1967Utils.upgradeToAndCall(newImplementation, data);
} catch {
// The implementation is not UUPS
revert ERC1967Utils.ERC1967InvalidImplementation(newImplementation);
}
}
}
// File: contracts/castile_tarot_contract_royalty.sol
// Compatible with OpenZeppelin Contracts ^5.0.0
pragma solidity ^0.8.20;
contract Castile_Tarot_Contract is Initializable, ERC721Upgradeable, OwnableUpgradeable, UUPSUpgradeable, ERC2981Upgradeable {
using Strings for uint256;
uint256 internal FEE;
uint256 public MAX_TOKEN_NUMBER;
uint256 public FREE_MINT_NUMBER;
string private _coverPrefix;
string private _basePrefix;
string private _baseExtension;
bytes32 private merkleRoot_free_wlist;
bytes32 private merkleRoot_fee_wlist;
// =============================================================
bool public paused = true;
bool private _revealed = false;
string public _owBaseUri;
string public _notRevealedUri;
uint256 private _currentIndex;
uint private _free_mint_number;
mapping(address => bool) private _map_AddressIsMint;
mapping(address => uint256[]) private _map_AddressToTokenIds;
// =============================================================
constructor() {
_disableInitializers();
}
function _authorizeUpgrade(address newImplementation)
internal
onlyOwner
override
{}
function initialize() initializer public {
__ERC721_init("TAROT", "TN");
__Ownable_init(msg.sender);
__UUPSUpgradeable_init();
FEE = 0.3 ether;//0.3 ether
MAX_TOKEN_NUMBER = 600;
FREE_MINT_NUMBER = 80;
merkleRoot_free_wlist = 0x328915450ec1bf5a80adaa6c1896d78c09b9cfc32f327d17b1f6a162866f6006;
merkleRoot_fee_wlist = 0xa4dc3989426959700832f1067a399368bc66f2ca037a47c0afdcb4c766ce338e;
_currentIndex = 1;
_free_mint_number = 0;
_notRevealedUri = "ipfs://QmaK132L9bEjmz8KMxxqXtEFA1NzKNVY69ssmrUjyaooXz/";
_coverPrefix = "unpacked";
_basePrefix = "token";
_baseExtension = ".json";
paused = true;
_revealed = false;
}
// =============================================================
function SetFee(uint256 newFee)
public
onlyOwner {
require(newFee >= 0, "Fee less then zero !!! ");
FEE = newFee;
}
function SetMaxTokenNumber(uint256 newNum)
public
onlyOwner {
require(FREE_MINT_NUMBER <= MAX_TOKEN_NUMBER, string(abi.encodePacked(
"FREE_MINT_NUMBER : ", FREE_MINT_NUMBER.toString(), " MAX_TOKEN_NUMBER : ", newNum.toString())));
MAX_TOKEN_NUMBER = newNum;
}
function SetFreeMintNumber(uint256 newNum)
public
onlyOwner {
require(FREE_MINT_NUMBER <= MAX_TOKEN_NUMBER, string(abi.encodePacked(
"FREE_MINT_NUMBER : ", newNum.toString(), " MAX_TOKEN_NUMBER : ", MAX_TOKEN_NUMBER.toString())));
FREE_MINT_NUMBER = newNum;
}
function SetFreeMerkleRoot(bytes32 newMRoot)
external
onlyOwner {
merkleRoot_free_wlist = newMRoot;
}
function SetFeeMerkleRoot(bytes32 newMRoot)
external
onlyOwner {
merkleRoot_fee_wlist = newMRoot;
}
function setBasePrefix(string memory newBasePrefix)
public
onlyOwner
{
_basePrefix = newBasePrefix;
}
function setBaseExtension(string memory newBaseExtension)
public
onlyOwner
{
_baseExtension = newBaseExtension;
}
// =============================================================
function getMintingPrice()
public
view
returns(uint256) {
return FEE;
}
function isRevealed()
public
view
returns(bool) {
return _revealed;
}
function getFreeRoot()
public
view
returns(bytes32) {
return merkleRoot_free_wlist;
}
function getFeeRoot()
public
view
returns(bytes32) {
return merkleRoot_fee_wlist;
}
// =============================================================
function _baseURI()
internal
view
virtual
override
returns (string memory) {
return _owBaseUri;
}
function Pause(bool _state)
public
onlyOwner {
paused = _state;
}
function Reveal()
public
onlyOwner {
_revealed = true;
}
function SetBaseURI(string memory _newBaseURI)
public
onlyOwner {
_owBaseUri = _newBaseURI;
}
function SetNotRevealedURI(string memory notRevealedURI)
public
onlyOwner {
_notRevealedUri = notRevealedURI;
}
function OwnerMint(address recipient, uint256 num)
public
onlyOwner
returns (uint256[] memory) {
require(recipient != address(0), "Mint to the zero address");
require(_map_AddressIsMint[recipient] != true , "code10202");
require(_currentIndex - 1 + num <= MAX_TOKEN_NUMBER, "Not enough tokens left to mint !!! ");
uint256[] memory newItemIds = new uint256[](num);
_map_AddressToTokenIds[recipient] = new uint256[](num);
for (uint i = 0; i < num; i++) {
uint256 newItemId = _currentIndex++;
_mint(recipient, newItemId);
newItemIds[i] = newItemId;
_map_AddressToTokenIds[recipient][i] = newItemId;
}
_map_AddressIsMint[recipient] = true;
return newItemIds;
}
function MintNftFree(bytes32[] calldata _merkleProof)
public
payable
returns (uint256) {
address payable recipient = payable(msg.sender);
require(WhitelistCheck(msg.sender, _merkleProof, true), "code10403");
require(_free_mint_number < FREE_MINT_NUMBER, "Free mint out of supply !!! ");
uint256 newItemId = _mintNovaMeta(recipient, 0);
_free_mint_number += 1;
return newItemId;
}
function MintNftWithFee(bytes32[] calldata _merkleProof)
public
payable
returns (uint256) {
address payable recipient = payable(msg.sender);
require(WhitelistCheck(recipient, _merkleProof, false), "code10403");// "You are not in fee whitelist !!! "
uint256 newItemId = _mintNovaMeta(recipient, FEE);
return newItemId;
}
function _mintNovaMeta(address payable recipient, uint256 mintFee)
internal
returns (uint256)
{
require(paused == false, "Public mint round has not yet started !!! ");
require(recipient != address(0), "Mint to the zero address");
require(recipient != owner() , "Recipient is owner !!! ");
require(_map_AddressIsMint[recipient] != true , "code10202");// "This address has minted !!! "
require(_currentIndex <= MAX_TOKEN_NUMBER, "Out of supply !!! ");
require(msg.value == mintFee, string(abi.encodePacked("Price is ", FEE.toString(), " Wei")));
uint256 newItemId = _currentIndex++;
_map_AddressIsMint[recipient] = true;
_map_AddressToTokenIds[recipient].push(newItemId);
_safeMint(recipient, newItemId);
return newItemId;
}
// =============================================================
function WhitelistCheck(address recipient, bytes32[] calldata _merkleProof, bool freeMint)
public
view
returns (bool) {
bytes32 leaf = keccak256(abi.encodePacked(recipient));
if(freeMint == true)
{
return MerkleProof.verify(_merkleProof, merkleRoot_free_wlist, leaf);
}
return MerkleProof.verify(_merkleProof, merkleRoot_fee_wlist, leaf);
}
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
function withdraw(address to)
public
payable
onlyOwner {
require(to != address(0), "Withdraw to the zero address");
uint256 balance = address(this).balance;
payable(to).transfer(balance);
}
function MintNumber()
public
view
onlyOwner
returns (uint256) {
return _currentIndex - 1;
}
function AddressToTokenIds(address mintadd)
public
view
onlyOwner
returns (uint256[] memory) {
return _map_AddressToTokenIds[mintadd];
}
function tokenURI(uint256 tokenId)
public
view
virtual
override(ERC721Upgradeable)
returns (string memory)
{
require(
_ownerOf(tokenId) != address(0),
"URI query for nonexistent token"
);
if (_revealed == false) {
return string(abi.encodePacked(_notRevealedUri, _coverPrefix, tokenId.toString(), _baseExtension));
}
return string(abi.encodePacked(_baseURI(), _basePrefix, tokenId.toString(), _baseExtension));
}
function supportsInterface(bytes4 interfaceId)
public
view
override(ERC721Upgradeable, ERC2981Upgradeable)
returns (bool)
{
return super.supportsInterface(interfaceId);
}
// =============================================================
function SetDefaultRoyalty(address receiver, uint96 feeNumerator)
public
onlyOwner
{
_setDefaultRoyalty(receiver, feeNumerator);
}
function SetTokenRoyalty(uint256 tokenId, address receiver, uint96 feeNumerator)
public
onlyOwner
{
_setTokenRoyalty(tokenId, receiver, feeNumerator);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"implementation","type":"address"}],"name":"ERC1967InvalidImplementation","type":"error"},{"inputs":[],"name":"ERC1967NonPayable","type":"error"},{"inputs":[{"internalType":"uint256","name":"numerator","type":"uint256"},{"internalType":"uint256","name":"denominator","type":"uint256"}],"name":"ERC2981InvalidDefaultRoyalty","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC2981InvalidDefaultRoyaltyReceiver","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"numerator","type":"uint256"},{"internalType":"uint256","name":"denominator","type":"uint256"}],"name":"ERC2981InvalidTokenRoyalty","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC2981InvalidTokenRoyaltyReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"owner","type":"address"}],"name":"ERC721IncorrectOwner","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721InsufficientApproval","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC721InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"ERC721InvalidOperator","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC721InvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC721InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC721InvalidSender","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonexistentToken","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"InvalidInitialization","type":"error"},{"inputs":[],"name":"NotInitializing","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"UUPSUnauthorizedCallContext","type":"error"},{"inputs":[{"internalType":"bytes32","name":"slot","type":"bytes32"}],"name":"UUPSUnsupportedProxiableUUID","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":false,"internalType":"uint64","name":"version","type":"uint64"}],"name":"Initialized","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":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[{"internalType":"address","name":"mintadd","type":"address"}],"name":"AddressToTokenIds","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FREE_MINT_NUMBER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOKEN_NUMBER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"MintNftFree","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"MintNftWithFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"MintNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"num","type":"uint256"}],"name":"OwnerMint","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"Pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"Reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"SetBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"SetDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"SetFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"newMRoot","type":"bytes32"}],"name":"SetFeeMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"newMRoot","type":"bytes32"}],"name":"SetFreeMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"SetFreeMintNumber","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"SetMaxTokenNumber","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"notRevealedURI","type":"string"}],"name":"SetNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"SetTokenRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"UPGRADE_INTERFACE_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"bool","name":"freeMint","type":"bool"}],"name":"WhitelistCheck","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_owBaseUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFeeRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFreeRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintingPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","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":"isRevealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBasePrefix","type":"string"}],"name":"setBasePrefix","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":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]Contract Creation Code
60a06040523073ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff16815250600160085f6101000a81548160ff0219169083151502179055505f600860016101000a81548160ff021916908315150217905550348015610076575f80fd5b5061008561008a60201b60201c565b6101ea565b5f61009961018860201b60201c565b9050805f0160089054906101000a900460ff16156100e3576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8016815f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff16146101855767ffffffffffffffff815f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d267ffffffffffffffff60405161017c91906101d1565b60405180910390a15b50565b5f7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00905090565b5f67ffffffffffffffff82169050919050565b6101cb816101af565b82525050565b5f6020820190506101e45f8301846101c2565b92915050565b608051615c686102105f395f8181612c8a01528181612cdf0152612e990152615c685ff3fe6080604052600436106102c7575f3560e01c8063715018a611610174578063a1edde4e116100db578063da3ef23f11610094578063f2fde38b1161006e578063f2fde38b14610aa2578063f72f874614610aca578063f9f5274c14610af2578063fffdcf1b14610b1c576102c7565b8063da3ef23f14610a14578063e8546c7314610a3c578063e985e9c514610a66576102c7565b8063a1edde4e1461090c578063a22cb46514610934578063ad3cb1cc1461095c578063b88d4fde14610986578063c87b56dd146109ae578063d1aeebbf146109ea576102c7565b80639422424b1161012d5780639422424b14610800578063953324c81461082857806395d89b411461086457806398135e3a1461088e5780639b36ed63146108b85780639e322832146108e2576102c7565b8063715018a61461070857806376dcb19d1461071e57806377d247621461075a5780637f496cb1146107845780638129fc1c146107c05780638da5cb5b146107d6576102c7565b806335135c1a1161023357806354214f69116101ec5780636352211e116101c65780636352211e14610652578063652f60681461068e57806366b9f0d2146106b657806370a08231146106cc576102c7565b806354214f69146105d45780635c975abb146105fe5780635d3bbdda14610628576102c7565b806335135c1a146104f257806342842e0e1461051a57806348000b28146105425780634f1ef2861461057257806351cff8d91461058e57806352d1902d146105aa576102c7565b80631c805539116102855780631c805539146103e557806323b872dd1461040d57806323c8c9481461043557806324ed16a41461045d578063259521301461048d5780632a55205a146104b5576102c7565b8062172ddf146102cb57806301ffc9a7146102f357806306fdde031461032f578063081812fc14610359578063095ea7b3146103955780630aff6903146103bd575b5f80fd5b3480156102d6575f80fd5b506102f160048036038101906102ec91906142bc565b610b44565b005b3480156102fe575f80fd5b506103196004803603810190610314919061433c565b610b98565b6040516103269190614381565b60405180910390f35b34801561033a575f80fd5b50610343610ba9565b604051610350919061440a565b60405180910390f35b348015610364575f80fd5b5061037f600480360381019061037a91906142bc565b610c46565b60405161038c9190614469565b60405180910390f35b3480156103a0575f80fd5b506103bb60048036038101906103b691906144ac565b610c61565b005b3480156103c8575f80fd5b506103e360048036038101906103de91906142bc565b610c77565b005b3480156103f0575f80fd5b5061040b60048036038101906104069190614616565b610d07565b005b348015610418575f80fd5b50610433600480360381019061042e919061465d565b610d22565b005b348015610440575f80fd5b5061045b60048036038101906104569190614616565b610e21565b005b6104776004803603810190610472919061470a565b610e3c565b6040516104849190614764565b60405180910390f35b348015610498575f80fd5b506104b360048036038101906104ae91906147be565b610f04565b005b3480156104c0575f80fd5b506104db60048036038101906104d6919061480e565b610f1c565b6040516104e992919061484c565b60405180910390f35b3480156104fd575f80fd5b5061051860048036038101906105139190614616565b611107565b005b348015610525575f80fd5b50610540600480360381019061053b919061465d565b611122565b005b61055c6004803603810190610557919061470a565b611141565b6040516105699190614764565b60405180910390f35b61058c60048036038101906105879190614911565b6111aa565b005b6105a860048036038101906105a3919061496b565b6111c9565b005b3480156105b5575f80fd5b506105be61128b565b6040516105cb91906149ae565b60405180910390f35b3480156105df575f80fd5b506105e86112bc565b6040516105f59190614381565b60405180910390f35b348015610609575f80fd5b506106126112d2565b60405161061f9190614381565b60405180910390f35b348015610633575f80fd5b5061063c6112e4565b6040516106499190614764565b60405180910390f35b34801561065d575f80fd5b50610678600480360381019061067391906142bc565b6112ea565b6040516106859190614469565b60405180910390f35b348015610699575f80fd5b506106b460048036038101906106af91906149f1565b6112fb565b005b3480156106c1575f80fd5b506106ca61130d565b005b3480156106d7575f80fd5b506106f260048036038101906106ed919061496b565b611332565b6040516106ff9190614764565b60405180910390f35b348015610713575f80fd5b5061071c6113f6565b005b348015610729575f80fd5b50610744600480360381019061073f91906144ac565b611409565b6040516107519190614ad3565b60405180910390f35b348015610765575f80fd5b5061076e61176c565b60405161077b9190614764565b60405180910390f35b34801561078f575f80fd5b506107aa60048036038101906107a5919061496b565b611774565b6040516107b79190614ad3565b60405180910390f35b3480156107cb575f80fd5b506107d461180f565b005b3480156107e1575f80fd5b506107ea611bb6565b6040516107f79190614469565b60405180910390f35b34801561080b575f80fd5b5061082660048036038101906108219190614b1d565b611beb565b005b348015610833575f80fd5b5061084e60048036038101906108499190614b48565b611c0f565b60405161085b9190614381565b60405180910390f35b34801561086f575f80fd5b50610878611cf4565b604051610885919061440a565b60405180910390f35b348015610899575f80fd5b506108a2611d92565b6040516108af9190614764565b60405180910390f35b3480156108c3575f80fd5b506108cc611daf565b6040516108d9919061440a565b60405180910390f35b3480156108ed575f80fd5b506108f6611e3b565b60405161090391906149ae565b60405180910390f35b348015610917575f80fd5b50610932600480360381019061092d9190614bb9565b611e44565b005b34801561093f575f80fd5b5061095a60048036038101906109559190614bf7565b611e5a565b005b348015610967575f80fd5b50610970611e70565b60405161097d919061440a565b60405180910390f35b348015610991575f80fd5b506109ac60048036038101906109a79190614c35565b611ea9565b005b3480156109b9575f80fd5b506109d460048036038101906109cf91906142bc565b611ec6565b6040516109e1919061440a565b60405180910390f35b3480156109f5575f80fd5b506109fe611fcf565b604051610a0b9190614764565b60405180910390f35b348015610a1f575f80fd5b50610a3a6004803603810190610a359190614616565b611fd5565b005b348015610a47575f80fd5b50610a50611ff0565b604051610a5d91906149ae565b60405180910390f35b348015610a71575f80fd5b50610a8c6004803603810190610a879190614cb5565b611ff9565b604051610a999190614381565b60405180910390f35b348015610aad575f80fd5b50610ac86004803603810190610ac3919061496b565b612095565b005b348015610ad5575f80fd5b50610af06004803603810190610aeb91906149f1565b612119565b005b348015610afd575f80fd5b50610b0661212b565b604051610b13919061440a565b60405180910390f35b348015610b27575f80fd5b50610b426004803603810190610b3d91906142bc565b6121b7565b005b610b4c612247565b5f811015610b8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8690614d3d565b60405180910390fd5b805f8190555050565b5f610ba2826122ce565b9050919050565b60605f610bb4612347565b9050805f018054610bc490614d88565b80601f0160208091040260200160405190810160405280929190818152602001828054610bf090614d88565b8015610c3b5780601f10610c1257610100808354040283529160200191610c3b565b820191905f5260205f20905b815481529060010190602001808311610c1e57829003601f168201915b505050505091505090565b5f610c508261236e565b50610c5a826123f4565b9050919050565b610c738282610c6e61243b565b612442565b5050565b610c7f612247565b6001546002541115610c9082612454565b610c9b600154612454565b604051602001610cac929190614e86565b60405160208183030381529060405290610cfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf3919061440a565b60405180910390fd5b508060028190555050565b610d0f612247565b8060049081610d1e919061505c565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d92575f6040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401610d899190614469565b60405180910390fd5b5f610da58383610da061243b565b61251e565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e1b578382826040517f64283d7b000000000000000000000000000000000000000000000000000000008152600401610e129392919061512b565b60405180910390fd5b50505050565b610e29612247565b8060099081610e38919061505c565b5050565b5f80339050610e4e3385856001611c0f565b610e8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e84906151aa565b60405180910390fd5b600254600c5410610ed3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eca90615212565b60405180910390fd5b5f610ede825f61273b565b90506001600c5f828254610ef2919061525d565b92505081905550809250505092915050565b610f0c612247565b610f17838383612a9b565b505050565b5f805f610f27612c58565b90505f816001015f8781526020019081526020015f206040518060400160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020015f820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505f73ffffffffffffffffffffffffffffffffffffffff16815f015173ffffffffffffffffffffffffffffffffffffffff16036110b357815f016040518060400160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020015f820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b5f6110bc612c7f565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff16876110e89190615290565b6110f291906152fe565b9050815f015181945094505050509250929050565b61110f612247565b80600a908161111e919061505c565b5050565b61113c83838360405180602001604052805f815250611ea9565b505050565b5f803390506111528185855f611c0f565b611191576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611188906151aa565b60405180910390fd5b5f61119d825f5461273b565b9050809250505092915050565b6111b2612c88565b6111bb82612d6e565b6111c58282612d79565b5050565b6111d1612247565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361123f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123690615378565b60405180910390fd5b5f4790508173ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015611286573d5f803e3d5ffd5b505050565b5f611294612e97565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b905090565b5f600860019054906101000a900460ff16905090565b60085f9054906101000a900460ff1681565b60025481565b5f6112f48261236e565b9050919050565b611303612247565b8060068190555050565b611315612247565b6001600860016101000a81548160ff021916908315150217905550565b5f8061133c612347565b90505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036113ae575f6040517f89c62b640000000000000000000000000000000000000000000000000000000081526004016113a59190614469565b60405180910390fd5b806003015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054915050919050565b6113fe612247565b6114075f612f1e565b565b6060611413612247565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611481576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611478906153e0565b60405180910390fd5b60011515600d5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16151503611511576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150890615448565b60405180910390fd5b600154826001600b546115249190615466565b61152e919061525d565b111561156f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156690615509565b60405180910390fd5b5f8267ffffffffffffffff81111561158a576115896144f2565b5b6040519080825280602002602001820160405280156115b85781602001602082028036833780820191505090505b5090508267ffffffffffffffff8111156115d5576115d46144f2565b5b6040519080825280602002602001820160405280156116035781602001602082028036833780820191505090505b50600e5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f209080519060200190611654929190614212565b505f5b8381101561170c575f600b5f81548092919061167290615527565b9190505590506116828682612fef565b808383815181106116965761169561556e565b5b60200260200101818152505080600e5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2083815481106116f2576116f161556e565b5b905f5260205f200181905550508080600101915050611657565b506001600d5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508091505092915050565b5f8054905090565b606061177e612247565b600e5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080548060200260200160405190810160405280929190818152602001828054801561180357602002820191905f5260205f20905b8154815260200190600101908083116117ef575b50505050509050919050565b5f6118186130e2565b90505f815f0160089054906101000a900460ff161590505f825f015f9054906101000a900467ffffffffffffffff1690505f808267ffffffffffffffff161480156118605750825b90505f60018367ffffffffffffffff1614801561189357505f3073ffffffffffffffffffffffffffffffffffffffff163b145b9050811580156118a1575080155b156118d8576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001855f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508315611925576001855f0160086101000a81548160ff0219169083151502179055505b6119996040518060400160405280600581526020017f5441524f540000000000000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f544e000000000000000000000000000000000000000000000000000000000000815250613109565b6119a23361311f565b6119aa613133565b670429d069189e00005f8190555061025860018190555060506002819055507f328915450ec1bf5a80adaa6c1896d78c09b9cfc32f327d17b1f6a162866f60065f1b6006819055507fa4dc3989426959700832f1067a399368bc66f2ca037a47c0afdcb4c766ce338e5f1b6007819055506001600b819055505f600c81905550604051806060016040528060368152602001615bfd60369139600a9081611a51919061505c565b506040518060400160405280600881526020017f756e7061636b656400000000000000000000000000000000000000000000000081525060039081611a96919061505c565b506040518060400160405280600581526020017f746f6b656e00000000000000000000000000000000000000000000000000000081525060049081611adb919061505c565b506040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525060059081611b20919061505c565b50600160085f6101000a81548160ff0219169083151502179055505f600860016101000a81548160ff0219169083151502179055508315611baf575f855f0160086101000a81548160ff0219169083151502179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d26001604051611ba691906155e7565b60405180910390a15b5050505050565b5f80611bc061313d565b9050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691505090565b611bf3612247565b8060085f6101000a81548160ff02191690831515021790555050565b5f8085604051602001611c229190615645565b6040516020818303038152906040528051906020012090506001151583151503611c9b57611c938585808060200260200160405190810160405280939291908181526020018383602002808284375f81840152601f19601f8201169050808301925050505050505060065483613164565b915050611cec565b611ce88585808060200260200160405190810160405280939291908181526020018383602002808284375f81840152601f19601f8201169050808301925050505050505060075483613164565b9150505b949350505050565b60605f611cff612347565b9050806001018054611d1090614d88565b80601f0160208091040260200160405190810160405280929190818152602001828054611d3c90614d88565b8015611d875780601f10611d5e57610100808354040283529160200191611d87565b820191905f5260205f20905b815481529060010190602001808311611d6a57829003601f168201915b505050505091505090565b5f611d9b612247565b6001600b54611daa9190615466565b905090565b60098054611dbc90614d88565b80601f0160208091040260200160405190810160405280929190818152602001828054611de890614d88565b8015611e335780601f10611e0a57610100808354040283529160200191611e33565b820191905f5260205f20905b815481529060010190602001808311611e1657829003601f168201915b505050505081565b5f600654905090565b611e4c612247565b611e56828261317a565b5050565b611e6c611e6561243b565b8383613322565b5050565b6040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b611eb4848484610d22565b611ec084848484613499565b50505050565b60605f73ffffffffffffffffffffffffffffffffffffffff16611ee88361364b565b73ffffffffffffffffffffffffffffffffffffffff1603611f3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f35906156a9565b60405180910390fd5b5f1515600860019054906101000a900460ff16151503611f9057600a6003611f6584612454565b6005604051602001611f7a9493929190615747565b6040516020818303038152906040529050611fca565b611f98613692565b6004611fa384612454565b6005604051602001611fb89493929190615784565b60405160208183030381529060405290505b919050565b60015481565b611fdd612247565b8060059081611fec919061505c565b5050565b5f600754905090565b5f80612003612347565b9050806005015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1691505092915050565b61209d612247565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361210d575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016121049190614469565b60405180910390fd5b61211681612f1e565b50565b612121612247565b8060078190555050565b600a805461213890614d88565b80601f016020809104026020016040519081016040528092919081815260200182805461216490614d88565b80156121af5780601f10612186576101008083540402835291602001916121af565b820191905f5260205f20905b81548152906001019060200180831161219257829003601f168201915b505050505081565b6121bf612247565b60015460025411156121d2600254612454565b6121db83612454565b6040516020016121ec929190614e86565b6040516020818303038152906040529061223c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612233919061440a565b60405180910390fd5b508060018190555050565b61224f61243b565b73ffffffffffffffffffffffffffffffffffffffff1661226d611bb6565b73ffffffffffffffffffffffffffffffffffffffff16146122cc5761229061243b565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016122c39190614469565b60405180910390fd5b565b5f7f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612340575061233f82613722565b5b9050919050565b5f7f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab0079300905090565b5f806123798361364b565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036123eb57826040517f7e2732890000000000000000000000000000000000000000000000000000000081526004016123e29190614764565b60405180910390fd5b80915050919050565b5f806123fe612347565b9050806004015f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b5f33905090565b61244f8383836001613803565b505050565b60605f6001612462846139d0565b0190505f8167ffffffffffffffff8111156124805761247f6144f2565b5b6040519080825280601f01601f1916602001820160405280156124b25781602001600182028036833780820191505090505b5090505f82602001820190505b600115612513578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612508576125076152d1565b5b0494505f85036124bf575b819350505050919050565b5f80612528612347565b90505f6125348561364b565b90505f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161461257557612574818587613b21565b5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612602576125b45f865f80613803565b6001826003015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825403925050819055505b5f73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614612683576001826003015f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b85826002015f8781526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550848673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480925050509392505050565b5f80151560085f9054906101000a900460ff16151514612790576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278790615831565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036127fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f5906153e0565b60405180910390fd5b612806611bb6565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612873576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286a90615899565b60405180910390fd5b60011515600d5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16151503612903576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128fa90615448565b60405180910390fd5b600154600b54111561294a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294190615901565b60405180910390fd5b8134146129575f54612454565b60405160200161296791906159b3565b604051602081830303815290604052906129b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ae919061440a565b60405180910390fd5b505f600b5f8154809291906129cb90615527565b9190505590506001600d5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600e5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f9091909190915055612a918482613be4565b8091505092915050565b5f612aa4612c58565b90505f612aaf612c7f565b6bffffffffffffffffffffffff16905080836bffffffffffffffffffffffff161115612b16578483826040517fdfd1fc1b000000000000000000000000000000000000000000000000000000008152600401612b0d93929190615a0f565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612b8857845f6040517f969f0852000000000000000000000000000000000000000000000000000000008152600401612b7f929190615a44565b60405180910390fd5b60405180604001604052808573ffffffffffffffffffffffffffffffffffffffff168152602001846bffffffffffffffffffffffff16815250826001015f8781526020019081526020015f205f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151815f0160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050505050565b5f7fdaedc9ab023613a7caf35e703657e986ccfad7e3eb0af93a2853f8d65dd86b00905090565b5f612710905090565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161480612d3557507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16612d1c613c01565b73ffffffffffffffffffffffffffffffffffffffff1614155b15612d6c576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b612d76612247565b50565b8173ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015612de157506040513d601f19601f82011682018060405250810190612dde9190615a7f565b60015b612e2257816040517f4c9c8ce3000000000000000000000000000000000000000000000000000000008152600401612e199190614469565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b8114612e8857806040517faa1d49a4000000000000000000000000000000000000000000000000000000008152600401612e7f91906149ae565b60405180910390fd5b612e928383613c54565b505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614612f1c576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f612f2761313d565b90505f815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905082825f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361305f575f6040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016130569190614469565b60405180910390fd5b5f61306b83835f61251e565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146130dd575f6040517f73c6ac6e0000000000000000000000000000000000000000000000000000000081526004016130d49190614469565b60405180910390fd5b505050565b5f7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00905090565b613111613cc6565b61311b8282613d06565b5050565b613127613cc6565b61313081613d41565b50565b61313b613cc6565b565b5f7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300905090565b5f826131708584613dc5565b1490509392505050565b5f613183612c58565b90505f61318e612c7f565b6bffffffffffffffffffffffff16905080836bffffffffffffffffffffffff1611156131f35782816040517f6f483d090000000000000000000000000000000000000000000000000000000081526004016131ea929190615aaa565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603613263575f6040517fb6d9900a00000000000000000000000000000000000000000000000000000000815260040161325a9190614469565b60405180910390fd5b60405180604001604052808573ffffffffffffffffffffffffffffffffffffffff168152602001846bffffffffffffffffffffffff16815250825f015f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151815f0160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff16021790555090505050505050565b5f61332b612347565b90505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361339d57826040517f5b08ba180000000000000000000000000000000000000000000000000000000081526004016133949190614469565b60405180910390fd5b81816005015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318460405161348b9190614381565b60405180910390a350505050565b5f8373ffffffffffffffffffffffffffffffffffffffff163b1115613645578273ffffffffffffffffffffffffffffffffffffffff1663150b7a026134dc61243b565b8685856040518563ffffffff1660e01b81526004016134fe9493929190615b23565b6020604051808303815f875af192505050801561353957506040513d601f19601f820116820180604052508101906135369190615b81565b60015b6135ba573d805f8114613567576040519150601f19603f3d011682016040523d82523d5f602084013e61356c565b606091505b505f8151036135b257836040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016135a99190614469565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461364357836040517f64a0ae9200000000000000000000000000000000000000000000000000000000815260040161363a9190614469565b60405180910390fd5b505b50505050565b5f80613655612347565b9050806002015f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b6060600980546136a190614d88565b80601f01602080910402602001604051908101604052809291908181526020018280546136cd90614d88565b80156137185780601f106136ef57610100808354040283529160200191613718565b820191905f5260205f20905b8154815290600101906020018083116136fb57829003601f168201915b5050505050905090565b5f7f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806137ec57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806137fc57506137fb82613e13565b5b9050919050565b5f61380c612347565b9050818061384657505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b15613978575f6138558561236e565b90505f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141580156138bf57508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b80156138d257506138d08185611ff9565b155b1561391457836040517fa9fbf51f00000000000000000000000000000000000000000000000000000000815260040161390b9190614469565b60405180910390fd5b821561397657848673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b84816004015f8681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310613a2c577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381613a2257613a216152d1565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310613a69576d04ee2d6d415b85acef81000000008381613a5f57613a5e6152d1565b5b0492506020810190505b662386f26fc100008310613a9857662386f26fc100008381613a8e57613a8d6152d1565b5b0492506010810190505b6305f5e1008310613ac1576305f5e1008381613ab757613ab66152d1565b5b0492506008810190505b6127108310613ae6576127108381613adc57613adb6152d1565b5b0492506004810190505b60648310613b095760648381613aff57613afe6152d1565b5b0492506002810190505b600a8310613b18576001810190505b80915050919050565b613b2c838383613e7c565b613bdf575f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613ba057806040517f7e273289000000000000000000000000000000000000000000000000000000008152600401613b979190614764565b60405180910390fd5b81816040517f177e802f000000000000000000000000000000000000000000000000000000008152600401613bd692919061484c565b60405180910390fd5b505050565b613bfd828260405180602001604052805f815250613f3c565b5050565b5f613c2d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b613f57565b5f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b613c5d82613f60565b8173ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a25f81511115613cb957613cb38282614029565b50613cc2565b613cc16140a9565b5b5050565b613cce6140e5565b613d04576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b613d0e613cc6565b5f613d17612347565b905082815f019081613d29919061505c565b5081816001019081613d3b919061505c565b50505050565b613d49613cc6565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613db9575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401613db09190614469565b60405180910390fd5b613dc281612f1e565b50565b5f808290505f5b8451811015613e0857613df982868381518110613dec57613deb61556e565b5b6020026020010151614103565b91508080600101915050613dcc565b508091505092915050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f8073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015613f3357508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480613ef45750613ef38484611ff9565b5b80613f3257508273ffffffffffffffffffffffffffffffffffffffff16613f1a836123f4565b73ffffffffffffffffffffffffffffffffffffffff16145b5b90509392505050565b613f468383612fef565b613f525f848484613499565b505050565b5f819050919050565b5f8173ffffffffffffffffffffffffffffffffffffffff163b03613fbb57806040517f4c9c8ce3000000000000000000000000000000000000000000000000000000008152600401613fb29190614469565b60405180910390fd5b80613fe77f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b613f57565b5f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60605f808473ffffffffffffffffffffffffffffffffffffffff16846040516140529190615be6565b5f60405180830381855af49150503d805f811461408a576040519150601f19603f3d011682016040523d82523d5f602084013e61408f565b606091505b509150915061409f85838361412d565b9250505092915050565b5f3411156140e3576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f6140ee6130e2565b5f0160089054906101000a900460ff16905090565b5f81831061411a5761411582846141ba565b614125565b61412483836141ba565b5b905092915050565b6060826141425761413d826141ce565b6141b2565b5f825114801561416857505f8473ffffffffffffffffffffffffffffffffffffffff163b145b156141aa57836040517f9996b3150000000000000000000000000000000000000000000000000000000081526004016141a19190614469565b60405180910390fd5b8190506141b3565b5b9392505050565b5f825f528160205260405f20905092915050565b5f815111156141e05780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b828054828255905f5260205f2090810192821561424c579160200282015b8281111561424b578251825591602001919060010190614230565b5b509050614259919061425d565b5090565b5b80821115614274575f815f90555060010161425e565b5090565b5f604051905090565b5f80fd5b5f80fd5b5f819050919050565b61429b81614289565b81146142a5575f80fd5b50565b5f813590506142b681614292565b92915050565b5f602082840312156142d1576142d0614281565b5b5f6142de848285016142a8565b91505092915050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61431b816142e7565b8114614325575f80fd5b50565b5f8135905061433681614312565b92915050565b5f6020828403121561435157614350614281565b5b5f61435e84828501614328565b91505092915050565b5f8115159050919050565b61437b81614367565b82525050565b5f6020820190506143945f830184614372565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6143dc8261439a565b6143e681856143a4565b93506143f68185602086016143b4565b6143ff816143c2565b840191505092915050565b5f6020820190508181035f83015261442281846143d2565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6144538261442a565b9050919050565b61446381614449565b82525050565b5f60208201905061447c5f83018461445a565b92915050565b61448b81614449565b8114614495575f80fd5b50565b5f813590506144a681614482565b92915050565b5f80604083850312156144c2576144c1614281565b5b5f6144cf85828601614498565b92505060206144e0858286016142a8565b9150509250929050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b614528826143c2565b810181811067ffffffffffffffff82111715614547576145466144f2565b5b80604052505050565b5f614559614278565b9050614565828261451f565b919050565b5f67ffffffffffffffff821115614584576145836144f2565b5b61458d826143c2565b9050602081019050919050565b828183375f83830152505050565b5f6145ba6145b58461456a565b614550565b9050828152602081018484840111156145d6576145d56144ee565b5b6145e184828561459a565b509392505050565b5f82601f8301126145fd576145fc6144ea565b5b813561460d8482602086016145a8565b91505092915050565b5f6020828403121561462b5761462a614281565b5b5f82013567ffffffffffffffff81111561464857614647614285565b5b614654848285016145e9565b91505092915050565b5f805f6060848603121561467457614673614281565b5b5f61468186828701614498565b935050602061469286828701614498565b92505060406146a3868287016142a8565b9150509250925092565b5f80fd5b5f80fd5b5f8083601f8401126146ca576146c96144ea565b5b8235905067ffffffffffffffff8111156146e7576146e66146ad565b5b602083019150836020820283011115614703576147026146b1565b5b9250929050565b5f80602083850312156147205761471f614281565b5b5f83013567ffffffffffffffff81111561473d5761473c614285565b5b614749858286016146b5565b92509250509250929050565b61475e81614289565b82525050565b5f6020820190506147775f830184614755565b92915050565b5f6bffffffffffffffffffffffff82169050919050565b61479d8161477d565b81146147a7575f80fd5b50565b5f813590506147b881614794565b92915050565b5f805f606084860312156147d5576147d4614281565b5b5f6147e2868287016142a8565b93505060206147f386828701614498565b9250506040614804868287016147aa565b9150509250925092565b5f806040838503121561482457614823614281565b5b5f614831858286016142a8565b9250506020614842858286016142a8565b9150509250929050565b5f60408201905061485f5f83018561445a565b61486c6020830184614755565b9392505050565b5f67ffffffffffffffff82111561488d5761488c6144f2565b5b614896826143c2565b9050602081019050919050565b5f6148b56148b084614873565b614550565b9050828152602081018484840111156148d1576148d06144ee565b5b6148dc84828561459a565b509392505050565b5f82601f8301126148f8576148f76144ea565b5b81356149088482602086016148a3565b91505092915050565b5f806040838503121561492757614926614281565b5b5f61493485828601614498565b925050602083013567ffffffffffffffff81111561495557614954614285565b5b614961858286016148e4565b9150509250929050565b5f602082840312156149805761497f614281565b5b5f61498d84828501614498565b91505092915050565b5f819050919050565b6149a881614996565b82525050565b5f6020820190506149c15f83018461499f565b92915050565b6149d081614996565b81146149da575f80fd5b50565b5f813590506149eb816149c7565b92915050565b5f60208284031215614a0657614a05614281565b5b5f614a13848285016149dd565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b614a4e81614289565b82525050565b5f614a5f8383614a45565b60208301905092915050565b5f602082019050919050565b5f614a8182614a1c565b614a8b8185614a26565b9350614a9683614a36565b805f5b83811015614ac6578151614aad8882614a54565b9750614ab883614a6b565b925050600181019050614a99565b5085935050505092915050565b5f6020820190508181035f830152614aeb8184614a77565b905092915050565b614afc81614367565b8114614b06575f80fd5b50565b5f81359050614b1781614af3565b92915050565b5f60208284031215614b3257614b31614281565b5b5f614b3f84828501614b09565b91505092915050565b5f805f8060608587031215614b6057614b5f614281565b5b5f614b6d87828801614498565b945050602085013567ffffffffffffffff811115614b8e57614b8d614285565b5b614b9a878288016146b5565b93509350506040614bad87828801614b09565b91505092959194509250565b5f8060408385031215614bcf57614bce614281565b5b5f614bdc85828601614498565b9250506020614bed858286016147aa565b9150509250929050565b5f8060408385031215614c0d57614c0c614281565b5b5f614c1a85828601614498565b9250506020614c2b85828601614b09565b9150509250929050565b5f805f8060808587031215614c4d57614c4c614281565b5b5f614c5a87828801614498565b9450506020614c6b87828801614498565b9350506040614c7c878288016142a8565b925050606085013567ffffffffffffffff811115614c9d57614c9c614285565b5b614ca9878288016148e4565b91505092959194509250565b5f8060408385031215614ccb57614cca614281565b5b5f614cd885828601614498565b9250506020614ce985828601614498565b9150509250929050565b7f466565206c657373207468656e207a65726f20212121200000000000000000005f82015250565b5f614d276017836143a4565b9150614d3282614cf3565b602082019050919050565b5f6020820190508181035f830152614d5481614d1b565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680614d9f57607f821691505b602082108103614db257614db1614d5b565b5b50919050565b5f81905092915050565b7f465245455f4d494e545f4e554d424552203a20000000000000000000000000005f82015250565b5f614df6601383614db8565b9150614e0182614dc2565b601382019050919050565b5f614e168261439a565b614e208185614db8565b9350614e308185602086016143b4565b80840191505092915050565b7f20204d41585f544f4b454e5f4e554d424552203a2000000000000000000000005f82015250565b5f614e70601583614db8565b9150614e7b82614e3c565b601582019050919050565b5f614e9082614dea565b9150614e9c8285614e0c565b9150614ea782614e64565b9150614eb38284614e0c565b91508190509392505050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302614f1b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614ee0565b614f258683614ee0565b95508019841693508086168417925050509392505050565b5f819050919050565b5f614f60614f5b614f5684614289565b614f3d565b614289565b9050919050565b5f819050919050565b614f7983614f46565b614f8d614f8582614f67565b848454614eec565b825550505050565b5f90565b614fa1614f95565b614fac818484614f70565b505050565b5b81811015614fcf57614fc45f82614f99565b600181019050614fb2565b5050565b601f82111561501457614fe581614ebf565b614fee84614ed1565b81016020851015614ffd578190505b61501161500985614ed1565b830182614fb1565b50505b505050565b5f82821c905092915050565b5f6150345f1984600802615019565b1980831691505092915050565b5f61504c8383615025565b9150826002028217905092915050565b6150658261439a565b67ffffffffffffffff81111561507e5761507d6144f2565b5b6150888254614d88565b615093828285614fd3565b5f60209050601f8311600181146150c4575f84156150b2578287015190505b6150bc8582615041565b865550615123565b601f1984166150d286614ebf565b5f5b828110156150f9578489015182556001820191506020850194506020810190506150d4565b868310156151165784890151615112601f891682615025565b8355505b6001600288020188555050505b505050505050565b5f60608201905061513e5f83018661445a565b61514b6020830185614755565b615158604083018461445a565b949350505050565b7f636f6465313034303300000000000000000000000000000000000000000000005f82015250565b5f6151946009836143a4565b915061519f82615160565b602082019050919050565b5f6020820190508181035f8301526151c181615188565b9050919050565b7f46726565206d696e74206f7574206f6620737570706c792021212120000000005f82015250565b5f6151fc601c836143a4565b9150615207826151c8565b602082019050919050565b5f6020820190508181035f830152615229816151f0565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61526782614289565b915061527283614289565b925082820190508082111561528a57615289615230565b5b92915050565b5f61529a82614289565b91506152a583614289565b92508282026152b381614289565b915082820484148315176152ca576152c9615230565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61530882614289565b915061531383614289565b925082615323576153226152d1565b5b828204905092915050565b7f576974686472617720746f20746865207a65726f2061646472657373000000005f82015250565b5f615362601c836143a4565b915061536d8261532e565b602082019050919050565b5f6020820190508181035f83015261538f81615356565b9050919050565b7f4d696e7420746f20746865207a65726f206164647265737300000000000000005f82015250565b5f6153ca6018836143a4565b91506153d582615396565b602082019050919050565b5f6020820190508181035f8301526153f7816153be565b9050919050565b7f636f6465313032303200000000000000000000000000000000000000000000005f82015250565b5f6154326009836143a4565b915061543d826153fe565b602082019050919050565b5f6020820190508181035f83015261545f81615426565b9050919050565b5f61547082614289565b915061547b83614289565b925082820390508181111561549357615492615230565b5b92915050565b7f4e6f7420656e6f75676820746f6b656e73206c65667420746f206d696e7420215f8201527f2121200000000000000000000000000000000000000000000000000000000000602082015250565b5f6154f36023836143a4565b91506154fe82615499565b604082019050919050565b5f6020820190508181035f830152615520816154e7565b9050919050565b5f61553182614289565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361556357615562615230565b5b600182019050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f819050919050565b5f67ffffffffffffffff82169050919050565b5f6155d16155cc6155c78461559b565b614f3d565b6155a4565b9050919050565b6155e1816155b7565b82525050565b5f6020820190506155fa5f8301846155d8565b92915050565b5f8160601b9050919050565b5f61561682615600565b9050919050565b5f6156278261560c565b9050919050565b61563f61563a82614449565b61561d565b82525050565b5f615650828461562e565b60148201915081905092915050565b7f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e005f82015250565b5f615693601f836143a4565b915061569e8261565f565b602082019050919050565b5f6020820190508181035f8301526156c081615687565b9050919050565b5f81546156d381614d88565b6156dd8186614db8565b9450600182165f81146156f7576001811461570c5761573e565b60ff198316865281151582028601935061573e565b61571585614ebf565b5f5b8381101561573657815481890152600182019150602081019050615717565b838801955050505b50505092915050565b5f61575282876156c7565b915061575e82866156c7565b915061576a8285614e0c565b915061577682846156c7565b915081905095945050505050565b5f61578f8287614e0c565b915061579b82866156c7565b91506157a78285614e0c565b91506157b382846156c7565b915081905095945050505050565b7f5075626c6963206d696e7420726f756e6420686173206e6f74207965742073745f8201527f6172746564202121212000000000000000000000000000000000000000000000602082015250565b5f61581b602a836143a4565b9150615826826157c1565b604082019050919050565b5f6020820190508181035f8301526158488161580f565b9050919050565b7f526563697069656e74206973206f776e657220212121200000000000000000005f82015250565b5f6158836017836143a4565b915061588e8261584f565b602082019050919050565b5f6020820190508181035f8301526158b081615877565b9050919050565b7f4f7574206f6620737570706c79202121212000000000000000000000000000005f82015250565b5f6158eb6012836143a4565b91506158f6826158b7565b602082019050919050565b5f6020820190508181035f830152615918816158df565b9050919050565b7f50726963652069732000000000000000000000000000000000000000000000005f82015250565b5f615953600983614db8565b915061595e8261591f565b600982019050919050565b7f20576569000000000000000000000000000000000000000000000000000000005f82015250565b5f61599d600483614db8565b91506159a882615969565b600482019050919050565b5f6159bd82615947565b91506159c98284614e0c565b91506159d482615991565b915081905092915050565b5f6159f96159f46159ef8461477d565b614f3d565b614289565b9050919050565b615a09816159df565b82525050565b5f606082019050615a225f830186614755565b615a2f6020830185615a00565b615a3c6040830184614755565b949350505050565b5f604082019050615a575f830185614755565b615a64602083018461445a565b9392505050565b5f81519050615a79816149c7565b92915050565b5f60208284031215615a9457615a93614281565b5b5f615aa184828501615a6b565b91505092915050565b5f604082019050615abd5f830185615a00565b615aca6020830184614755565b9392505050565b5f81519050919050565b5f82825260208201905092915050565b5f615af582615ad1565b615aff8185615adb565b9350615b0f8185602086016143b4565b615b18816143c2565b840191505092915050565b5f608082019050615b365f83018761445a565b615b43602083018661445a565b615b506040830185614755565b8181036060830152615b628184615aeb565b905095945050505050565b5f81519050615b7b81614312565b92915050565b5f60208284031215615b9657615b95614281565b5b5f615ba384828501615b6d565b91505092915050565b5f81905092915050565b5f615bc082615ad1565b615bca8185615bac565b9350615bda8185602086016143b4565b80840191505092915050565b5f615bf18284615bb6565b91508190509291505056fe697066733a2f2f516d614b3133324c3962456a6d7a384b4d7878715874454641314e7a4b4e5659363973736d72556a79616f6f587a2fa2646970667358221220cf63c4be24f75fc901b65581b38a955fa258d05ae8ed3e580d6e5d881802271164736f6c63430008190033
Deployed Bytecode
0x6080604052600436106102c7575f3560e01c8063715018a611610174578063a1edde4e116100db578063da3ef23f11610094578063f2fde38b1161006e578063f2fde38b14610aa2578063f72f874614610aca578063f9f5274c14610af2578063fffdcf1b14610b1c576102c7565b8063da3ef23f14610a14578063e8546c7314610a3c578063e985e9c514610a66576102c7565b8063a1edde4e1461090c578063a22cb46514610934578063ad3cb1cc1461095c578063b88d4fde14610986578063c87b56dd146109ae578063d1aeebbf146109ea576102c7565b80639422424b1161012d5780639422424b14610800578063953324c81461082857806395d89b411461086457806398135e3a1461088e5780639b36ed63146108b85780639e322832146108e2576102c7565b8063715018a61461070857806376dcb19d1461071e57806377d247621461075a5780637f496cb1146107845780638129fc1c146107c05780638da5cb5b146107d6576102c7565b806335135c1a1161023357806354214f69116101ec5780636352211e116101c65780636352211e14610652578063652f60681461068e57806366b9f0d2146106b657806370a08231146106cc576102c7565b806354214f69146105d45780635c975abb146105fe5780635d3bbdda14610628576102c7565b806335135c1a146104f257806342842e0e1461051a57806348000b28146105425780634f1ef2861461057257806351cff8d91461058e57806352d1902d146105aa576102c7565b80631c805539116102855780631c805539146103e557806323b872dd1461040d57806323c8c9481461043557806324ed16a41461045d578063259521301461048d5780632a55205a146104b5576102c7565b8062172ddf146102cb57806301ffc9a7146102f357806306fdde031461032f578063081812fc14610359578063095ea7b3146103955780630aff6903146103bd575b5f80fd5b3480156102d6575f80fd5b506102f160048036038101906102ec91906142bc565b610b44565b005b3480156102fe575f80fd5b506103196004803603810190610314919061433c565b610b98565b6040516103269190614381565b60405180910390f35b34801561033a575f80fd5b50610343610ba9565b604051610350919061440a565b60405180910390f35b348015610364575f80fd5b5061037f600480360381019061037a91906142bc565b610c46565b60405161038c9190614469565b60405180910390f35b3480156103a0575f80fd5b506103bb60048036038101906103b691906144ac565b610c61565b005b3480156103c8575f80fd5b506103e360048036038101906103de91906142bc565b610c77565b005b3480156103f0575f80fd5b5061040b60048036038101906104069190614616565b610d07565b005b348015610418575f80fd5b50610433600480360381019061042e919061465d565b610d22565b005b348015610440575f80fd5b5061045b60048036038101906104569190614616565b610e21565b005b6104776004803603810190610472919061470a565b610e3c565b6040516104849190614764565b60405180910390f35b348015610498575f80fd5b506104b360048036038101906104ae91906147be565b610f04565b005b3480156104c0575f80fd5b506104db60048036038101906104d6919061480e565b610f1c565b6040516104e992919061484c565b60405180910390f35b3480156104fd575f80fd5b5061051860048036038101906105139190614616565b611107565b005b348015610525575f80fd5b50610540600480360381019061053b919061465d565b611122565b005b61055c6004803603810190610557919061470a565b611141565b6040516105699190614764565b60405180910390f35b61058c60048036038101906105879190614911565b6111aa565b005b6105a860048036038101906105a3919061496b565b6111c9565b005b3480156105b5575f80fd5b506105be61128b565b6040516105cb91906149ae565b60405180910390f35b3480156105df575f80fd5b506105e86112bc565b6040516105f59190614381565b60405180910390f35b348015610609575f80fd5b506106126112d2565b60405161061f9190614381565b60405180910390f35b348015610633575f80fd5b5061063c6112e4565b6040516106499190614764565b60405180910390f35b34801561065d575f80fd5b50610678600480360381019061067391906142bc565b6112ea565b6040516106859190614469565b60405180910390f35b348015610699575f80fd5b506106b460048036038101906106af91906149f1565b6112fb565b005b3480156106c1575f80fd5b506106ca61130d565b005b3480156106d7575f80fd5b506106f260048036038101906106ed919061496b565b611332565b6040516106ff9190614764565b60405180910390f35b348015610713575f80fd5b5061071c6113f6565b005b348015610729575f80fd5b50610744600480360381019061073f91906144ac565b611409565b6040516107519190614ad3565b60405180910390f35b348015610765575f80fd5b5061076e61176c565b60405161077b9190614764565b60405180910390f35b34801561078f575f80fd5b506107aa60048036038101906107a5919061496b565b611774565b6040516107b79190614ad3565b60405180910390f35b3480156107cb575f80fd5b506107d461180f565b005b3480156107e1575f80fd5b506107ea611bb6565b6040516107f79190614469565b60405180910390f35b34801561080b575f80fd5b5061082660048036038101906108219190614b1d565b611beb565b005b348015610833575f80fd5b5061084e60048036038101906108499190614b48565b611c0f565b60405161085b9190614381565b60405180910390f35b34801561086f575f80fd5b50610878611cf4565b604051610885919061440a565b60405180910390f35b348015610899575f80fd5b506108a2611d92565b6040516108af9190614764565b60405180910390f35b3480156108c3575f80fd5b506108cc611daf565b6040516108d9919061440a565b60405180910390f35b3480156108ed575f80fd5b506108f6611e3b565b60405161090391906149ae565b60405180910390f35b348015610917575f80fd5b50610932600480360381019061092d9190614bb9565b611e44565b005b34801561093f575f80fd5b5061095a60048036038101906109559190614bf7565b611e5a565b005b348015610967575f80fd5b50610970611e70565b60405161097d919061440a565b60405180910390f35b348015610991575f80fd5b506109ac60048036038101906109a79190614c35565b611ea9565b005b3480156109b9575f80fd5b506109d460048036038101906109cf91906142bc565b611ec6565b6040516109e1919061440a565b60405180910390f35b3480156109f5575f80fd5b506109fe611fcf565b604051610a0b9190614764565b60405180910390f35b348015610a1f575f80fd5b50610a3a6004803603810190610a359190614616565b611fd5565b005b348015610a47575f80fd5b50610a50611ff0565b604051610a5d91906149ae565b60405180910390f35b348015610a71575f80fd5b50610a8c6004803603810190610a879190614cb5565b611ff9565b604051610a999190614381565b60405180910390f35b348015610aad575f80fd5b50610ac86004803603810190610ac3919061496b565b612095565b005b348015610ad5575f80fd5b50610af06004803603810190610aeb91906149f1565b612119565b005b348015610afd575f80fd5b50610b0661212b565b604051610b13919061440a565b60405180910390f35b348015610b27575f80fd5b50610b426004803603810190610b3d91906142bc565b6121b7565b005b610b4c612247565b5f811015610b8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8690614d3d565b60405180910390fd5b805f8190555050565b5f610ba2826122ce565b9050919050565b60605f610bb4612347565b9050805f018054610bc490614d88565b80601f0160208091040260200160405190810160405280929190818152602001828054610bf090614d88565b8015610c3b5780601f10610c1257610100808354040283529160200191610c3b565b820191905f5260205f20905b815481529060010190602001808311610c1e57829003601f168201915b505050505091505090565b5f610c508261236e565b50610c5a826123f4565b9050919050565b610c738282610c6e61243b565b612442565b5050565b610c7f612247565b6001546002541115610c9082612454565b610c9b600154612454565b604051602001610cac929190614e86565b60405160208183030381529060405290610cfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf3919061440a565b60405180910390fd5b508060028190555050565b610d0f612247565b8060049081610d1e919061505c565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d92575f6040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401610d899190614469565b60405180910390fd5b5f610da58383610da061243b565b61251e565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e1b578382826040517f64283d7b000000000000000000000000000000000000000000000000000000008152600401610e129392919061512b565b60405180910390fd5b50505050565b610e29612247565b8060099081610e38919061505c565b5050565b5f80339050610e4e3385856001611c0f565b610e8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e84906151aa565b60405180910390fd5b600254600c5410610ed3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eca90615212565b60405180910390fd5b5f610ede825f61273b565b90506001600c5f828254610ef2919061525d565b92505081905550809250505092915050565b610f0c612247565b610f17838383612a9b565b505050565b5f805f610f27612c58565b90505f816001015f8781526020019081526020015f206040518060400160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020015f820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505f73ffffffffffffffffffffffffffffffffffffffff16815f015173ffffffffffffffffffffffffffffffffffffffff16036110b357815f016040518060400160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020015f820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b5f6110bc612c7f565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff16876110e89190615290565b6110f291906152fe565b9050815f015181945094505050509250929050565b61110f612247565b80600a908161111e919061505c565b5050565b61113c83838360405180602001604052805f815250611ea9565b505050565b5f803390506111528185855f611c0f565b611191576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611188906151aa565b60405180910390fd5b5f61119d825f5461273b565b9050809250505092915050565b6111b2612c88565b6111bb82612d6e565b6111c58282612d79565b5050565b6111d1612247565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361123f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123690615378565b60405180910390fd5b5f4790508173ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015611286573d5f803e3d5ffd5b505050565b5f611294612e97565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b905090565b5f600860019054906101000a900460ff16905090565b60085f9054906101000a900460ff1681565b60025481565b5f6112f48261236e565b9050919050565b611303612247565b8060068190555050565b611315612247565b6001600860016101000a81548160ff021916908315150217905550565b5f8061133c612347565b90505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036113ae575f6040517f89c62b640000000000000000000000000000000000000000000000000000000081526004016113a59190614469565b60405180910390fd5b806003015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054915050919050565b6113fe612247565b6114075f612f1e565b565b6060611413612247565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611481576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611478906153e0565b60405180910390fd5b60011515600d5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16151503611511576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150890615448565b60405180910390fd5b600154826001600b546115249190615466565b61152e919061525d565b111561156f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156690615509565b60405180910390fd5b5f8267ffffffffffffffff81111561158a576115896144f2565b5b6040519080825280602002602001820160405280156115b85781602001602082028036833780820191505090505b5090508267ffffffffffffffff8111156115d5576115d46144f2565b5b6040519080825280602002602001820160405280156116035781602001602082028036833780820191505090505b50600e5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f209080519060200190611654929190614212565b505f5b8381101561170c575f600b5f81548092919061167290615527565b9190505590506116828682612fef565b808383815181106116965761169561556e565b5b60200260200101818152505080600e5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2083815481106116f2576116f161556e565b5b905f5260205f200181905550508080600101915050611657565b506001600d5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508091505092915050565b5f8054905090565b606061177e612247565b600e5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080548060200260200160405190810160405280929190818152602001828054801561180357602002820191905f5260205f20905b8154815260200190600101908083116117ef575b50505050509050919050565b5f6118186130e2565b90505f815f0160089054906101000a900460ff161590505f825f015f9054906101000a900467ffffffffffffffff1690505f808267ffffffffffffffff161480156118605750825b90505f60018367ffffffffffffffff1614801561189357505f3073ffffffffffffffffffffffffffffffffffffffff163b145b9050811580156118a1575080155b156118d8576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001855f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508315611925576001855f0160086101000a81548160ff0219169083151502179055505b6119996040518060400160405280600581526020017f5441524f540000000000000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f544e000000000000000000000000000000000000000000000000000000000000815250613109565b6119a23361311f565b6119aa613133565b670429d069189e00005f8190555061025860018190555060506002819055507f328915450ec1bf5a80adaa6c1896d78c09b9cfc32f327d17b1f6a162866f60065f1b6006819055507fa4dc3989426959700832f1067a399368bc66f2ca037a47c0afdcb4c766ce338e5f1b6007819055506001600b819055505f600c81905550604051806060016040528060368152602001615bfd60369139600a9081611a51919061505c565b506040518060400160405280600881526020017f756e7061636b656400000000000000000000000000000000000000000000000081525060039081611a96919061505c565b506040518060400160405280600581526020017f746f6b656e00000000000000000000000000000000000000000000000000000081525060049081611adb919061505c565b506040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525060059081611b20919061505c565b50600160085f6101000a81548160ff0219169083151502179055505f600860016101000a81548160ff0219169083151502179055508315611baf575f855f0160086101000a81548160ff0219169083151502179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d26001604051611ba691906155e7565b60405180910390a15b5050505050565b5f80611bc061313d565b9050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691505090565b611bf3612247565b8060085f6101000a81548160ff02191690831515021790555050565b5f8085604051602001611c229190615645565b6040516020818303038152906040528051906020012090506001151583151503611c9b57611c938585808060200260200160405190810160405280939291908181526020018383602002808284375f81840152601f19601f8201169050808301925050505050505060065483613164565b915050611cec565b611ce88585808060200260200160405190810160405280939291908181526020018383602002808284375f81840152601f19601f8201169050808301925050505050505060075483613164565b9150505b949350505050565b60605f611cff612347565b9050806001018054611d1090614d88565b80601f0160208091040260200160405190810160405280929190818152602001828054611d3c90614d88565b8015611d875780601f10611d5e57610100808354040283529160200191611d87565b820191905f5260205f20905b815481529060010190602001808311611d6a57829003601f168201915b505050505091505090565b5f611d9b612247565b6001600b54611daa9190615466565b905090565b60098054611dbc90614d88565b80601f0160208091040260200160405190810160405280929190818152602001828054611de890614d88565b8015611e335780601f10611e0a57610100808354040283529160200191611e33565b820191905f5260205f20905b815481529060010190602001808311611e1657829003601f168201915b505050505081565b5f600654905090565b611e4c612247565b611e56828261317a565b5050565b611e6c611e6561243b565b8383613322565b5050565b6040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b611eb4848484610d22565b611ec084848484613499565b50505050565b60605f73ffffffffffffffffffffffffffffffffffffffff16611ee88361364b565b73ffffffffffffffffffffffffffffffffffffffff1603611f3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f35906156a9565b60405180910390fd5b5f1515600860019054906101000a900460ff16151503611f9057600a6003611f6584612454565b6005604051602001611f7a9493929190615747565b6040516020818303038152906040529050611fca565b611f98613692565b6004611fa384612454565b6005604051602001611fb89493929190615784565b60405160208183030381529060405290505b919050565b60015481565b611fdd612247565b8060059081611fec919061505c565b5050565b5f600754905090565b5f80612003612347565b9050806005015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1691505092915050565b61209d612247565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361210d575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016121049190614469565b60405180910390fd5b61211681612f1e565b50565b612121612247565b8060078190555050565b600a805461213890614d88565b80601f016020809104026020016040519081016040528092919081815260200182805461216490614d88565b80156121af5780601f10612186576101008083540402835291602001916121af565b820191905f5260205f20905b81548152906001019060200180831161219257829003601f168201915b505050505081565b6121bf612247565b60015460025411156121d2600254612454565b6121db83612454565b6040516020016121ec929190614e86565b6040516020818303038152906040529061223c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612233919061440a565b60405180910390fd5b508060018190555050565b61224f61243b565b73ffffffffffffffffffffffffffffffffffffffff1661226d611bb6565b73ffffffffffffffffffffffffffffffffffffffff16146122cc5761229061243b565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016122c39190614469565b60405180910390fd5b565b5f7f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612340575061233f82613722565b5b9050919050565b5f7f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab0079300905090565b5f806123798361364b565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036123eb57826040517f7e2732890000000000000000000000000000000000000000000000000000000081526004016123e29190614764565b60405180910390fd5b80915050919050565b5f806123fe612347565b9050806004015f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b5f33905090565b61244f8383836001613803565b505050565b60605f6001612462846139d0565b0190505f8167ffffffffffffffff8111156124805761247f6144f2565b5b6040519080825280601f01601f1916602001820160405280156124b25781602001600182028036833780820191505090505b5090505f82602001820190505b600115612513578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612508576125076152d1565b5b0494505f85036124bf575b819350505050919050565b5f80612528612347565b90505f6125348561364b565b90505f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161461257557612574818587613b21565b5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612602576125b45f865f80613803565b6001826003015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825403925050819055505b5f73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614612683576001826003015f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b85826002015f8781526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550848673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480925050509392505050565b5f80151560085f9054906101000a900460ff16151514612790576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278790615831565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036127fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f5906153e0565b60405180910390fd5b612806611bb6565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612873576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286a90615899565b60405180910390fd5b60011515600d5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16151503612903576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128fa90615448565b60405180910390fd5b600154600b54111561294a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294190615901565b60405180910390fd5b8134146129575f54612454565b60405160200161296791906159b3565b604051602081830303815290604052906129b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ae919061440a565b60405180910390fd5b505f600b5f8154809291906129cb90615527565b9190505590506001600d5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600e5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f9091909190915055612a918482613be4565b8091505092915050565b5f612aa4612c58565b90505f612aaf612c7f565b6bffffffffffffffffffffffff16905080836bffffffffffffffffffffffff161115612b16578483826040517fdfd1fc1b000000000000000000000000000000000000000000000000000000008152600401612b0d93929190615a0f565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612b8857845f6040517f969f0852000000000000000000000000000000000000000000000000000000008152600401612b7f929190615a44565b60405180910390fd5b60405180604001604052808573ffffffffffffffffffffffffffffffffffffffff168152602001846bffffffffffffffffffffffff16815250826001015f8781526020019081526020015f205f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151815f0160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050505050565b5f7fdaedc9ab023613a7caf35e703657e986ccfad7e3eb0af93a2853f8d65dd86b00905090565b5f612710905090565b7f0000000000000000000000008efa5d3d2ab95cb43bbba25de45bcea5b79bc15173ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161480612d3557507f0000000000000000000000008efa5d3d2ab95cb43bbba25de45bcea5b79bc15173ffffffffffffffffffffffffffffffffffffffff16612d1c613c01565b73ffffffffffffffffffffffffffffffffffffffff1614155b15612d6c576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b612d76612247565b50565b8173ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015612de157506040513d601f19601f82011682018060405250810190612dde9190615a7f565b60015b612e2257816040517f4c9c8ce3000000000000000000000000000000000000000000000000000000008152600401612e199190614469565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b8114612e8857806040517faa1d49a4000000000000000000000000000000000000000000000000000000008152600401612e7f91906149ae565b60405180910390fd5b612e928383613c54565b505050565b7f0000000000000000000000008efa5d3d2ab95cb43bbba25de45bcea5b79bc15173ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614612f1c576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f612f2761313d565b90505f815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905082825f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361305f575f6040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016130569190614469565b60405180910390fd5b5f61306b83835f61251e565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146130dd575f6040517f73c6ac6e0000000000000000000000000000000000000000000000000000000081526004016130d49190614469565b60405180910390fd5b505050565b5f7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00905090565b613111613cc6565b61311b8282613d06565b5050565b613127613cc6565b61313081613d41565b50565b61313b613cc6565b565b5f7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300905090565b5f826131708584613dc5565b1490509392505050565b5f613183612c58565b90505f61318e612c7f565b6bffffffffffffffffffffffff16905080836bffffffffffffffffffffffff1611156131f35782816040517f6f483d090000000000000000000000000000000000000000000000000000000081526004016131ea929190615aaa565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603613263575f6040517fb6d9900a00000000000000000000000000000000000000000000000000000000815260040161325a9190614469565b60405180910390fd5b60405180604001604052808573ffffffffffffffffffffffffffffffffffffffff168152602001846bffffffffffffffffffffffff16815250825f015f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151815f0160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff16021790555090505050505050565b5f61332b612347565b90505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361339d57826040517f5b08ba180000000000000000000000000000000000000000000000000000000081526004016133949190614469565b60405180910390fd5b81816005015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318460405161348b9190614381565b60405180910390a350505050565b5f8373ffffffffffffffffffffffffffffffffffffffff163b1115613645578273ffffffffffffffffffffffffffffffffffffffff1663150b7a026134dc61243b565b8685856040518563ffffffff1660e01b81526004016134fe9493929190615b23565b6020604051808303815f875af192505050801561353957506040513d601f19601f820116820180604052508101906135369190615b81565b60015b6135ba573d805f8114613567576040519150601f19603f3d011682016040523d82523d5f602084013e61356c565b606091505b505f8151036135b257836040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016135a99190614469565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461364357836040517f64a0ae9200000000000000000000000000000000000000000000000000000000815260040161363a9190614469565b60405180910390fd5b505b50505050565b5f80613655612347565b9050806002015f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b6060600980546136a190614d88565b80601f01602080910402602001604051908101604052809291908181526020018280546136cd90614d88565b80156137185780601f106136ef57610100808354040283529160200191613718565b820191905f5260205f20905b8154815290600101906020018083116136fb57829003601f168201915b5050505050905090565b5f7f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806137ec57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806137fc57506137fb82613e13565b5b9050919050565b5f61380c612347565b9050818061384657505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b15613978575f6138558561236e565b90505f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141580156138bf57508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b80156138d257506138d08185611ff9565b155b1561391457836040517fa9fbf51f00000000000000000000000000000000000000000000000000000000815260040161390b9190614469565b60405180910390fd5b821561397657848673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b84816004015f8681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310613a2c577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381613a2257613a216152d1565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310613a69576d04ee2d6d415b85acef81000000008381613a5f57613a5e6152d1565b5b0492506020810190505b662386f26fc100008310613a9857662386f26fc100008381613a8e57613a8d6152d1565b5b0492506010810190505b6305f5e1008310613ac1576305f5e1008381613ab757613ab66152d1565b5b0492506008810190505b6127108310613ae6576127108381613adc57613adb6152d1565b5b0492506004810190505b60648310613b095760648381613aff57613afe6152d1565b5b0492506002810190505b600a8310613b18576001810190505b80915050919050565b613b2c838383613e7c565b613bdf575f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613ba057806040517f7e273289000000000000000000000000000000000000000000000000000000008152600401613b979190614764565b60405180910390fd5b81816040517f177e802f000000000000000000000000000000000000000000000000000000008152600401613bd692919061484c565b60405180910390fd5b505050565b613bfd828260405180602001604052805f815250613f3c565b5050565b5f613c2d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b613f57565b5f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b613c5d82613f60565b8173ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a25f81511115613cb957613cb38282614029565b50613cc2565b613cc16140a9565b5b5050565b613cce6140e5565b613d04576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b613d0e613cc6565b5f613d17612347565b905082815f019081613d29919061505c565b5081816001019081613d3b919061505c565b50505050565b613d49613cc6565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613db9575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401613db09190614469565b60405180910390fd5b613dc281612f1e565b50565b5f808290505f5b8451811015613e0857613df982868381518110613dec57613deb61556e565b5b6020026020010151614103565b91508080600101915050613dcc565b508091505092915050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f8073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015613f3357508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480613ef45750613ef38484611ff9565b5b80613f3257508273ffffffffffffffffffffffffffffffffffffffff16613f1a836123f4565b73ffffffffffffffffffffffffffffffffffffffff16145b5b90509392505050565b613f468383612fef565b613f525f848484613499565b505050565b5f819050919050565b5f8173ffffffffffffffffffffffffffffffffffffffff163b03613fbb57806040517f4c9c8ce3000000000000000000000000000000000000000000000000000000008152600401613fb29190614469565b60405180910390fd5b80613fe77f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b613f57565b5f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60605f808473ffffffffffffffffffffffffffffffffffffffff16846040516140529190615be6565b5f60405180830381855af49150503d805f811461408a576040519150601f19603f3d011682016040523d82523d5f602084013e61408f565b606091505b509150915061409f85838361412d565b9250505092915050565b5f3411156140e3576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f6140ee6130e2565b5f0160089054906101000a900460ff16905090565b5f81831061411a5761411582846141ba565b614125565b61412483836141ba565b5b905092915050565b6060826141425761413d826141ce565b6141b2565b5f825114801561416857505f8473ffffffffffffffffffffffffffffffffffffffff163b145b156141aa57836040517f9996b3150000000000000000000000000000000000000000000000000000000081526004016141a19190614469565b60405180910390fd5b8190506141b3565b5b9392505050565b5f825f528160205260405f20905092915050565b5f815111156141e05780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b828054828255905f5260205f2090810192821561424c579160200282015b8281111561424b578251825591602001919060010190614230565b5b509050614259919061425d565b5090565b5b80821115614274575f815f90555060010161425e565b5090565b5f604051905090565b5f80fd5b5f80fd5b5f819050919050565b61429b81614289565b81146142a5575f80fd5b50565b5f813590506142b681614292565b92915050565b5f602082840312156142d1576142d0614281565b5b5f6142de848285016142a8565b91505092915050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61431b816142e7565b8114614325575f80fd5b50565b5f8135905061433681614312565b92915050565b5f6020828403121561435157614350614281565b5b5f61435e84828501614328565b91505092915050565b5f8115159050919050565b61437b81614367565b82525050565b5f6020820190506143945f830184614372565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6143dc8261439a565b6143e681856143a4565b93506143f68185602086016143b4565b6143ff816143c2565b840191505092915050565b5f6020820190508181035f83015261442281846143d2565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6144538261442a565b9050919050565b61446381614449565b82525050565b5f60208201905061447c5f83018461445a565b92915050565b61448b81614449565b8114614495575f80fd5b50565b5f813590506144a681614482565b92915050565b5f80604083850312156144c2576144c1614281565b5b5f6144cf85828601614498565b92505060206144e0858286016142a8565b9150509250929050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b614528826143c2565b810181811067ffffffffffffffff82111715614547576145466144f2565b5b80604052505050565b5f614559614278565b9050614565828261451f565b919050565b5f67ffffffffffffffff821115614584576145836144f2565b5b61458d826143c2565b9050602081019050919050565b828183375f83830152505050565b5f6145ba6145b58461456a565b614550565b9050828152602081018484840111156145d6576145d56144ee565b5b6145e184828561459a565b509392505050565b5f82601f8301126145fd576145fc6144ea565b5b813561460d8482602086016145a8565b91505092915050565b5f6020828403121561462b5761462a614281565b5b5f82013567ffffffffffffffff81111561464857614647614285565b5b614654848285016145e9565b91505092915050565b5f805f6060848603121561467457614673614281565b5b5f61468186828701614498565b935050602061469286828701614498565b92505060406146a3868287016142a8565b9150509250925092565b5f80fd5b5f80fd5b5f8083601f8401126146ca576146c96144ea565b5b8235905067ffffffffffffffff8111156146e7576146e66146ad565b5b602083019150836020820283011115614703576147026146b1565b5b9250929050565b5f80602083850312156147205761471f614281565b5b5f83013567ffffffffffffffff81111561473d5761473c614285565b5b614749858286016146b5565b92509250509250929050565b61475e81614289565b82525050565b5f6020820190506147775f830184614755565b92915050565b5f6bffffffffffffffffffffffff82169050919050565b61479d8161477d565b81146147a7575f80fd5b50565b5f813590506147b881614794565b92915050565b5f805f606084860312156147d5576147d4614281565b5b5f6147e2868287016142a8565b93505060206147f386828701614498565b9250506040614804868287016147aa565b9150509250925092565b5f806040838503121561482457614823614281565b5b5f614831858286016142a8565b9250506020614842858286016142a8565b9150509250929050565b5f60408201905061485f5f83018561445a565b61486c6020830184614755565b9392505050565b5f67ffffffffffffffff82111561488d5761488c6144f2565b5b614896826143c2565b9050602081019050919050565b5f6148b56148b084614873565b614550565b9050828152602081018484840111156148d1576148d06144ee565b5b6148dc84828561459a565b509392505050565b5f82601f8301126148f8576148f76144ea565b5b81356149088482602086016148a3565b91505092915050565b5f806040838503121561492757614926614281565b5b5f61493485828601614498565b925050602083013567ffffffffffffffff81111561495557614954614285565b5b614961858286016148e4565b9150509250929050565b5f602082840312156149805761497f614281565b5b5f61498d84828501614498565b91505092915050565b5f819050919050565b6149a881614996565b82525050565b5f6020820190506149c15f83018461499f565b92915050565b6149d081614996565b81146149da575f80fd5b50565b5f813590506149eb816149c7565b92915050565b5f60208284031215614a0657614a05614281565b5b5f614a13848285016149dd565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b614a4e81614289565b82525050565b5f614a5f8383614a45565b60208301905092915050565b5f602082019050919050565b5f614a8182614a1c565b614a8b8185614a26565b9350614a9683614a36565b805f5b83811015614ac6578151614aad8882614a54565b9750614ab883614a6b565b925050600181019050614a99565b5085935050505092915050565b5f6020820190508181035f830152614aeb8184614a77565b905092915050565b614afc81614367565b8114614b06575f80fd5b50565b5f81359050614b1781614af3565b92915050565b5f60208284031215614b3257614b31614281565b5b5f614b3f84828501614b09565b91505092915050565b5f805f8060608587031215614b6057614b5f614281565b5b5f614b6d87828801614498565b945050602085013567ffffffffffffffff811115614b8e57614b8d614285565b5b614b9a878288016146b5565b93509350506040614bad87828801614b09565b91505092959194509250565b5f8060408385031215614bcf57614bce614281565b5b5f614bdc85828601614498565b9250506020614bed858286016147aa565b9150509250929050565b5f8060408385031215614c0d57614c0c614281565b5b5f614c1a85828601614498565b9250506020614c2b85828601614b09565b9150509250929050565b5f805f8060808587031215614c4d57614c4c614281565b5b5f614c5a87828801614498565b9450506020614c6b87828801614498565b9350506040614c7c878288016142a8565b925050606085013567ffffffffffffffff811115614c9d57614c9c614285565b5b614ca9878288016148e4565b91505092959194509250565b5f8060408385031215614ccb57614cca614281565b5b5f614cd885828601614498565b9250506020614ce985828601614498565b9150509250929050565b7f466565206c657373207468656e207a65726f20212121200000000000000000005f82015250565b5f614d276017836143a4565b9150614d3282614cf3565b602082019050919050565b5f6020820190508181035f830152614d5481614d1b565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680614d9f57607f821691505b602082108103614db257614db1614d5b565b5b50919050565b5f81905092915050565b7f465245455f4d494e545f4e554d424552203a20000000000000000000000000005f82015250565b5f614df6601383614db8565b9150614e0182614dc2565b601382019050919050565b5f614e168261439a565b614e208185614db8565b9350614e308185602086016143b4565b80840191505092915050565b7f20204d41585f544f4b454e5f4e554d424552203a2000000000000000000000005f82015250565b5f614e70601583614db8565b9150614e7b82614e3c565b601582019050919050565b5f614e9082614dea565b9150614e9c8285614e0c565b9150614ea782614e64565b9150614eb38284614e0c565b91508190509392505050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302614f1b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614ee0565b614f258683614ee0565b95508019841693508086168417925050509392505050565b5f819050919050565b5f614f60614f5b614f5684614289565b614f3d565b614289565b9050919050565b5f819050919050565b614f7983614f46565b614f8d614f8582614f67565b848454614eec565b825550505050565b5f90565b614fa1614f95565b614fac818484614f70565b505050565b5b81811015614fcf57614fc45f82614f99565b600181019050614fb2565b5050565b601f82111561501457614fe581614ebf565b614fee84614ed1565b81016020851015614ffd578190505b61501161500985614ed1565b830182614fb1565b50505b505050565b5f82821c905092915050565b5f6150345f1984600802615019565b1980831691505092915050565b5f61504c8383615025565b9150826002028217905092915050565b6150658261439a565b67ffffffffffffffff81111561507e5761507d6144f2565b5b6150888254614d88565b615093828285614fd3565b5f60209050601f8311600181146150c4575f84156150b2578287015190505b6150bc8582615041565b865550615123565b601f1984166150d286614ebf565b5f5b828110156150f9578489015182556001820191506020850194506020810190506150d4565b868310156151165784890151615112601f891682615025565b8355505b6001600288020188555050505b505050505050565b5f60608201905061513e5f83018661445a565b61514b6020830185614755565b615158604083018461445a565b949350505050565b7f636f6465313034303300000000000000000000000000000000000000000000005f82015250565b5f6151946009836143a4565b915061519f82615160565b602082019050919050565b5f6020820190508181035f8301526151c181615188565b9050919050565b7f46726565206d696e74206f7574206f6620737570706c792021212120000000005f82015250565b5f6151fc601c836143a4565b9150615207826151c8565b602082019050919050565b5f6020820190508181035f830152615229816151f0565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61526782614289565b915061527283614289565b925082820190508082111561528a57615289615230565b5b92915050565b5f61529a82614289565b91506152a583614289565b92508282026152b381614289565b915082820484148315176152ca576152c9615230565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61530882614289565b915061531383614289565b925082615323576153226152d1565b5b828204905092915050565b7f576974686472617720746f20746865207a65726f2061646472657373000000005f82015250565b5f615362601c836143a4565b915061536d8261532e565b602082019050919050565b5f6020820190508181035f83015261538f81615356565b9050919050565b7f4d696e7420746f20746865207a65726f206164647265737300000000000000005f82015250565b5f6153ca6018836143a4565b91506153d582615396565b602082019050919050565b5f6020820190508181035f8301526153f7816153be565b9050919050565b7f636f6465313032303200000000000000000000000000000000000000000000005f82015250565b5f6154326009836143a4565b915061543d826153fe565b602082019050919050565b5f6020820190508181035f83015261545f81615426565b9050919050565b5f61547082614289565b915061547b83614289565b925082820390508181111561549357615492615230565b5b92915050565b7f4e6f7420656e6f75676820746f6b656e73206c65667420746f206d696e7420215f8201527f2121200000000000000000000000000000000000000000000000000000000000602082015250565b5f6154f36023836143a4565b91506154fe82615499565b604082019050919050565b5f6020820190508181035f830152615520816154e7565b9050919050565b5f61553182614289565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361556357615562615230565b5b600182019050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f819050919050565b5f67ffffffffffffffff82169050919050565b5f6155d16155cc6155c78461559b565b614f3d565b6155a4565b9050919050565b6155e1816155b7565b82525050565b5f6020820190506155fa5f8301846155d8565b92915050565b5f8160601b9050919050565b5f61561682615600565b9050919050565b5f6156278261560c565b9050919050565b61563f61563a82614449565b61561d565b82525050565b5f615650828461562e565b60148201915081905092915050565b7f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e005f82015250565b5f615693601f836143a4565b915061569e8261565f565b602082019050919050565b5f6020820190508181035f8301526156c081615687565b9050919050565b5f81546156d381614d88565b6156dd8186614db8565b9450600182165f81146156f7576001811461570c5761573e565b60ff198316865281151582028601935061573e565b61571585614ebf565b5f5b8381101561573657815481890152600182019150602081019050615717565b838801955050505b50505092915050565b5f61575282876156c7565b915061575e82866156c7565b915061576a8285614e0c565b915061577682846156c7565b915081905095945050505050565b5f61578f8287614e0c565b915061579b82866156c7565b91506157a78285614e0c565b91506157b382846156c7565b915081905095945050505050565b7f5075626c6963206d696e7420726f756e6420686173206e6f74207965742073745f8201527f6172746564202121212000000000000000000000000000000000000000000000602082015250565b5f61581b602a836143a4565b9150615826826157c1565b604082019050919050565b5f6020820190508181035f8301526158488161580f565b9050919050565b7f526563697069656e74206973206f776e657220212121200000000000000000005f82015250565b5f6158836017836143a4565b915061588e8261584f565b602082019050919050565b5f6020820190508181035f8301526158b081615877565b9050919050565b7f4f7574206f6620737570706c79202121212000000000000000000000000000005f82015250565b5f6158eb6012836143a4565b91506158f6826158b7565b602082019050919050565b5f6020820190508181035f830152615918816158df565b9050919050565b7f50726963652069732000000000000000000000000000000000000000000000005f82015250565b5f615953600983614db8565b915061595e8261591f565b600982019050919050565b7f20576569000000000000000000000000000000000000000000000000000000005f82015250565b5f61599d600483614db8565b91506159a882615969565b600482019050919050565b5f6159bd82615947565b91506159c98284614e0c565b91506159d482615991565b915081905092915050565b5f6159f96159f46159ef8461477d565b614f3d565b614289565b9050919050565b615a09816159df565b82525050565b5f606082019050615a225f830186614755565b615a2f6020830185615a00565b615a3c6040830184614755565b949350505050565b5f604082019050615a575f830185614755565b615a64602083018461445a565b9392505050565b5f81519050615a79816149c7565b92915050565b5f60208284031215615a9457615a93614281565b5b5f615aa184828501615a6b565b91505092915050565b5f604082019050615abd5f830185615a00565b615aca6020830184614755565b9392505050565b5f81519050919050565b5f82825260208201905092915050565b5f615af582615ad1565b615aff8185615adb565b9350615b0f8185602086016143b4565b615b18816143c2565b840191505092915050565b5f608082019050615b365f83018761445a565b615b43602083018661445a565b615b506040830185614755565b8181036060830152615b628184615aeb565b905095945050505050565b5f81519050615b7b81614312565b92915050565b5f60208284031215615b9657615b95614281565b5b5f615ba384828501615b6d565b91505092915050565b5f81905092915050565b5f615bc082615ad1565b615bca8185615bac565b9350615bda8185602086016143b4565b80840191505092915050565b5f615bf18284615bb6565b91508190509291505056fe697066733a2f2f516d614b3133324c3962456a6d7a384b4d7878715874454641314e7a4b4e5659363973736d72556a79616f6f587a2fa2646970667358221220cf63c4be24f75fc901b65581b38a955fa258d05ae8ed3e580d6e5d881802271164736f6c63430008190033
Deployed Bytecode Sourcemap
112089:9663:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;114084:148;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;121096:225;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;89087:149;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;90375:158;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;90194:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;114556:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;115138:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;91102:588;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;116359:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;117458:455;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;121568:181;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77698:491;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;116484:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;91761:134;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;117921:377;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;109437:217;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;119995:236;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;108970:136;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;115607:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;112628:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;112322:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;88900:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;114872:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;116271:80;;;;;;;;;;;;;:::i;:::-;;88567:271;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85210:103;;;;;;;;;;;;;:::i;:::-;;116627:823;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;115498:101;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;120374:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;113229:773;;;;;;;;;;;;;:::i;:::-;;84475:147;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;116174:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;119241:419;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;89305:153;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;120239:127;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;112699:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;115714:115;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;121401:159;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;90605:146;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;107038:58;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;91966:211;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;120554:534;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;112284:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;115276:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;115837:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;90822:213;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85468:220;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;115006:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;112730:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;114240:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;114084:148;84361:13;:11;:13::i;:::-;114172:1:::1;114162:6;:11;;114154:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;114218:6;114212:3;:12;;;;114084:148:::0;:::o;121096:225::-;121248:4;121277:36;121301:11;121277:23;:36::i;:::-;121270:43;;121096:225;;;:::o;89087:149::-;89132:13;89158:23;89184:19;:17;:19::i;:::-;89158:45;;89221:1;:7;;89214:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;89087:149;:::o;90375:158::-;90442:7;90462:22;90476:7;90462:13;:22::i;:::-;;90504:21;90517:7;90504:12;:21::i;:::-;90497:28;;90375:158;;;:::o;90194:115::-;90266:35;90275:2;90279:7;90288:12;:10;:12::i;:::-;90266:8;:35::i;:::-;90194:115;;:::o;114556:308::-;84361:13;:11;:13::i;:::-;114667:16:::1;;114647;;:36;;114746:17;:6;:15;:17::i;:::-;114790:27;:16;;:25;:27::i;:::-;114692:126;;;;;;;;;:::i;:::-;;;;;;;;;;;;;114639:181;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;114850:6;114831:16;:25;;;;114556:308:::0;:::o;115138:130::-;84361:13;:11;:13::i;:::-;115247::::1;115233:11;:27;;;;;;:::i;:::-;;115138:130:::0;:::o;91102:588::-;91211:1;91197:16;;:2;:16;;;91193:89;;91267:1;91237:33;;;;;;;;;;;:::i;:::-;;;;;;;;91193:89;91503:21;91527:34;91535:2;91539:7;91548:12;:10;:12::i;:::-;91527:7;:34::i;:::-;91503:58;;91593:4;91576:21;;:13;:21;;;91572:111;;91642:4;91648:7;91657:13;91621:50;;;;;;;;;;;;;:::i;:::-;;;;;;;;91572:111;91182:508;91102:588;;;:::o;116359:117::-;84361:13;:11;:13::i;:::-;116457:11:::1;116444:10;:24;;;;;;:::i;:::-;;116359:117:::0;:::o;117458:455::-;117551:7;117571:25;117607:10;117571:47;;117637:46;117652:10;117664:12;;117678:4;117637:14;:46::i;:::-;117629:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;117736:16;;117716:17;;:36;117708:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;117796:17;117816:27;117830:9;117841:1;117816:13;:27::i;:::-;117796:47;;117875:1;117854:17;;:22;;;;;;;:::i;:::-;;;;;;;;117896:9;117889:16;;;;117458:455;;;;:::o;121568:181::-;84361:13;:11;:13::i;:::-;121692:49:::1;121709:7;121718:8;121728:12;121692:16;:49::i;:::-;121568:181:::0;;;:::o;77698:491::-;77784:7;77793;77813:24;77840:20;:18;:20::i;:::-;77813:47;;77871:26;77900:1;:19;;:28;77920:7;77900:28;;;;;;;;;;;77871:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77973:1;77945:30;;:7;:16;;;:30;;;77941:94;;78002:1;:21;;77992:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77941:94;78047:21;78111:17;:15;:17::i;:::-;78071:57;;78084:7;:23;;;78072:35;;:9;:35;;;;:::i;:::-;78071:57;;;;:::i;:::-;78047:81;;78149:7;:16;;;78167:13;78141:40;;;;;;;77698:491;;;;;:::o;116484:135::-;84361:13;:11;:13::i;:::-;116597:14:::1;116579:15;:32;;;;;;:::i;:::-;;116484:135:::0;:::o;91761:134::-;91848:39;91865:4;91871:2;91875:7;91848:39;;;;;;;;;;;;:16;:39::i;:::-;91761:134;;;:::o;117921:377::-;118017:7;118037:25;118073:10;118037:47;;118103:46;118118:9;118129:12;;118143:5;118103:14;:46::i;:::-;118095:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;118212:17;118232:29;118246:9;118257:3;;118232:13;:29::i;:::-;118212:49;;118281:9;118274:16;;;;117921:377;;;;:::o;109437:217::-;107892:13;:11;:13::i;:::-;109553:36:::1;109571:17;109553;:36::i;:::-;109600:46;109622:17;109641:4;109600:21;:46::i;:::-;109437:217:::0;;:::o;119995:236::-;84361:13;:11;:13::i;:::-;120098:1:::1;120084:16;;:2;:16;;::::0;120076:57:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;120144:15;120162:21;120144:39;;120202:2;120194:20;;:29;120215:7;120194:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;120065:166;119995:236:::0;:::o;108970:136::-;109039:7;108172:20;:18;:20::i;:::-;57821:66:::1;109066:32;;109059:39;;108970:136:::0;:::o;115607:99::-;115665:4;115689:9;;;;;;;;;;;115682:16;;115607:99;:::o;112628:25::-;;;;;;;;;;;;;:::o;112322:31::-;;;;:::o;88900:120::-;88963:7;88990:22;89004:7;88990:13;:22::i;:::-;88983:29;;88900:120;;;:::o;114872:126::-;84361:13;:11;:13::i;:::-;114982:8:::1;114958:21;:32;;;;114872:126:::0;:::o;116271:80::-;84361:13;:11;:13::i;:::-;116339:4:::1;116327:9;;:16;;;;;;;;;;;;;;;;;;116271:80::o:0;88567:271::-;88630:7;88650:23;88676:19;:17;:19::i;:::-;88650:45;;88727:1;88710:19;;:5;:19;;;88706:89;;88780:1;88753:30;;;;;;;;;;;:::i;:::-;;;;;;;;88706:89;88812:1;:11;;:18;88824:5;88812:18;;;;;;;;;;;;;;;;88805:25;;;88567:271;;;:::o;85210:103::-;84361:13;:11;:13::i;:::-;85275:30:::1;85302:1;85275:18;:30::i;:::-;85210:103::o:0;116627:823::-;116719:16;84361:13;:11;:13::i;:::-;116777:1:::1;116756:23;;:9;:23;;::::0;116748:60:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;116860:4;116827:37;;:18;:29;116846:9;116827:29;;;;;;;;;;;;;;;;;;;;;;;;;:37;;::::0;116819:60:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;116925:16;;116918:3;116914:1;116898:13;;:17;;;;:::i;:::-;:23;;;;:::i;:::-;:43;;116890:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;116994:27;117038:3;117024:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;116994:48;;117103:3;117089:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;117053:22;:33;117076:9;117053:33;;;;;;;;;;;;;;;:54;;;;;;;;;;;;:::i;:::-;;117123:6;117118:238;117139:3;117135:1;:7;117118:238;;;117164:17;117184:13;;:15;;;;;;;;;:::i;:::-;;;;;117164:35;;117214:27;117220:9;117231;117214:5;:27::i;:::-;117272:9;117256:10;117267:1;117256:13;;;;;;;;:::i;:::-;;;;;;;:25;;;::::0;::::1;117335:9;117296:22;:33;117319:9;117296:33;;;;;;;;;;;;;;;117330:1;117296:36;;;;;;;;:::i;:::-;;;;;;;;;:48;;;;117149:207;117144:3;;;;;;;117118:238;;;;117400:4;117368:18;:29;117387:9;117368:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;117432:10;117425:17;;;116627:823:::0;;;;:::o;115498:101::-;115561:7;115588:3;;115581:10;;115498:101;:::o;120374:172::-;120471:16;84361:13;:11;:13::i;:::-;120507:22:::1;:31;120530:7;120507:31;;;;;;;;;;;;;;;120500:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;120374:172:::0;;;:::o;113229:773::-;68623:30;68656:26;:24;:26::i;:::-;68623:59;;68747:19;68770:1;:15;;;;;;;;;;;;68769:16;68747:38;;68796:18;68817:1;:14;;;;;;;;;;;;68796:35;;69182:17;69217:1;69202:11;:16;;;:34;;;;;69222:14;69202:34;69182:54;;69247:17;69282:1;69267:11;:16;;;:50;;;;;69316:1;69295:4;69287:25;;;:30;69267:50;69247:70;;69335:12;69334:13;:30;;;;;69352:12;69351:13;69334:30;69330:93;;;69388:23;;;;;;;;;;;;;;69330:93;69450:1;69433;:14;;;:18;;;;;;;;;;;;;;;;;;69466:14;69462:69;;;69515:4;69497:1;:15;;;:22;;;;;;;;;;;;;;;;;;69462:69;113281:28:::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;::::0;:13:::1;:28::i;:::-;113320:26;113335:10;113320:14;:26::i;:::-;113357:24;:22;:24::i;:::-;113400:9;113394:3;:15;;;;113450:3;113431:16;:22;;;;113483:2;113464:16;:21;;;;113522:66;113498:90;;:21;:90;;;;113622:66;113599:89;;:20;:89;;;;113717:1;113701:13;:17;;;;113749:1;113729:17;:21;;;;113761:74;;;;;;;;;;;;;;;;;:15;:74;;;;;;:::i;:::-;;113848:25;;;;;;;;;;;;;;;;::::0;:12:::1;:25;;;;;;:::i;:::-;;113884:21;;;;;;;;;;;;;;;;::::0;:11:::1;:21;;;;;;:::i;:::-;;113916:24;;;;;;;;;;;;;;;;::::0;:14:::1;:24;;;;;;:::i;:::-;;113962:4;113953:6;;:13;;;;;;;;;;;;;;;;;;113989:5;113977:9;;:17;;;;;;;;;;;;;;;;;;69557:14:::0;69553:104;;;69606:5;69588:1;:15;;;:23;;;;;;;;;;;;;;;;;;69631:14;69643:1;69631:14;;;;;;:::i;:::-;;;;;;;;69553:104;68555:1109;;;;;113229:773::o;84475:147::-;84521:7;84541:24;84568:20;:18;:20::i;:::-;84541:47;;84606:1;:8;;;;;;;;;;;;84599:15;;;84475:147;:::o;116174:89::-;84361:13;:11;:13::i;:::-;116249:6:::1;116240;;:15;;;;;;;;;;;;;;;;;;116174:89:::0;:::o;119241:419::-;119369:4;119386:12;119428:9;119411:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;119401:38;;;;;;119386:53;;119465:4;119453:16;;:8;:16;;;119450:125;;119502:61;119521:12;;119502:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;119535:21;;119558:4;119502:18;:61::i;:::-;119495:68;;;;;119450:125;119592:60;119611:12;;119592:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;119625:20;;119647:4;119592:18;:60::i;:::-;119585:67;;;119241:419;;;;;;;:::o;89305:153::-;89352:13;89378:23;89404:19;:17;:19::i;:::-;89378:45;;89441:1;:9;;89434:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;89305:153;:::o;120239:127::-;120314:7;84361:13;:11;:13::i;:::-;120357:1:::1;120341:13;;:17;;;;:::i;:::-;120334:24;;120239:127:::0;:::o;112699:24::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;115714:115::-;115773:7;115800:21;;115793:28;;115714:115;:::o;121401:159::-;84361:13;:11;:13::i;:::-;121510:42:::1;121529:8;121539:12;121510:18;:42::i;:::-;121401:159:::0;;:::o;90605:146::-;90691:52;90710:12;:10;:12::i;:::-;90724:8;90734;90691:18;:52::i;:::-;90605:146;;:::o;107038:58::-;;;;;;;;;;;;;;;;;;;:::o;91966:211::-;92080:31;92093:4;92099:2;92103:7;92080:12;:31::i;:::-;92122:47;92145:4;92151:2;92155:7;92164:4;92122:22;:47::i;:::-;91966:211;;;;:::o;120554:534::-;120671:13;120753:1;120724:31;;:17;120733:7;120724:8;:17::i;:::-;:31;;;120702:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;120844:5;120831:18;;:9;;;;;;;;;;;:18;;;120827:149;;120897:15;120914:12;120928:18;:7;:16;:18::i;:::-;120948:14;120880:83;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;120866:98;;;;120827:149;121019:10;:8;:10::i;:::-;121031:11;121044:18;:7;:16;:18::i;:::-;121064:14;121002:77;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;120988:92;;120554:534;;;;:::o;112284:31::-;;;;:::o;115276:142::-;84361:13;:11;:13::i;:::-;115394:16:::1;115377:14;:33;;;;;;:::i;:::-;;115276:142:::0;:::o;115837:113::-;115895:7;115922:20;;115915:27;;115837:113;:::o;90822:213::-;90910:4;90927:23;90953:19;:17;:19::i;:::-;90927:45;;90990:1;:20;;:27;91011:5;90990:27;;;;;;;;;;;;;;;:37;91018:8;90990:37;;;;;;;;;;;;;;;;;;;;;;;;;90983:44;;;90822:213;;;;:::o;85468:220::-;84361:13;:11;:13::i;:::-;85573:1:::1;85553:22;;:8;:22;;::::0;85549:93:::1;;85627:1;85599:31;;;;;;;;;;;:::i;:::-;;;;;;;;85549:93;85652:28;85671:8;85652:18;:28::i;:::-;85468:220:::0;:::o;115006:124::-;84361:13;:11;:13::i;:::-;115114:8:::1;115091:20;:31;;;;115006:124:::0;:::o;112730:29::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;114240:308::-;84361:13;:11;:13::i;:::-;114351:16:::1;;114331;;:36;;114430:27;:16;;:25;:27::i;:::-;114484:17;:6;:15;:17::i;:::-;114376:126;;;;;;;;;:::i;:::-;;;;;;;;;;;;;114323:181;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;114534:6;114515:16;:25;;;;114240:308:::0;:::o;84700:166::-;84771:12;:10;:12::i;:::-;84760:23;;:7;:5;:7::i;:::-;:23;;;84756:103;;84834:12;:10;:12::i;:::-;84807:40;;;;;;;;;;;:::i;:::-;;;;;;;;84756:103;84700:166::o;77417:226::-;77530:4;77569:26;77554:41;;;:11;:41;;;;:81;;;;77599:36;77623:11;77599:23;:36::i;:::-;77554:81;77547:88;;77417:226;;;:::o;87449:160::-;87500:23;87570:21;87560:31;;87449:160;:::o;103760:247::-;103823:7;103843:13;103859:17;103868:7;103859:8;:17::i;:::-;103843:33;;103908:1;103891:19;;:5;:19;;;103887:90;;103957:7;103934:31;;;;;;;;;;;:::i;:::-;;;;;;;;103887:90;103994:5;103987:12;;;103760:247;;;:::o;92997:187::-;93067:7;93087:23;93113:19;:17;:19::i;:::-;93087:45;;93150:1;:17;;:26;93168:7;93150:26;;;;;;;;;;;;;;;;;;;;;93143:33;;;92997:187;;;:::o;81726:98::-;81779:7;81806:10;81799:17;;81726:98;:::o;101876:122::-;101957:33;101966:2;101970:7;101979:4;101985;101957:8;:33::i;:::-;101876:122;;;:::o;34259:718::-;34315:13;34366:14;34403:1;34383:17;34394:5;34383:10;:17::i;:::-;:21;34366:38;;34419:20;34453:6;34442:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34419:41;;34475:11;34604:6;34600:2;34596:15;34588:6;34584:28;34577:35;;34641:290;34648:4;34641:290;;;34673:5;;;;;;;;34815:10;34810:2;34803:5;34799:14;34794:32;34789:3;34781:46;34873:2;34864:11;;;;;;:::i;:::-;;;;;34907:1;34898:5;:10;34641:290;34894:21;34641:290;34952:6;34945:13;;;;;34259:718;;;:::o;96075:886::-;96161:7;96181:23;96207:19;:17;:19::i;:::-;96181:45;;96237:12;96252:17;96261:7;96252:8;:17::i;:::-;96237:32;;96348:1;96332:18;;:4;:18;;;96328:88;;96367:37;96384:4;96390;96396:7;96367:16;:37::i;:::-;96328:88;96479:1;96463:18;;:4;:18;;;96459:265;;96581:48;96598:1;96602:7;96619:1;96623:5;96581:8;:48::i;:::-;96696:1;96675;:11;;:17;96687:4;96675:17;;;;;;;;;;;;;;;;:22;;;;;;;;;;;96459:265;96754:1;96740:16;;:2;:16;;;96736:113;;96821:1;96802;:11;;:15;96814:2;96802:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;96736:113;96882:2;96861:1;:9;;:18;96871:7;96861:18;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;96921:7;96917:2;96902:27;;96911:4;96902:27;;;;;;;;;;;;96949:4;96942:11;;;;96075:886;;;;;:::o;118306:855::-;118401:7;118444:5;118434:15;;:6;;;;;;;;;;;:15;;;118426:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;118536:1;118515:23;;:9;:23;;;118507:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;118599:7;:5;:7::i;:::-;118586:20;;:9;:20;;;118578:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;118687:4;118654:37;;:18;:29;118673:9;118654:29;;;;;;;;;;;;;;;;;;;;;;;;;:37;;;118646:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;118775:16;;118758:13;;:33;;118750:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;118846:7;118833:9;:20;118892:14;:3;;:12;:14::i;:::-;118862:53;;;;;;;;:::i;:::-;;;;;;;;;;;;;118825:92;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;118930:17;118950:13;;:15;;;;;;;;;:::i;:::-;;;;;118930:35;;119008:4;118976:18;:29;118995:9;118976:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;119023:22;:33;119046:9;119023:33;;;;;;;;;;;;;;;119062:9;119023:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;119093:31;119103:9;119114;119093;:31::i;:::-;119144:9;119137:16;;;118306:855;;;;:::o;79928:614::-;80038:24;80065:20;:18;:20::i;:::-;80038:47;;80096:19;80118:17;:15;:17::i;:::-;80096:39;;;;80165:11;80150:12;:26;;;80146:183;;;80282:7;80291:12;80305:11;80255:62;;;;;;;;;;;;;:::i;:::-;;;;;;;;80146:183;80363:1;80343:22;;:8;:22;;;80339:117;;80424:7;80441:1;80389:55;;;;;;;;;;;;:::i;:::-;;;;;;;;80339:117;80499:35;;;;;;;;80511:8;80499:35;;;;;;80521:12;80499:35;;;;;80468:1;:19;;:28;80488:7;80468:28;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80027:515;;79928:614;;;:::o;76328:163::-;76380:24;76451:22;76441:32;;76328:163;:::o;78471:97::-;78529:6;78555:5;78548:12;;78471:97;:::o;109888:319::-;109979:6;109962:23;;109970:4;109962:23;;;:121;;;;110077:6;110041:42;;:32;:30;:32::i;:::-;:42;;;;109962:121;109944:256;;;110159:29;;;;;;;;;;;;;;109944:256;109888:319::o;113105:116::-;84361:13;:11;:13::i;:::-;113105:116;:::o;111381:548::-;111499:17;111481:50;;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;111477:445;;111892:17;111850:60;;;;;;;;;;;:::i;:::-;;;;;;;;111477:445;57821:66;111584:32;;111576:4;:40;111572:122;;111673:4;111644:34;;;;;;;;;;;:::i;:::-;;;;;;;;111572:122;111708:54;111738:17;111757:4;111708:29;:54::i;:::-;111534:240;111381:548;;:::o;110330:218::-;110414:6;110397:23;;110405:4;110397:23;;;110393:148;;110500:29;;;;;;;;;;;;;;110393:148;110330:218::o;85848:253::-;85922:24;85949:20;:18;:20::i;:::-;85922:47;;85980:16;85999:1;:8;;;;;;;;;;;;85980:27;;86029:8;86018:1;:8;;;:19;;;;;;;;;;;;;;;;;;86084:8;86053:40;;86074:8;86053:40;;;;;;;;;;;;85911:190;;85848:253;:::o;97297:335::-;97379:1;97365:16;;:2;:16;;;97361:89;;97435:1;97405:33;;;;;;;;;;;:::i;:::-;;;;;;;;97361:89;97460:21;97484:32;97492:2;97496:7;97513:1;97484:7;:32::i;:::-;97460:56;;97556:1;97531:27;;:13;:27;;;97527:98;;97610:1;97582:31;;;;;;;;;;;:::i;:::-;;;;;;;;97527:98;97350:282;97297:335;;:::o;73319:174::-;73377:30;73454:21;73444:31;;73319:174;:::o;87733:151::-;71461:20;:18;:20::i;:::-;87837:39:::1;87861:5;87868:7;87837:23;:39::i;:::-;87733:151:::0;;:::o;83859:129::-;71461:20;:18;:20::i;:::-;83942:38:::1;83967:12;83942:24;:38::i;:::-;83859:129:::0;:::o;108220:68::-;71461:20;:18;:20::i;:::-;108220:68::o;83183:163::-;83235:24;83306:22;83296:32;;83183:163;:::o;1336:156::-;1427:4;1480;1451:25;1464:5;1471:4;1451:12;:25::i;:::-;:33;1444:40;;1336:156;;;;;:::o;78839:578::-;78934:24;78961:20;:18;:20::i;:::-;78934:47;;78992:19;79014:17;:15;:17::i;:::-;78992:39;;;;79061:11;79046:12;:26;;;79042:176;;;79180:12;79194:11;79151:55;;;;;;;;;;;;:::i;:::-;;;;;;;;79042:176;79252:1;79232:22;;:8;:22;;;79228:110;;79323:1;79278:48;;;;;;;;;;;:::i;:::-;;;;;;;;79228:110;79374:35;;;;;;;;79386:8;79374:35;;;;;;79396:12;79374:35;;;;;79350:1;:21;;:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78923:494;;78839:578;;:::o;103141:376::-;103245:23;103271:19;:17;:19::i;:::-;103245:45;;103325:1;103305:22;;:8;:22;;;103301:93;;103373:8;103351:31;;;;;;;;;;;:::i;:::-;;;;;;;;103301:93;103444:8;103404:1;:20;;:27;103425:5;103404:27;;;;;;;;;;;;;;;:37;103432:8;103404:37;;;;;;;;;;;;;;;;:48;;;;;;;;;;;;;;;;;;103490:8;103468:41;;103483:5;103468:41;;;103500:8;103468:41;;;;;;:::i;:::-;;;;;;;;103234:283;103141:376;;;:::o;104557:799::-;104691:1;104674:2;:14;;;:18;104670:679;;;104729:2;104713:36;;;104750:12;:10;:12::i;:::-;104764:4;104770:7;104779:4;104713:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;104709:629;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;105044:1;105027:6;:13;:18;105023:300;;105099:2;105077:25;;;;;;;;;;;:::i;:::-;;;;;;;;105023:300;105273:6;105267:13;105258:6;105254:2;105250:15;105243:38;104709:629;104842:41;;;104832:51;;;:6;:51;;;;104828:132;;104937:2;104915:25;;;;;;;;;;;:::i;:::-;;;;;;;;104828:132;104785:190;104670:679;104557:799;;;;:::o;92701:175::-;92767:7;92787:23;92813:19;:17;:19::i;:::-;92787:45;;92850:1;:9;;:18;92860:7;92850:18;;;;;;;;;;;;;;;;;;;;;92843:25;;;92701:175;;;:::o;116030:136::-;116115:13;116148:10;116141:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;116030:136;:::o;88187:316::-;88300:4;88352:25;88337:40;;;:11;:40;;;;:105;;;;88409:33;88394:48;;;:11;:48;;;;88337:105;:158;;;;88459:36;88483:11;88459:23;:36::i;:::-;88337:158;88317:178;;88187:316;;;:::o;102186:736::-;102291:23;102317:19;:17;:19::i;:::-;102291:45;;102404:9;:31;;;;102433:1;102417:18;;:4;:18;;;;102404:31;102400:471;;;102452:13;102468:22;102482:7;102468:13;:22::i;:::-;102452:38;;102637:1;102621:18;;:4;:18;;;;:35;;;;;102652:4;102643:13;;:5;:13;;;;102621:35;:69;;;;;102661:29;102678:5;102685:4;102661:16;:29::i;:::-;102660:30;102621:69;102617:144;;;102740:4;102718:27;;;;;;;;;;;:::i;:::-;;;;;;;;102617:144;102781:9;102777:83;;;102836:7;102832:2;102816:28;;102825:5;102816:28;;;;;;;;;;;;102777:83;102437:434;102400:471;102912:2;102883:1;:17;;:26;102901:7;102883:26;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;102280:642;102186:736;;;;:::o;30663:948::-;30716:7;30736:14;30753:1;30736:18;;30803:8;30794:5;:17;30790:106;;30841:8;30832:17;;;;;;:::i;:::-;;;;;30878:2;30868:12;;;;30790:106;30923:8;30914:5;:17;30910:106;;30961:8;30952:17;;;;;;:::i;:::-;;;;;30998:2;30988:12;;;;30910:106;31043:8;31034:5;:17;31030:106;;31081:8;31072:17;;;;;;:::i;:::-;;;;;31118:2;31108:12;;;;31030:106;31163:7;31154:5;:16;31150:103;;31200:7;31191:16;;;;;;:::i;:::-;;;;;31236:1;31226:11;;;;31150:103;31280:7;31271:5;:16;31267:103;;31317:7;31308:16;;;;;;:::i;:::-;;;;;31353:1;31343:11;;;;31267:103;31397:7;31388:5;:16;31384:103;;31434:7;31425:16;;;;;;:::i;:::-;;;;;31470:1;31460:11;;;;31384:103;31514:7;31505:5;:16;31501:68;;31552:1;31542:11;;;;31501:68;31597:6;31590:13;;;30663:948;;;:::o;94224:376::-;94337:38;94351:5;94358:7;94367;94337:13;:38::i;:::-;94332:261;;94413:1;94396:19;;:5;:19;;;94392:190;;94466:7;94443:31;;;;;;;;;;;:::i;:::-;;;;;;;;94392:190;94549:7;94558;94522:44;;;;;;;;;;;;:::i;:::-;;;;;;;;94332:261;94224:376;;;:::o;97995:102::-;98063:26;98073:2;98077:7;98063:26;;;;;;;;;;;;:9;:26::i;:::-;97995:102;;:::o;58476:140::-;58528:7;58555:47;57821:66;58582:19;;58555:26;:47::i;:::-;:53;;;;;;;;;;;;58548:60;;58476:140;:::o;59319:344::-;59411:37;59430:17;59411:18;:37::i;:::-;59473:17;59464:27;;;;;;;;;;;;59522:1;59508:4;:11;:15;59504:152;;;59540:53;59569:17;59588:4;59540:28;:53::i;:::-;;59504:152;;;59626:18;:16;:18::i;:::-;59504:152;59319:344;;:::o;71621:145::-;71689:17;:15;:17::i;:::-;71684:75;;71730:17;;;;;;;;;;;;;;71684:75;71621:145::o;87892:223::-;71461:20;:18;:20::i;:::-;88006:23:::1;88032:19;:17;:19::i;:::-;88006:45;;88072:5;88062:1;:7;;:15;;;;;;:::i;:::-;;88100:7;88088:1;:9;;:19;;;;;;:::i;:::-;;87995:120;87892:223:::0;;:::o;83996:240::-;71461:20;:18;:20::i;:::-;84117:1:::1;84093:26;;:12;:26;;::::0;84089:97:::1;;84171:1;84143:31;;;;;;;;;;;:::i;:::-;;;;;;;;84089:97;84196:32;84215:12;84196:18;:32::i;:::-;83996:240:::0;:::o;2055:296::-;2138:7;2158:20;2181:4;2158:27;;2201:9;2196:118;2220:5;:12;2216:1;:16;2196:118;;;2269:33;2279:12;2293:5;2299:1;2293:8;;;;;;;;:::i;:::-;;;;;;;;2269:9;:33::i;:::-;2254:48;;2234:3;;;;;;;2196:118;;;;2331:12;2324:19;;;2055:296;;;;:::o;74474:148::-;74550:4;74589:25;74574:40;;;:11;:40;;;;74567:47;;74474:148;;;:::o;93504:276::-;93607:4;93663:1;93644:21;;:7;:21;;;;:128;;;;;93692:7;93683:16;;:5;:16;;;:52;;;;93703:32;93720:5;93727:7;93703:16;:32::i;:::-;93683:52;:88;;;;93764:7;93739:32;;:21;93752:7;93739:12;:21::i;:::-;:32;;;93683:88;93644:128;93624:148;;93504:276;;;;;:::o;98324:185::-;98419:18;98425:2;98429:7;98419:5;:18::i;:::-;98448:53;98479:1;98483:2;98487:7;98496:4;98448:22;:53::i;:::-;98324:185;;;:::o;47282:195::-;47343:21;47455:4;47445:14;;47282:195;;;:::o;58712:286::-;58823:1;58790:17;:29;;;:34;58786:121;;58877:17;58848:47;;;;;;;;;;;:::i;:::-;;;;;;;;58786:121;58973:17;58917:47;57821:66;58944:19;;58917:26;:47::i;:::-;:53;;;:73;;;;;;;;;;;;;;;;;;58712:286;:::o;53840:256::-;53923:12;53949;53963:23;53990:6;:19;;54010:4;53990:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53948:67;;;;54033:55;54060:6;54068:7;54077:10;54033:26;:55::i;:::-;54026:62;;;;53840:256;;;;:::o;63243:126::-;63306:1;63294:9;:13;63290:72;;;63331:19;;;;;;;;;;;;;;63290:72;63243:126::o;73061:122::-;73111:4;73135:26;:24;:26::i;:::-;:40;;;;;;;;;;;;73128:47;;73061:122;:::o;9485:149::-;9548:7;9579:1;9575;:5;:51;;9606:20;9621:1;9624;9606:14;:20::i;:::-;9575:51;;;9583:20;9598:1;9601;9583:14;:20::i;:::-;9575:51;9568:58;;9485:149;;;;:::o;54369:597::-;54517:12;54547:7;54542:417;;54571:19;54579:10;54571:7;:19::i;:::-;54542:417;;;54820:1;54799:10;:17;:22;:49;;;;;54847:1;54825:6;:18;;;:23;54799:49;54795:121;;;54893:6;54876:24;;;;;;;;;;;:::i;:::-;;;;;;;;54795:121;54937:10;54930:17;;;;54542:417;54369:597;;;;;;:::o;9759:268::-;9827:13;9934:1;9928:4;9921:15;9963:1;9957:4;9950:15;10004:4;9998;9988:21;9979:30;;9759:268;;;;:::o;55519:528::-;55672:1;55652:10;:17;:21;55648:392;;;55884:10;55878:17;55941:15;55928:10;55924:2;55920:19;55913:44;55648:392;56011:17;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::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:77;371:7;400:5;389:16;;334:77;;;:::o;417:122::-;490:24;508:5;490:24;:::i;:::-;483:5;480:35;470:63;;529:1;526;519:12;470:63;417:122;:::o;545:139::-;591:5;629:6;616:20;607:29;;645:33;672:5;645:33;:::i;:::-;545:139;;;;:::o;690:329::-;749:6;798:2;786:9;777:7;773:23;769:32;766:119;;;804:79;;:::i;:::-;766:119;924:1;949:53;994:7;985:6;974:9;970:22;949:53;:::i;:::-;939:63;;895:117;690:329;;;;:::o;1025:149::-;1061:7;1101:66;1094:5;1090:78;1079:89;;1025:149;;;:::o;1180:120::-;1252:23;1269:5;1252:23;:::i;:::-;1245:5;1242:34;1232:62;;1290:1;1287;1280:12;1232:62;1180:120;:::o;1306:137::-;1351:5;1389:6;1376:20;1367:29;;1405:32;1431:5;1405:32;:::i;:::-;1306:137;;;;:::o;1449:327::-;1507:6;1556:2;1544:9;1535:7;1531:23;1527:32;1524:119;;;1562:79;;:::i;:::-;1524:119;1682:1;1707:52;1751:7;1742:6;1731:9;1727:22;1707:52;:::i;:::-;1697:62;;1653:116;1449:327;;;;:::o;1782:90::-;1816:7;1859:5;1852:13;1845:21;1834:32;;1782:90;;;:::o;1878:109::-;1959:21;1974:5;1959:21;:::i;:::-;1954:3;1947:34;1878:109;;:::o;1993:210::-;2080:4;2118:2;2107:9;2103:18;2095:26;;2131:65;2193:1;2182:9;2178:17;2169:6;2131:65;:::i;:::-;1993:210;;;;:::o;2209:99::-;2261:6;2295:5;2289:12;2279:22;;2209:99;;;:::o;2314:169::-;2398:11;2432:6;2427:3;2420:19;2472:4;2467:3;2463:14;2448:29;;2314:169;;;;:::o;2489:139::-;2578:6;2573:3;2568;2562:23;2619:1;2610:6;2605:3;2601:16;2594:27;2489:139;;;:::o;2634:102::-;2675:6;2726:2;2722:7;2717:2;2710:5;2706:14;2702:28;2692:38;;2634:102;;;:::o;2742:377::-;2830:3;2858:39;2891:5;2858:39;:::i;:::-;2913:71;2977:6;2972:3;2913:71;:::i;:::-;2906:78;;2993:65;3051:6;3046:3;3039:4;3032:5;3028:16;2993:65;:::i;:::-;3083:29;3105:6;3083:29;:::i;:::-;3078:3;3074:39;3067:46;;2834:285;2742:377;;;;:::o;3125:313::-;3238:4;3276:2;3265:9;3261:18;3253:26;;3325:9;3319:4;3315:20;3311:1;3300:9;3296:17;3289:47;3353:78;3426:4;3417:6;3353:78;:::i;:::-;3345:86;;3125:313;;;;:::o;3444:126::-;3481:7;3521:42;3514:5;3510:54;3499:65;;3444:126;;;:::o;3576:96::-;3613:7;3642:24;3660:5;3642:24;:::i;:::-;3631:35;;3576:96;;;:::o;3678:118::-;3765:24;3783:5;3765:24;:::i;:::-;3760:3;3753:37;3678:118;;:::o;3802:222::-;3895:4;3933:2;3922:9;3918:18;3910:26;;3946:71;4014:1;4003:9;3999:17;3990:6;3946:71;:::i;:::-;3802:222;;;;:::o;4030:122::-;4103:24;4121:5;4103:24;:::i;:::-;4096:5;4093:35;4083:63;;4142:1;4139;4132:12;4083:63;4030:122;:::o;4158:139::-;4204:5;4242:6;4229:20;4220:29;;4258:33;4285:5;4258:33;:::i;:::-;4158:139;;;;:::o;4303:474::-;4371:6;4379;4428:2;4416:9;4407:7;4403:23;4399:32;4396:119;;;4434:79;;:::i;:::-;4396:119;4554:1;4579:53;4624:7;4615:6;4604:9;4600:22;4579:53;:::i;:::-;4569:63;;4525:117;4681:2;4707:53;4752:7;4743:6;4732:9;4728:22;4707:53;:::i;:::-;4697:63;;4652:118;4303:474;;;;;:::o;4783:117::-;4892:1;4889;4882:12;4906:117;5015:1;5012;5005:12;5029:180;5077:77;5074:1;5067:88;5174:4;5171:1;5164:15;5198:4;5195:1;5188:15;5215:281;5298:27;5320:4;5298:27;:::i;:::-;5290:6;5286:40;5428:6;5416:10;5413:22;5392:18;5380:10;5377:34;5374:62;5371:88;;;5439:18;;:::i;:::-;5371:88;5479:10;5475:2;5468:22;5258:238;5215:281;;:::o;5502:129::-;5536:6;5563:20;;:::i;:::-;5553:30;;5592:33;5620:4;5612:6;5592:33;:::i;:::-;5502:129;;;:::o;5637:308::-;5699:4;5789:18;5781:6;5778:30;5775:56;;;5811:18;;:::i;:::-;5775:56;5849:29;5871:6;5849:29;:::i;:::-;5841:37;;5933:4;5927;5923:15;5915:23;;5637:308;;;:::o;5951:148::-;6049:6;6044:3;6039;6026:30;6090:1;6081:6;6076:3;6072:16;6065:27;5951:148;;;:::o;6105:425::-;6183:5;6208:66;6224:49;6266:6;6224:49;:::i;:::-;6208:66;:::i;:::-;6199:75;;6297:6;6290:5;6283:21;6335:4;6328:5;6324:16;6373:3;6364:6;6359:3;6355:16;6352:25;6349:112;;;6380:79;;:::i;:::-;6349:112;6470:54;6517:6;6512:3;6507;6470:54;:::i;:::-;6189:341;6105:425;;;;;:::o;6550:340::-;6606:5;6655:3;6648:4;6640:6;6636:17;6632:27;6622:122;;6663:79;;:::i;:::-;6622:122;6780:6;6767:20;6805:79;6880:3;6872:6;6865:4;6857:6;6853:17;6805:79;:::i;:::-;6796:88;;6612:278;6550:340;;;;:::o;6896:509::-;6965:6;7014:2;7002:9;6993:7;6989:23;6985:32;6982:119;;;7020:79;;:::i;:::-;6982:119;7168:1;7157:9;7153:17;7140:31;7198:18;7190:6;7187:30;7184:117;;;7220:79;;:::i;:::-;7184:117;7325:63;7380:7;7371:6;7360:9;7356:22;7325:63;:::i;:::-;7315:73;;7111:287;6896:509;;;;:::o;7411:619::-;7488:6;7496;7504;7553:2;7541:9;7532:7;7528:23;7524:32;7521:119;;;7559:79;;:::i;:::-;7521:119;7679:1;7704:53;7749:7;7740:6;7729:9;7725:22;7704:53;:::i;:::-;7694:63;;7650:117;7806:2;7832:53;7877:7;7868:6;7857:9;7853:22;7832:53;:::i;:::-;7822:63;;7777:118;7934:2;7960:53;8005:7;7996:6;7985:9;7981:22;7960:53;:::i;:::-;7950:63;;7905:118;7411:619;;;;;:::o;8036:117::-;8145:1;8142;8135:12;8159:117;8268:1;8265;8258:12;8299:568;8372:8;8382:6;8432:3;8425:4;8417:6;8413:17;8409:27;8399:122;;8440:79;;:::i;:::-;8399:122;8553:6;8540:20;8530:30;;8583:18;8575:6;8572:30;8569:117;;;8605:79;;:::i;:::-;8569:117;8719:4;8711:6;8707:17;8695:29;;8773:3;8765:4;8757:6;8753:17;8743:8;8739:32;8736:41;8733:128;;;8780:79;;:::i;:::-;8733:128;8299:568;;;;;:::o;8873:559::-;8959:6;8967;9016:2;9004:9;8995:7;8991:23;8987:32;8984:119;;;9022:79;;:::i;:::-;8984:119;9170:1;9159:9;9155:17;9142:31;9200:18;9192:6;9189:30;9186:117;;;9222:79;;:::i;:::-;9186:117;9335:80;9407:7;9398:6;9387:9;9383:22;9335:80;:::i;:::-;9317:98;;;;9113:312;8873:559;;;;;:::o;9438:118::-;9525:24;9543:5;9525:24;:::i;:::-;9520:3;9513:37;9438:118;;:::o;9562:222::-;9655:4;9693:2;9682:9;9678:18;9670:26;;9706:71;9774:1;9763:9;9759:17;9750:6;9706:71;:::i;:::-;9562:222;;;;:::o;9790:109::-;9826:7;9866:26;9859:5;9855:38;9844:49;;9790:109;;;:::o;9905:120::-;9977:23;9994:5;9977:23;:::i;:::-;9970:5;9967:34;9957:62;;10015:1;10012;10005:12;9957:62;9905:120;:::o;10031:137::-;10076:5;10114:6;10101:20;10092:29;;10130:32;10156:5;10130:32;:::i;:::-;10031:137;;;;:::o;10174:617::-;10250:6;10258;10266;10315:2;10303:9;10294:7;10290:23;10286:32;10283:119;;;10321:79;;:::i;:::-;10283:119;10441:1;10466:53;10511:7;10502:6;10491:9;10487:22;10466:53;:::i;:::-;10456:63;;10412:117;10568:2;10594:53;10639:7;10630:6;10619:9;10615:22;10594:53;:::i;:::-;10584:63;;10539:118;10696:2;10722:52;10766:7;10757:6;10746:9;10742:22;10722:52;:::i;:::-;10712:62;;10667:117;10174:617;;;;;:::o;10797:474::-;10865:6;10873;10922:2;10910:9;10901:7;10897:23;10893:32;10890:119;;;10928:79;;:::i;:::-;10890:119;11048:1;11073:53;11118:7;11109:6;11098:9;11094:22;11073:53;:::i;:::-;11063:63;;11019:117;11175:2;11201:53;11246:7;11237:6;11226:9;11222:22;11201:53;:::i;:::-;11191:63;;11146:118;10797:474;;;;;:::o;11277:332::-;11398:4;11436:2;11425:9;11421:18;11413:26;;11449:71;11517:1;11506:9;11502:17;11493:6;11449:71;:::i;:::-;11530:72;11598:2;11587:9;11583:18;11574:6;11530:72;:::i;:::-;11277:332;;;;;:::o;11615:307::-;11676:4;11766:18;11758:6;11755:30;11752:56;;;11788:18;;:::i;:::-;11752:56;11826:29;11848:6;11826:29;:::i;:::-;11818:37;;11910:4;11904;11900:15;11892:23;;11615:307;;;:::o;11928:423::-;12005:5;12030:65;12046:48;12087:6;12046:48;:::i;:::-;12030:65;:::i;:::-;12021:74;;12118:6;12111:5;12104:21;12156:4;12149:5;12145:16;12194:3;12185:6;12180:3;12176:16;12173:25;12170:112;;;12201:79;;:::i;:::-;12170:112;12291:54;12338:6;12333:3;12328;12291:54;:::i;:::-;12011:340;11928:423;;;;;:::o;12370:338::-;12425:5;12474:3;12467:4;12459:6;12455:17;12451:27;12441:122;;12482:79;;:::i;:::-;12441:122;12599:6;12586:20;12624:78;12698:3;12690:6;12683:4;12675:6;12671:17;12624:78;:::i;:::-;12615:87;;12431:277;12370:338;;;;:::o;12714:652::-;12791:6;12799;12848:2;12836:9;12827:7;12823:23;12819:32;12816:119;;;12854:79;;:::i;:::-;12816:119;12974:1;12999:53;13044:7;13035:6;13024:9;13020:22;12999:53;:::i;:::-;12989:63;;12945:117;13129:2;13118:9;13114:18;13101:32;13160:18;13152:6;13149:30;13146:117;;;13182:79;;:::i;:::-;13146:117;13287:62;13341:7;13332:6;13321:9;13317:22;13287:62;:::i;:::-;13277:72;;13072:287;12714:652;;;;;:::o;13372:329::-;13431:6;13480:2;13468:9;13459:7;13455:23;13451:32;13448:119;;;13486:79;;:::i;:::-;13448:119;13606:1;13631:53;13676:7;13667:6;13656:9;13652:22;13631:53;:::i;:::-;13621:63;;13577:117;13372:329;;;;:::o;13707:77::-;13744:7;13773:5;13762:16;;13707:77;;;:::o;13790:118::-;13877:24;13895:5;13877:24;:::i;:::-;13872:3;13865:37;13790:118;;:::o;13914:222::-;14007:4;14045:2;14034:9;14030:18;14022:26;;14058:71;14126:1;14115:9;14111:17;14102:6;14058:71;:::i;:::-;13914:222;;;;:::o;14142:122::-;14215:24;14233:5;14215:24;:::i;:::-;14208:5;14205:35;14195:63;;14254:1;14251;14244:12;14195:63;14142:122;:::o;14270:139::-;14316:5;14354:6;14341:20;14332:29;;14370:33;14397:5;14370:33;:::i;:::-;14270:139;;;;:::o;14415:329::-;14474:6;14523:2;14511:9;14502:7;14498:23;14494:32;14491:119;;;14529:79;;:::i;:::-;14491:119;14649:1;14674:53;14719:7;14710:6;14699:9;14695:22;14674:53;:::i;:::-;14664:63;;14620:117;14415:329;;;;:::o;14750:114::-;14817:6;14851:5;14845:12;14835:22;;14750:114;;;:::o;14870:184::-;14969:11;15003:6;14998:3;14991:19;15043:4;15038:3;15034:14;15019:29;;14870:184;;;;:::o;15060:132::-;15127:4;15150:3;15142:11;;15180:4;15175:3;15171:14;15163:22;;15060:132;;;:::o;15198:108::-;15275:24;15293:5;15275:24;:::i;:::-;15270:3;15263:37;15198:108;;:::o;15312:179::-;15381:10;15402:46;15444:3;15436:6;15402:46;:::i;:::-;15480:4;15475:3;15471:14;15457:28;;15312:179;;;;:::o;15497:113::-;15567:4;15599;15594:3;15590:14;15582:22;;15497:113;;;:::o;15646:732::-;15765:3;15794:54;15842:5;15794:54;:::i;:::-;15864:86;15943:6;15938:3;15864:86;:::i;:::-;15857:93;;15974:56;16024:5;15974:56;:::i;:::-;16053:7;16084:1;16069:284;16094:6;16091:1;16088:13;16069:284;;;16170:6;16164:13;16197:63;16256:3;16241:13;16197:63;:::i;:::-;16190:70;;16283:60;16336:6;16283:60;:::i;:::-;16273:70;;16129:224;16116:1;16113;16109:9;16104:14;;16069:284;;;16073:14;16369:3;16362:10;;15770:608;;;15646:732;;;;:::o;16384:373::-;16527:4;16565:2;16554:9;16550:18;16542:26;;16614:9;16608:4;16604:20;16600:1;16589:9;16585:17;16578:47;16642:108;16745:4;16736:6;16642:108;:::i;:::-;16634:116;;16384:373;;;;:::o;16763:116::-;16833:21;16848:5;16833:21;:::i;:::-;16826:5;16823:32;16813:60;;16869:1;16866;16859:12;16813:60;16763:116;:::o;16885:133::-;16928:5;16966:6;16953:20;16944:29;;16982:30;17006:5;16982:30;:::i;:::-;16885:133;;;;:::o;17024:323::-;17080:6;17129:2;17117:9;17108:7;17104:23;17100:32;17097:119;;;17135:79;;:::i;:::-;17097:119;17255:1;17280:50;17322:7;17313:6;17302:9;17298:22;17280:50;:::i;:::-;17270:60;;17226:114;17024:323;;;;:::o;17353:843::-;17454:6;17462;17470;17478;17527:2;17515:9;17506:7;17502:23;17498:32;17495:119;;;17533:79;;:::i;:::-;17495:119;17653:1;17678:53;17723:7;17714:6;17703:9;17699:22;17678:53;:::i;:::-;17668:63;;17624:117;17808:2;17797:9;17793:18;17780:32;17839:18;17831:6;17828:30;17825:117;;;17861:79;;:::i;:::-;17825:117;17974:80;18046:7;18037:6;18026:9;18022:22;17974:80;:::i;:::-;17956:98;;;;17751:313;18103:2;18129:50;18171:7;18162:6;18151:9;18147:22;18129:50;:::i;:::-;18119:60;;18074:115;17353:843;;;;;;;:::o;18202:472::-;18269:6;18277;18326:2;18314:9;18305:7;18301:23;18297:32;18294:119;;;18332:79;;:::i;:::-;18294:119;18452:1;18477:53;18522:7;18513:6;18502:9;18498:22;18477:53;:::i;:::-;18467:63;;18423:117;18579:2;18605:52;18649:7;18640:6;18629:9;18625:22;18605:52;:::i;:::-;18595:62;;18550:117;18202:472;;;;;:::o;18680:468::-;18745:6;18753;18802:2;18790:9;18781:7;18777:23;18773:32;18770:119;;;18808:79;;:::i;:::-;18770:119;18928:1;18953:53;18998:7;18989:6;18978:9;18974:22;18953:53;:::i;:::-;18943:63;;18899:117;19055:2;19081:50;19123:7;19114:6;19103:9;19099:22;19081:50;:::i;:::-;19071:60;;19026:115;18680:468;;;;;:::o;19154:943::-;19249:6;19257;19265;19273;19322:3;19310:9;19301:7;19297:23;19293:33;19290:120;;;19329:79;;:::i;:::-;19290:120;19449:1;19474:53;19519:7;19510:6;19499:9;19495:22;19474:53;:::i;:::-;19464:63;;19420:117;19576:2;19602:53;19647:7;19638:6;19627:9;19623:22;19602:53;:::i;:::-;19592:63;;19547:118;19704:2;19730:53;19775:7;19766:6;19755:9;19751:22;19730:53;:::i;:::-;19720:63;;19675:118;19860:2;19849:9;19845:18;19832:32;19891:18;19883:6;19880:30;19877:117;;;19913:79;;:::i;:::-;19877:117;20018:62;20072:7;20063:6;20052:9;20048:22;20018:62;:::i;:::-;20008:72;;19803:287;19154:943;;;;;;;:::o;20103:474::-;20171:6;20179;20228:2;20216:9;20207:7;20203:23;20199:32;20196:119;;;20234:79;;:::i;:::-;20196:119;20354:1;20379:53;20424:7;20415:6;20404:9;20400:22;20379:53;:::i;:::-;20369:63;;20325:117;20481:2;20507:53;20552:7;20543:6;20532:9;20528:22;20507:53;:::i;:::-;20497:63;;20452:118;20103:474;;;;;:::o;20583:173::-;20723:25;20719:1;20711:6;20707:14;20700:49;20583:173;:::o;20762:366::-;20904:3;20925:67;20989:2;20984:3;20925:67;:::i;:::-;20918:74;;21001:93;21090:3;21001:93;:::i;:::-;21119:2;21114:3;21110:12;21103:19;;20762:366;;;:::o;21134:419::-;21300:4;21338:2;21327:9;21323:18;21315:26;;21387:9;21381:4;21377:20;21373:1;21362:9;21358:17;21351:47;21415:131;21541:4;21415:131;:::i;:::-;21407:139;;21134:419;;;:::o;21559:180::-;21607:77;21604:1;21597:88;21704:4;21701:1;21694:15;21728:4;21725:1;21718:15;21745:320;21789:6;21826:1;21820:4;21816:12;21806:22;;21873:1;21867:4;21863:12;21894:18;21884:81;;21950:4;21942:6;21938:17;21928:27;;21884:81;22012:2;22004:6;22001:14;21981:18;21978:38;21975:84;;22031:18;;:::i;:::-;21975:84;21796:269;21745:320;;;:::o;22071:148::-;22173:11;22210:3;22195:18;;22071:148;;;;:::o;22225:169::-;22365:21;22361:1;22353:6;22349:14;22342:45;22225:169;:::o;22400:402::-;22560:3;22581:85;22663:2;22658:3;22581:85;:::i;:::-;22574:92;;22675:93;22764:3;22675:93;:::i;:::-;22793:2;22788:3;22784:12;22777:19;;22400:402;;;:::o;22808:390::-;22914:3;22942:39;22975:5;22942:39;:::i;:::-;22997:89;23079:6;23074:3;22997:89;:::i;:::-;22990:96;;23095:65;23153:6;23148:3;23141:4;23134:5;23130:16;23095:65;:::i;:::-;23185:6;23180:3;23176:16;23169:23;;22918:280;22808:390;;;;:::o;23204:171::-;23344:23;23340:1;23332:6;23328:14;23321:47;23204:171;:::o;23381:402::-;23541:3;23562:85;23644:2;23639:3;23562:85;:::i;:::-;23555:92;;23656:93;23745:3;23656:93;:::i;:::-;23774:2;23769:3;23765:12;23758:19;;23381:402;;;:::o;23789:967::-;24171:3;24193:148;24337:3;24193:148;:::i;:::-;24186:155;;24358:95;24449:3;24440:6;24358:95;:::i;:::-;24351:102;;24470:148;24614:3;24470:148;:::i;:::-;24463:155;;24635:95;24726:3;24717:6;24635:95;:::i;:::-;24628:102;;24747:3;24740:10;;23789:967;;;;;:::o;24762:141::-;24811:4;24834:3;24826:11;;24857:3;24854:1;24847:14;24891:4;24888:1;24878:18;24870:26;;24762:141;;;:::o;24909:93::-;24946:6;24993:2;24988;24981:5;24977:14;24973:23;24963:33;;24909:93;;;:::o;25008:107::-;25052:8;25102:5;25096:4;25092:16;25071:37;;25008:107;;;;:::o;25121:393::-;25190:6;25240:1;25228:10;25224:18;25263:97;25293:66;25282:9;25263:97;:::i;:::-;25381:39;25411:8;25400:9;25381:39;:::i;:::-;25369:51;;25453:4;25449:9;25442:5;25438:21;25429:30;;25502:4;25492:8;25488:19;25481:5;25478:30;25468:40;;25197:317;;25121:393;;;;;:::o;25520:60::-;25548:3;25569:5;25562:12;;25520:60;;;:::o;25586:142::-;25636:9;25669:53;25687:34;25696:24;25714:5;25696:24;:::i;:::-;25687:34;:::i;:::-;25669:53;:::i;:::-;25656:66;;25586:142;;;:::o;25734:75::-;25777:3;25798:5;25791:12;;25734:75;;;:::o;25815:269::-;25925:39;25956:7;25925:39;:::i;:::-;25986:91;26035:41;26059:16;26035:41;:::i;:::-;26027:6;26020:4;26014:11;25986:91;:::i;:::-;25980:4;25973:105;25891:193;25815:269;;;:::o;26090:73::-;26135:3;26090:73;:::o;26169:189::-;26246:32;;:::i;:::-;26287:65;26345:6;26337;26331:4;26287:65;:::i;:::-;26222:136;26169:189;;:::o;26364:186::-;26424:120;26441:3;26434:5;26431:14;26424:120;;;26495:39;26532:1;26525:5;26495:39;:::i;:::-;26468:1;26461:5;26457:13;26448:22;;26424:120;;;26364:186;;:::o;26556:543::-;26657:2;26652:3;26649:11;26646:446;;;26691:38;26723:5;26691:38;:::i;:::-;26775:29;26793:10;26775:29;:::i;:::-;26765:8;26761:44;26958:2;26946:10;26943:18;26940:49;;;26979:8;26964:23;;26940:49;27002:80;27058:22;27076:3;27058:22;:::i;:::-;27048:8;27044:37;27031:11;27002:80;:::i;:::-;26661:431;;26646:446;26556:543;;;:::o;27105:117::-;27159:8;27209:5;27203:4;27199:16;27178:37;;27105:117;;;;:::o;27228:169::-;27272:6;27305:51;27353:1;27349:6;27341:5;27338:1;27334:13;27305:51;:::i;:::-;27301:56;27386:4;27380;27376:15;27366:25;;27279:118;27228:169;;;;:::o;27402:295::-;27478:4;27624:29;27649:3;27643:4;27624:29;:::i;:::-;27616:37;;27686:3;27683:1;27679:11;27673:4;27670:21;27662:29;;27402:295;;;;:::o;27702:1395::-;27819:37;27852:3;27819:37;:::i;:::-;27921:18;27913:6;27910:30;27907:56;;;27943:18;;:::i;:::-;27907:56;27987:38;28019:4;28013:11;27987:38;:::i;:::-;28072:67;28132:6;28124;28118:4;28072:67;:::i;:::-;28166:1;28190:4;28177:17;;28222:2;28214:6;28211:14;28239:1;28234:618;;;;28896:1;28913:6;28910:77;;;28962:9;28957:3;28953:19;28947:26;28938:35;;28910:77;29013:67;29073:6;29066:5;29013:67;:::i;:::-;29007:4;29000:81;28869:222;28204:887;;28234:618;28286:4;28282:9;28274:6;28270:22;28320:37;28352:4;28320:37;:::i;:::-;28379:1;28393:208;28407:7;28404:1;28401:14;28393:208;;;28486:9;28481:3;28477:19;28471:26;28463:6;28456:42;28537:1;28529:6;28525:14;28515:24;;28584:2;28573:9;28569:18;28556:31;;28430:4;28427:1;28423:12;28418:17;;28393:208;;;28629:6;28620:7;28617:19;28614:179;;;28687:9;28682:3;28678:19;28672:26;28730:48;28772:4;28764:6;28760:17;28749:9;28730:48;:::i;:::-;28722:6;28715:64;28637:156;28614:179;28839:1;28835;28827:6;28823:14;28819:22;28813:4;28806:36;28241:611;;;28204:887;;27794:1303;;;27702:1395;;:::o;29103:442::-;29252:4;29290:2;29279:9;29275:18;29267:26;;29303:71;29371:1;29360:9;29356:17;29347:6;29303:71;:::i;:::-;29384:72;29452:2;29441:9;29437:18;29428:6;29384:72;:::i;:::-;29466;29534:2;29523:9;29519:18;29510:6;29466:72;:::i;:::-;29103:442;;;;;;:::o;29551:159::-;29691:11;29687:1;29679:6;29675:14;29668:35;29551:159;:::o;29716:365::-;29858:3;29879:66;29943:1;29938:3;29879:66;:::i;:::-;29872:73;;29954:93;30043:3;29954:93;:::i;:::-;30072:2;30067:3;30063:12;30056:19;;29716:365;;;:::o;30087:419::-;30253:4;30291:2;30280:9;30276:18;30268:26;;30340:9;30334:4;30330:20;30326:1;30315:9;30311:17;30304:47;30368:131;30494:4;30368:131;:::i;:::-;30360:139;;30087:419;;;:::o;30512:178::-;30652:30;30648:1;30640:6;30636:14;30629:54;30512:178;:::o;30696:366::-;30838:3;30859:67;30923:2;30918:3;30859:67;:::i;:::-;30852:74;;30935:93;31024:3;30935:93;:::i;:::-;31053:2;31048:3;31044:12;31037:19;;30696:366;;;:::o;31068:419::-;31234:4;31272:2;31261:9;31257:18;31249:26;;31321:9;31315:4;31311:20;31307:1;31296:9;31292:17;31285:47;31349:131;31475:4;31349:131;:::i;:::-;31341:139;;31068:419;;;:::o;31493:180::-;31541:77;31538:1;31531:88;31638:4;31635:1;31628:15;31662:4;31659:1;31652:15;31679:191;31719:3;31738:20;31756:1;31738:20;:::i;:::-;31733:25;;31772:20;31790:1;31772:20;:::i;:::-;31767:25;;31815:1;31812;31808:9;31801:16;;31836:3;31833:1;31830:10;31827:36;;;31843:18;;:::i;:::-;31827:36;31679:191;;;;:::o;31876:410::-;31916:7;31939:20;31957:1;31939:20;:::i;:::-;31934:25;;31973:20;31991:1;31973:20;:::i;:::-;31968:25;;32028:1;32025;32021:9;32050:30;32068:11;32050:30;:::i;:::-;32039:41;;32229:1;32220:7;32216:15;32213:1;32210:22;32190:1;32183:9;32163:83;32140:139;;32259:18;;:::i;:::-;32140:139;31924:362;31876:410;;;;:::o;32292:180::-;32340:77;32337:1;32330:88;32437:4;32434:1;32427:15;32461:4;32458:1;32451:15;32478:185;32518:1;32535:20;32553:1;32535:20;:::i;:::-;32530:25;;32569:20;32587:1;32569:20;:::i;:::-;32564:25;;32608:1;32598:35;;32613:18;;:::i;:::-;32598:35;32655:1;32652;32648:9;32643:14;;32478:185;;;;:::o;32669:178::-;32809:30;32805:1;32797:6;32793:14;32786:54;32669:178;:::o;32853:366::-;32995:3;33016:67;33080:2;33075:3;33016:67;:::i;:::-;33009:74;;33092:93;33181:3;33092:93;:::i;:::-;33210:2;33205:3;33201:12;33194:19;;32853:366;;;:::o;33225:419::-;33391:4;33429:2;33418:9;33414:18;33406:26;;33478:9;33472:4;33468:20;33464:1;33453:9;33449:17;33442:47;33506:131;33632:4;33506:131;:::i;:::-;33498:139;;33225:419;;;:::o;33650:174::-;33790:26;33786:1;33778:6;33774:14;33767:50;33650:174;:::o;33830:366::-;33972:3;33993:67;34057:2;34052:3;33993:67;:::i;:::-;33986:74;;34069:93;34158:3;34069:93;:::i;:::-;34187:2;34182:3;34178:12;34171:19;;33830:366;;;:::o;34202:419::-;34368:4;34406:2;34395:9;34391:18;34383:26;;34455:9;34449:4;34445:20;34441:1;34430:9;34426:17;34419:47;34483:131;34609:4;34483:131;:::i;:::-;34475:139;;34202:419;;;:::o;34627:159::-;34767:11;34763:1;34755:6;34751:14;34744:35;34627:159;:::o;34792:365::-;34934:3;34955:66;35019:1;35014:3;34955:66;:::i;:::-;34948:73;;35030:93;35119:3;35030:93;:::i;:::-;35148:2;35143:3;35139:12;35132:19;;34792:365;;;:::o;35163:419::-;35329:4;35367:2;35356:9;35352:18;35344:26;;35416:9;35410:4;35406:20;35402:1;35391:9;35387:17;35380:47;35444:131;35570:4;35444:131;:::i;:::-;35436:139;;35163:419;;;:::o;35588:194::-;35628:4;35648:20;35666:1;35648:20;:::i;:::-;35643:25;;35682:20;35700:1;35682:20;:::i;:::-;35677:25;;35726:1;35723;35719:9;35711:17;;35750:1;35744:4;35741:11;35738:37;;;35755:18;;:::i;:::-;35738:37;35588:194;;;;:::o;35788:222::-;35928:34;35924:1;35916:6;35912:14;35905:58;35997:5;35992:2;35984:6;35980:15;35973:30;35788:222;:::o;36016:366::-;36158:3;36179:67;36243:2;36238:3;36179:67;:::i;:::-;36172:74;;36255:93;36344:3;36255:93;:::i;:::-;36373:2;36368:3;36364:12;36357:19;;36016:366;;;:::o;36388:419::-;36554:4;36592:2;36581:9;36577:18;36569:26;;36641:9;36635:4;36631:20;36627:1;36616:9;36612:17;36605:47;36669:131;36795:4;36669:131;:::i;:::-;36661:139;;36388:419;;;:::o;36813:233::-;36852:3;36875:24;36893:5;36875:24;:::i;:::-;36866:33;;36921:66;36914:5;36911:77;36908:103;;36991:18;;:::i;:::-;36908:103;37038:1;37031:5;37027:13;37020:20;;36813:233;;;:::o;37052:180::-;37100:77;37097:1;37090:88;37197:4;37194:1;37187:15;37221:4;37218:1;37211:15;37238:85;37283:7;37312:5;37301:16;;37238:85;;;:::o;37329:101::-;37365:7;37405:18;37398:5;37394:30;37383:41;;37329:101;;;:::o;37436:156::-;37493:9;37526:60;37543:42;37552:32;37578:5;37552:32;:::i;:::-;37543:42;:::i;:::-;37526:60;:::i;:::-;37513:73;;37436:156;;;:::o;37598:145::-;37692:44;37730:5;37692:44;:::i;:::-;37687:3;37680:57;37598:145;;:::o;37749:236::-;37849:4;37887:2;37876:9;37872:18;37864:26;;37900:78;37975:1;37964:9;37960:17;37951:6;37900:78;:::i;:::-;37749:236;;;;:::o;37991:94::-;38024:8;38072:5;38068:2;38064:14;38043:35;;37991:94;;;:::o;38091:::-;38130:7;38159:20;38173:5;38159:20;:::i;:::-;38148:31;;38091:94;;;:::o;38191:100::-;38230:7;38259:26;38279:5;38259:26;:::i;:::-;38248:37;;38191:100;;;:::o;38297:157::-;38402:45;38422:24;38440:5;38422:24;:::i;:::-;38402:45;:::i;:::-;38397:3;38390:58;38297:157;;:::o;38460:256::-;38572:3;38587:75;38658:3;38649:6;38587:75;:::i;:::-;38687:2;38682:3;38678:12;38671:19;;38707:3;38700:10;;38460:256;;;;:::o;38722:181::-;38862:33;38858:1;38850:6;38846:14;38839:57;38722:181;:::o;38909:366::-;39051:3;39072:67;39136:2;39131:3;39072:67;:::i;:::-;39065:74;;39148:93;39237:3;39148:93;:::i;:::-;39266:2;39261:3;39257:12;39250:19;;38909:366;;;:::o;39281:419::-;39447:4;39485:2;39474:9;39470:18;39462:26;;39534:9;39528:4;39524:20;39520:1;39509:9;39505:17;39498:47;39562:131;39688:4;39562:131;:::i;:::-;39554:139;;39281:419;;;:::o;39730:874::-;39833:3;39870:5;39864:12;39899:36;39925:9;39899:36;:::i;:::-;39951:89;40033:6;40028:3;39951:89;:::i;:::-;39944:96;;40071:1;40060:9;40056:17;40087:1;40082:166;;;;40262:1;40257:341;;;;40049:549;;40082:166;40166:4;40162:9;40151;40147:25;40142:3;40135:38;40228:6;40221:14;40214:22;40206:6;40202:35;40197:3;40193:45;40186:52;;40082:166;;40257:341;40324:38;40356:5;40324:38;:::i;:::-;40384:1;40398:154;40412:6;40409:1;40406:13;40398:154;;;40486:7;40480:14;40476:1;40471:3;40467:11;40460:35;40536:1;40527:7;40523:15;40512:26;;40434:4;40431:1;40427:12;40422:17;;40398:154;;;40581:6;40576:3;40572:16;40565:23;;40264:334;;40049:549;;39837:767;;39730:874;;;;:::o;40610:737::-;40877:3;40899:92;40987:3;40978:6;40899:92;:::i;:::-;40892:99;;41008:92;41096:3;41087:6;41008:92;:::i;:::-;41001:99;;41117:95;41208:3;41199:6;41117:95;:::i;:::-;41110:102;;41229:92;41317:3;41308:6;41229:92;:::i;:::-;41222:99;;41338:3;41331:10;;40610:737;;;;;;;:::o;41353:743::-;41623:3;41645:95;41736:3;41727:6;41645:95;:::i;:::-;41638:102;;41757:92;41845:3;41836:6;41757:92;:::i;:::-;41750:99;;41866:95;41957:3;41948:6;41866:95;:::i;:::-;41859:102;;41978:92;42066:3;42057:6;41978:92;:::i;:::-;41971:99;;42087:3;42080:10;;41353:743;;;;;;;:::o;42102:229::-;42242:34;42238:1;42230:6;42226:14;42219:58;42311:12;42306:2;42298:6;42294:15;42287:37;42102:229;:::o;42337:366::-;42479:3;42500:67;42564:2;42559:3;42500:67;:::i;:::-;42493:74;;42576:93;42665:3;42576:93;:::i;:::-;42694:2;42689:3;42685:12;42678:19;;42337:366;;;:::o;42709:419::-;42875:4;42913:2;42902:9;42898:18;42890:26;;42962:9;42956:4;42952:20;42948:1;42937:9;42933:17;42926:47;42990:131;43116:4;42990:131;:::i;:::-;42982:139;;42709:419;;;:::o;43134:173::-;43274:25;43270:1;43262:6;43258:14;43251:49;43134:173;:::o;43313:366::-;43455:3;43476:67;43540:2;43535:3;43476:67;:::i;:::-;43469:74;;43552:93;43641:3;43552:93;:::i;:::-;43670:2;43665:3;43661:12;43654:19;;43313:366;;;:::o;43685:419::-;43851:4;43889:2;43878:9;43874:18;43866:26;;43938:9;43932:4;43928:20;43924:1;43913:9;43909:17;43902:47;43966:131;44092:4;43966:131;:::i;:::-;43958:139;;43685:419;;;:::o;44110:168::-;44250:20;44246:1;44238:6;44234:14;44227:44;44110:168;:::o;44284:366::-;44426:3;44447:67;44511:2;44506:3;44447:67;:::i;:::-;44440:74;;44523:93;44612:3;44523:93;:::i;:::-;44641:2;44636:3;44632:12;44625:19;;44284:366;;;:::o;44656:419::-;44822:4;44860:2;44849:9;44845:18;44837:26;;44909:9;44903:4;44899:20;44895:1;44884:9;44880:17;44873:47;44937:131;45063:4;44937:131;:::i;:::-;44929:139;;44656:419;;;:::o;45081:159::-;45221:11;45217:1;45209:6;45205:14;45198:35;45081:159;:::o;45246:400::-;45406:3;45427:84;45509:1;45504:3;45427:84;:::i;:::-;45420:91;;45520:93;45609:3;45520:93;:::i;:::-;45638:1;45633:3;45629:11;45622:18;;45246:400;;;:::o;45652:154::-;45792:6;45788:1;45780:6;45776:14;45769:30;45652:154;:::o;45812:400::-;45972:3;45993:84;46075:1;46070:3;45993:84;:::i;:::-;45986:91;;46086:93;46175:3;46086:93;:::i;:::-;46204:1;46199:3;46195:11;46188:18;;45812:400;;;:::o;46218:807::-;46552:3;46574:148;46718:3;46574:148;:::i;:::-;46567:155;;46739:95;46830:3;46821:6;46739:95;:::i;:::-;46732:102;;46851:148;46995:3;46851:148;:::i;:::-;46844:155;;47016:3;47009:10;;46218:807;;;;:::o;47031:140::-;47080:9;47113:52;47131:33;47140:23;47157:5;47140:23;:::i;:::-;47131:33;:::i;:::-;47113:52;:::i;:::-;47100:65;;47031:140;;;:::o;47177:129::-;47263:36;47293:5;47263:36;:::i;:::-;47258:3;47251:49;47177:129;;:::o;47312:440::-;47460:4;47498:2;47487:9;47483:18;47475:26;;47511:71;47579:1;47568:9;47564:17;47555:6;47511:71;:::i;:::-;47592;47659:2;47648:9;47644:18;47635:6;47592:71;:::i;:::-;47673:72;47741:2;47730:9;47726:18;47717:6;47673:72;:::i;:::-;47312:440;;;;;;:::o;47758:332::-;47879:4;47917:2;47906:9;47902:18;47894:26;;47930:71;47998:1;47987:9;47983:17;47974:6;47930:71;:::i;:::-;48011:72;48079:2;48068:9;48064:18;48055:6;48011:72;:::i;:::-;47758:332;;;;;:::o;48096:143::-;48153:5;48184:6;48178:13;48169:22;;48200:33;48227:5;48200:33;:::i;:::-;48096:143;;;;:::o;48245:351::-;48315:6;48364:2;48352:9;48343:7;48339:23;48335:32;48332:119;;;48370:79;;:::i;:::-;48332:119;48490:1;48515:64;48571:7;48562:6;48551:9;48547:22;48515:64;:::i;:::-;48505:74;;48461:128;48245:351;;;;:::o;48602:330::-;48722:4;48760:2;48749:9;48745:18;48737:26;;48773:70;48840:1;48829:9;48825:17;48816:6;48773:70;:::i;:::-;48853:72;48921:2;48910:9;48906:18;48897:6;48853:72;:::i;:::-;48602:330;;;;;:::o;48938:98::-;48989:6;49023:5;49017:12;49007:22;;48938:98;;;:::o;49042:168::-;49125:11;49159:6;49154:3;49147:19;49199:4;49194:3;49190:14;49175:29;;49042:168;;;;:::o;49216:373::-;49302:3;49330:38;49362:5;49330:38;:::i;:::-;49384:70;49447:6;49442:3;49384:70;:::i;:::-;49377:77;;49463:65;49521:6;49516:3;49509:4;49502:5;49498:16;49463:65;:::i;:::-;49553:29;49575:6;49553:29;:::i;:::-;49548:3;49544:39;49537:46;;49306:283;49216:373;;;;:::o;49595:640::-;49790:4;49828:3;49817:9;49813:19;49805:27;;49842:71;49910:1;49899:9;49895:17;49886:6;49842:71;:::i;:::-;49923:72;49991:2;49980:9;49976:18;49967:6;49923:72;:::i;:::-;50005;50073:2;50062:9;50058:18;50049:6;50005:72;:::i;:::-;50124:9;50118:4;50114:20;50109:2;50098:9;50094:18;50087:48;50152:76;50223:4;50214:6;50152:76;:::i;:::-;50144:84;;49595:640;;;;;;;:::o;50241:141::-;50297:5;50328:6;50322:13;50313:22;;50344:32;50370:5;50344:32;:::i;:::-;50241:141;;;;:::o;50388:349::-;50457:6;50506:2;50494:9;50485:7;50481:23;50477:32;50474:119;;;50512:79;;:::i;:::-;50474:119;50632:1;50657:63;50712:7;50703:6;50692:9;50688:22;50657:63;:::i;:::-;50647:73;;50603:127;50388:349;;;;:::o;50743:147::-;50844:11;50881:3;50866:18;;50743:147;;;;:::o;50896:386::-;51000:3;51028:38;51060:5;51028:38;:::i;:::-;51082:88;51163:6;51158:3;51082:88;:::i;:::-;51075:95;;51179:65;51237:6;51232:3;51225:4;51218:5;51214:16;51179:65;:::i;:::-;51269:6;51264:3;51260:16;51253:23;;51004:278;50896:386;;;;:::o;51288:271::-;51418:3;51440:93;51529:3;51520:6;51440:93;:::i;:::-;51433:100;;51550:3;51543:10;;51288:271;;;;:::o
Swarm Source
ipfs://cf63c4be24f75fc901b65581b38a955fa258d05ae8ed3e580d6e5d8818022711
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.