Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
TemporalTapestries
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-09-02 */ // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * 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 caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://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.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) 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(errorMessage); } } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/utils/math/Math.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { // 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. require(denominator > prod1, "Math: mulDiv overflow"); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10 ** 64) { value /= 10 ** 64; result += 64; } if (value >= 10 ** 32) { value /= 10 ** 32; result += 32; } if (value >= 10 ** 16) { value /= 10 ** 16; result += 16; } if (value >= 10 ** 8) { value /= 10 ** 8; result += 8; } if (value >= 10 ** 4) { value /= 10 ** 4; result += 4; } if (value >= 10 ** 2) { value /= 10 ** 2; result += 2; } if (value >= 10 ** 1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 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 + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0); } } } // File: @openzeppelin/contracts/utils/math/SignedMath.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol) pragma solidity ^0.8.0; /** * @dev Standard signed math utilities missing in the Solidity language. */ library SignedMath { /** * @dev Returns the largest of two signed numbers. */ function max(int256 a, int256 b) internal pure returns (int256) { return a > b ? a : b; } /** * @dev Returns the smallest of two signed numbers. */ function min(int256 a, int256 b) internal pure returns (int256) { return a < b ? a : b; } /** * @dev Returns the average of two signed numbers without overflow. * The result is rounded towards zero. */ function average(int256 a, int256 b) internal pure returns (int256) { // Formula from the book "Hacker's Delight" int256 x = (a & b) + ((a ^ b) >> 1); return x + (int256(uint256(x) >> 255) & (a ^ b)); } /** * @dev Returns the absolute unsigned value of a signed value. */ function abs(int256 n) internal pure returns (uint256) { unchecked { // must be unchecked in order to support `n = type(int256).min` return uint256(n >= 0 ? n : -n); } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `int256` to its ASCII `string` decimal representation. */ function toString(int256 value) internal pure returns (string memory) { return string(abi.encodePacked(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) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } /** * @dev Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return keccak256(bytes(a)) == keccak256(bytes(b)); } } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _ownerOf(tokenId); require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(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 override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner or approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom(address from, address to, uint256 tokenId) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _safeTransfer(from, to, tokenId, data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer(address from, address to, uint256 tokenId, bytes memory data) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist */ function _ownerOf(uint256 tokenId) internal view virtual returns (address) { return _owners[tokenId]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _ownerOf(tokenId) != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint(address to, uint256 tokenId, bytes memory data) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId, 1); // Check that tokenId was not minted by `_beforeTokenTransfer` hook require(!_exists(tokenId), "ERC721: token already minted"); unchecked { // Will not overflow unless all 2**256 token ids are minted to the same owner. // Given that tokens are minted one by one, it is impossible in practice that // this ever happens. Might change if we allow batch minting. // The ERC fails to describe this case. _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId, 1); } /** * @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 virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId, 1); // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook owner = ERC721.ownerOf(tokenId); // Clear approvals delete _tokenApprovals[tokenId]; unchecked { // Cannot overflow, as that would require more tokens to be burned/transferred // out than the owner initially received through minting and transferring in. _balances[owner] -= 1; } delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId, 1); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer(address from, address to, uint256 tokenId) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId, 1); // Check that tokenId was not transferred by `_beforeTokenTransfer` hook require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); // Clear approvals from the previous owner delete _tokenApprovals[tokenId]; unchecked { // `_balances[from]` cannot overflow for the same reason as described in `_burn`: // `from`'s balance is the number of token held, which is at least one before the current // transfer. // `_balances[to]` could overflow in the conditions described in `_mint`. That would require // all 2**256 token ids to be minted, which in practice is impossible. _balances[from] -= 1; _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll(address owner, address operator, bool approved) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`. * - When `from` is zero, the tokens will be minted for `to`. * - When `to` is zero, ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {} /** * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`. * - When `from` is zero, the tokens were minted for `to`. * - When `to` is zero, ``from``'s tokens were burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {} /** * @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override. * * WARNING: Anyone calling this MUST ensure that the balances remain consistent with the ownership. The invariant * being 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`. */ // solhint-disable-next-line func-name-mixedcase function __unsafe_increaseBalance(address account, uint256 amount) internal { _balances[account] += amount; } } // File: @openzeppelin/contracts/interfaces/IERC165.sol // OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol) pragma solidity ^0.8.0; // File: @openzeppelin/contracts/interfaces/IERC721.sol // OpenZeppelin Contracts v4.4.1 (interfaces/IERC721.sol) pragma solidity ^0.8.0; // File: @openzeppelin/contracts/interfaces/IERC4906.sol // OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC4906.sol) pragma solidity ^0.8.0; /// @title EIP-721 Metadata Update Extension interface IERC4906 is IERC165, IERC721 { /// @dev This event emits when the metadata of a token is changed. /// So that the third-party platforms such as NFT market could /// timely update the images and related attributes of the NFT. event MetadataUpdate(uint256 _tokenId); /// @dev This event emits when the metadata of a range of tokens is changed. /// So that the third-party platforms such as NFT market could /// timely update the images and related attributes of the NFTs. event BatchMetadataUpdate(uint256 _fromTokenId, uint256 _toTokenId); } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/extensions/ERC721URIStorage.sol) pragma solidity ^0.8.0; /** * @dev ERC721 token with storage based token URI management. */ abstract contract ERC721URIStorage is IERC4906, ERC721 { using Strings for uint256; // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; /** * @dev See {IERC165-supportsInterface} */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, IERC165) returns (bool) { return interfaceId == bytes4(0x49064906) || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = _baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } return super.tokenURI(tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Emits {MetadataUpdate}. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; emit MetadataUpdate(tokenId); } /** * @dev See {ERC721-_burn}. This override additionally checks to see if a * token-specific URI was set for the token, and if so, it deletes the token URI from * the storage mapping. */ function _burn(uint256 tokenId) internal virtual override { super._burn(tokenId); if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. 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 { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Counters.sol // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: @openzeppelin/contracts/interfaces/IERC2981.sol // OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.0; /** * @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. * * _Available since v4.5._ */ 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: TemporalTapestries.sol pragma solidity ^0.8.0; contract TemporalTapestries is ERC721URIStorage, Ownable, IERC2981 { using Counters for Counters.Counter; Counters.Counter private _tokenIds; uint256 public constant MAX_SUPPLY = 100; constructor() ERC721("Temporal Tapestries", "TETA") {} function withdraw() public onlyOwner { uint256 balance = address(this).balance; payable(msg.sender).transfer(balance); } function totalSupply() public view returns (uint256) { return _tokenIds.current(); } function mintTETA(address recipient, string memory metadataURI) internal { // Changed from 'external' to 'internal' require(_tokenIds.current() < MAX_SUPPLY, "Max supply reached"); _tokenIds.increment(); uint256 tokenId = _tokenIds.current(); _safeMint(recipient, tokenId); _setTokenURI(tokenId, metadataURI); } // Batch minting for the owner to mint all 100 unique items at once function batchMintTETAS(address recipient, string[] memory metadataURIs) external onlyOwner { require(_tokenIds.current() + metadataURIs.length <= MAX_SUPPLY, "Exceeds max supply"); for (uint i = 0; i < metadataURIs.length; i++) { mintTETA(recipient, metadataURIs[i]); } } function burn(uint256 tokenId) external onlyOwner { require(ownerOf(tokenId) == msg.sender, "You are not the owner of this token"); _burn(tokenId); _tokenIds.decrement(); } // Royalty fee represented as 5% (or 500 basis points) uint256 public constant royaltyBps = 500; // Implement the royaltyInfo function to return the royalty recipient // and the royalty amount. function royaltyInfo(uint256 /* _tokenId */, uint256 _salePrice) external view override returns (address receiver, uint256 royaltyAmount) { uint256 royalty = (_salePrice * royaltyBps) / 10000; // 5% of the sale price return (owner(), royalty); // Assuming the owner receives all the royalties. Change as needed. } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_toTokenId","type":"uint256"}],"name":"BatchMetadataUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"MetadataUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"string[]","name":"metadataURIs","type":"string[]"}],"name":"batchMintTETAS","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"royaltyBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","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":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040518060400160405280601381526020017f54656d706f72616c2054617065737472696573000000000000000000000000008152506040518060400160405280600481526020017f544554410000000000000000000000000000000000000000000000000000000081525081600090816200008f919062000412565b508060019081620000a1919062000412565b505050620000c4620000b8620000ca60201b60201c565b620000d260201b60201c565b620004f9565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200021a57607f821691505b60208210810362000230576200022f620001d2565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200029a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200025b565b620002a686836200025b565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620002f3620002ed620002e784620002be565b620002c8565b620002be565b9050919050565b6000819050919050565b6200030f83620002d2565b620003276200031e82620002fa565b84845462000268565b825550505050565b600090565b6200033e6200032f565b6200034b81848462000304565b505050565b5b8181101562000373576200036760008262000334565b60018101905062000351565b5050565b601f821115620003c2576200038c8162000236565b62000397846200024b565b81016020851015620003a7578190505b620003bf620003b6856200024b565b83018262000350565b50505b505050565b600082821c905092915050565b6000620003e760001984600802620003c7565b1980831691505092915050565b6000620004028383620003d4565b9150826002028217905092915050565b6200041d8262000198565b67ffffffffffffffff811115620004395762000438620001a3565b5b62000445825462000201565b6200045282828562000377565b600060209050601f8311600181146200048a576000841562000475578287015190505b620004818582620003f4565b865550620004f1565b601f1984166200049a8662000236565b60005b82811015620004c4578489015182556001820191506020850194506020810190506200049d565b86831015620004e45784890151620004e0601f891682620003d4565b8355505b6001600288020188555050505b505050505050565b61389880620005096000396000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c80635738f44e116100c3578063a22cb4651161007c578063a22cb46514610379578063b88d4fde14610395578063c63adb2b146103b1578063c87b56dd146103cf578063e985e9c5146103ff578063f2fde38b1461042f5761014d565b80635738f44e146102b75780636352211e146102d357806370a0823114610303578063715018a6146103335780638da5cb5b1461033d57806395d89b411461035b5761014d565b806323b872dd1161011557806323b872dd1461020a5780632a55205a1461022657806332cb6b0c146102575780633ccfd60b1461027557806342842e0e1461027f57806342966c681461029b5761014d565b806301ffc9a71461015257806306fdde0314610182578063081812fc146101a0578063095ea7b3146101d057806318160ddd146101ec575b600080fd5b61016c60048036038101906101679190612217565b61044b565b604051610179919061225f565b60405180910390f35b61018a6104ac565b604051610197919061230a565b60405180910390f35b6101ba60048036038101906101b59190612362565b61053e565b6040516101c791906123d0565b60405180910390f35b6101ea60048036038101906101e59190612417565b610584565b005b6101f461069b565b6040516102019190612466565b60405180910390f35b610224600480360381019061021f9190612481565b6106ac565b005b610240600480360381019061023b91906124d4565b61070c565b60405161024e929190612514565b60405180910390f35b61025f610743565b60405161026c9190612466565b60405180910390f35b61027d610748565b005b61029960048036038101906102949190612481565b61079f565b005b6102b560048036038101906102b09190612362565b6107bf565b005b6102d160048036038101906102cc9190612758565b610853565b005b6102ed60048036038101906102e89190612362565b6108fc565b6040516102fa91906123d0565b60405180910390f35b61031d600480360381019061031891906127b4565b610982565b60405161032a9190612466565b60405180910390f35b61033b610a39565b005b610345610a4d565b60405161035291906123d0565b60405180910390f35b610363610a77565b604051610370919061230a565b60405180910390f35b610393600480360381019061038e919061280d565b610b09565b005b6103af60048036038101906103aa91906128ee565b610b1f565b005b6103b9610b81565b6040516103c69190612466565b60405180910390f35b6103e960048036038101906103e49190612362565b610b87565b6040516103f6919061230a565b60405180910390f35b61041960048036038101906104149190612971565b610c99565b604051610426919061225f565b60405180910390f35b610449600480360381019061044491906127b4565b610d2d565b005b6000634906490660e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806104a557506104a482610db0565b5b9050919050565b6060600080546104bb906129e0565b80601f01602080910402602001604051908101604052809291908181526020018280546104e7906129e0565b80156105345780601f1061050957610100808354040283529160200191610534565b820191906000526020600020905b81548152906001019060200180831161051757829003601f168201915b5050505050905090565b600061054982610e92565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061058f826108fc565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036105ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105f690612a83565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661061e610edd565b73ffffffffffffffffffffffffffffffffffffffff16148061064d575061064c81610647610edd565b610c99565b5b61068c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068390612b15565b60405180910390fd5b6106968383610ee5565b505050565b60006106a76008610f9e565b905090565b6106bd6106b7610edd565b82610fac565b6106fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106f390612ba7565b60405180910390fd5b610707838383611041565b505050565b60008060006127106101f4856107229190612bf6565b61072c9190612c67565b9050610736610a4d565b8192509250509250929050565b606481565b61075061133a565b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561079b573d6000803e3d6000fd5b5050565b6107ba83838360405180602001604052806000815250610b1f565b505050565b6107c761133a565b3373ffffffffffffffffffffffffffffffffffffffff166107e7826108fc565b73ffffffffffffffffffffffffffffffffffffffff161461083d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083490612d0a565b60405180910390fd5b610846816113b8565b610850600861140b565b50565b61085b61133a565b606481516108696008610f9e565b6108739190612d2a565b11156108b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ab90612daa565b60405180910390fd5b60005b81518110156108f7576108e4838383815181106108d7576108d6612dca565b5b6020026020010151611467565b80806108ef90612df9565b9150506108b7565b505050565b600080610908836114e4565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610979576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097090612e8d565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036109f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e990612f1f565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610a4161133a565b610a4b6000611521565b565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610a86906129e0565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab2906129e0565b8015610aff5780601f10610ad457610100808354040283529160200191610aff565b820191906000526020600020905b815481529060010190602001808311610ae257829003601f168201915b5050505050905090565b610b1b610b14610edd565b83836115e7565b5050565b610b30610b2a610edd565b83610fac565b610b6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6690612ba7565b60405180910390fd5b610b7b84848484611753565b50505050565b6101f481565b6060610b9282610e92565b6000600660008481526020019081526020016000208054610bb2906129e0565b80601f0160208091040260200160405190810160405280929190818152602001828054610bde906129e0565b8015610c2b5780601f10610c0057610100808354040283529160200191610c2b565b820191906000526020600020905b815481529060010190602001808311610c0e57829003601f168201915b505050505090506000610c3c6117af565b90506000815103610c51578192505050610c94565b600082511115610c86578082604051602001610c6e929190612f7b565b60405160208183030381529060405292505050610c94565b610c8f846117c6565b925050505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610d3561133a565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610da4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9b90613011565b60405180910390fd5b610dad81611521565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610e7b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610e8b5750610e8a8261182e565b5b9050919050565b610e9b81611898565b610eda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed190612e8d565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610f58836108fc565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b600080610fb8836108fc565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610ffa5750610ff98185610c99565b5b8061103857508373ffffffffffffffffffffffffffffffffffffffff166110208461053e565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611061826108fc565b73ffffffffffffffffffffffffffffffffffffffff16146110b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ae906130a3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611126576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111d90613135565b60405180910390fd5b61113383838360016118d9565b8273ffffffffffffffffffffffffffffffffffffffff16611153826108fc565b73ffffffffffffffffffffffffffffffffffffffff16146111a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a0906130a3565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461133583838360016118df565b505050565b611342610edd565b73ffffffffffffffffffffffffffffffffffffffff16611360610a4d565b73ffffffffffffffffffffffffffffffffffffffff16146113b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ad906131a1565b60405180910390fd5b565b6113c1816118e5565b60006006600083815260200190815260200160002080546113e1906129e0565b90501461140857600660008281526020019081526020016000206000611407919061214e565b5b50565b60008160000154905060008111611457576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144e9061320d565b60405180910390fd5b6001810382600001819055505050565b60646114736008610f9e565b106114b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114aa90613279565b60405180910390fd5b6114bd6008611a33565b60006114c96008610f9e565b90506114d58382611a49565b6114df8183611a67565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611655576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164c906132e5565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611746919061225f565b60405180910390a3505050565b61175e848484611041565b61176a84848484611b0b565b6117a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a090613377565b60405180910390fd5b50505050565b606060405180602001604052806000815250905090565b60606117d182610e92565b60006117db6117af565b905060008151116117fb5760405180602001604052806000815250611826565b8061180584611c92565b604051602001611816929190612f7b565b6040516020818303038152906040525b915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166118ba836114e4565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b50505050565b50505050565b60006118f0826108fc565b90506119008160008460016118d9565b611909826108fc565b90506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611a2f8160008460016118df565b5050565b6001816000016000828254019250508190555050565b611a63828260405180602001604052806000815250611d60565b5050565b611a7082611898565b611aaf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa690613409565b60405180910390fd5b80600660008481526020019081526020016000209081611acf91906135d5565b507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce782604051611aff9190612466565b60405180910390a15050565b6000611b2c8473ffffffffffffffffffffffffffffffffffffffff16611dbb565b15611c85578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611b55610edd565b8786866040518563ffffffff1660e01b8152600401611b7794939291906136fc565b6020604051808303816000875af1925050508015611bb357506040513d601f19601f82011682018060405250810190611bb0919061375d565b60015b611c35573d8060008114611be3576040519150601f19603f3d011682016040523d82523d6000602084013e611be8565b606091505b506000815103611c2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2490613377565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611c8a565b600190505b949350505050565b606060006001611ca184611dde565b01905060008167ffffffffffffffff811115611cc057611cbf612542565b5b6040519080825280601f01601f191660200182016040528015611cf25781602001600182028036833780820191505090505b509050600082602001820190505b600115611d55578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611d4957611d48612c38565b5b04945060008503611d00575b819350505050919050565b611d6a8383611f31565b611d776000848484611b0b565b611db6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dad90613377565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611e3c577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381611e3257611e31612c38565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310611e79576d04ee2d6d415b85acef81000000008381611e6f57611e6e612c38565b5b0492506020810190505b662386f26fc100008310611ea857662386f26fc100008381611e9e57611e9d612c38565b5b0492506010810190505b6305f5e1008310611ed1576305f5e1008381611ec757611ec6612c38565b5b0492506008810190505b6127108310611ef6576127108381611eec57611eeb612c38565b5b0492506004810190505b60648310611f195760648381611f0f57611f0e612c38565b5b0492506002810190505b600a8310611f28576001810190505b80915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611fa0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f97906137d6565b60405180910390fd5b611fa981611898565b15611fe9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe090613842565b60405180910390fd5b611ff76000838360016118d9565b61200081611898565b15612040576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203790613842565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461214a6000838360016118df565b5050565b50805461215a906129e0565b6000825580601f1061216c575061218b565b601f01602090049060005260206000209081019061218a919061218e565b5b50565b5b808211156121a757600081600090555060010161218f565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6121f4816121bf565b81146121ff57600080fd5b50565b600081359050612211816121eb565b92915050565b60006020828403121561222d5761222c6121b5565b5b600061223b84828501612202565b91505092915050565b60008115159050919050565b61225981612244565b82525050565b60006020820190506122746000830184612250565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156122b4578082015181840152602081019050612299565b60008484015250505050565b6000601f19601f8301169050919050565b60006122dc8261227a565b6122e68185612285565b93506122f6818560208601612296565b6122ff816122c0565b840191505092915050565b6000602082019050818103600083015261232481846122d1565b905092915050565b6000819050919050565b61233f8161232c565b811461234a57600080fd5b50565b60008135905061235c81612336565b92915050565b600060208284031215612378576123776121b5565b5b60006123868482850161234d565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123ba8261238f565b9050919050565b6123ca816123af565b82525050565b60006020820190506123e560008301846123c1565b92915050565b6123f4816123af565b81146123ff57600080fd5b50565b600081359050612411816123eb565b92915050565b6000806040838503121561242e5761242d6121b5565b5b600061243c85828601612402565b925050602061244d8582860161234d565b9150509250929050565b6124608161232c565b82525050565b600060208201905061247b6000830184612457565b92915050565b60008060006060848603121561249a576124996121b5565b5b60006124a886828701612402565b93505060206124b986828701612402565b92505060406124ca8682870161234d565b9150509250925092565b600080604083850312156124eb576124ea6121b5565b5b60006124f98582860161234d565b925050602061250a8582860161234d565b9150509250929050565b600060408201905061252960008301856123c1565b6125366020830184612457565b9392505050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61257a826122c0565b810181811067ffffffffffffffff8211171561259957612598612542565b5b80604052505050565b60006125ac6121ab565b90506125b88282612571565b919050565b600067ffffffffffffffff8211156125d8576125d7612542565b5b602082029050602081019050919050565b600080fd5b600080fd5b600067ffffffffffffffff82111561260e5761260d612542565b5b612617826122c0565b9050602081019050919050565b82818337600083830152505050565b6000612646612641846125f3565b6125a2565b905082815260208101848484011115612662576126616125ee565b5b61266d848285612624565b509392505050565b600082601f83011261268a5761268961253d565b5b813561269a848260208601612633565b91505092915050565b60006126b66126b1846125bd565b6125a2565b905080838252602082019050602084028301858111156126d9576126d86125e9565b5b835b8181101561272057803567ffffffffffffffff8111156126fe576126fd61253d565b5b80860161270b8982612675565b855260208501945050506020810190506126db565b5050509392505050565b600082601f83011261273f5761273e61253d565b5b813561274f8482602086016126a3565b91505092915050565b6000806040838503121561276f5761276e6121b5565b5b600061277d85828601612402565b925050602083013567ffffffffffffffff81111561279e5761279d6121ba565b5b6127aa8582860161272a565b9150509250929050565b6000602082840312156127ca576127c96121b5565b5b60006127d884828501612402565b91505092915050565b6127ea81612244565b81146127f557600080fd5b50565b600081359050612807816127e1565b92915050565b60008060408385031215612824576128236121b5565b5b600061283285828601612402565b9250506020612843858286016127f8565b9150509250929050565b600067ffffffffffffffff82111561286857612867612542565b5b612871826122c0565b9050602081019050919050565b600061289161288c8461284d565b6125a2565b9050828152602081018484840111156128ad576128ac6125ee565b5b6128b8848285612624565b509392505050565b600082601f8301126128d5576128d461253d565b5b81356128e584826020860161287e565b91505092915050565b60008060008060808587031215612908576129076121b5565b5b600061291687828801612402565b945050602061292787828801612402565b93505060406129388782880161234d565b925050606085013567ffffffffffffffff811115612959576129586121ba565b5b612965878288016128c0565b91505092959194509250565b60008060408385031215612988576129876121b5565b5b600061299685828601612402565b92505060206129a785828601612402565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806129f857607f821691505b602082108103612a0b57612a0a6129b1565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612a6d602183612285565b9150612a7882612a11565b604082019050919050565b60006020820190508181036000830152612a9c81612a60565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000612aff603d83612285565b9150612b0a82612aa3565b604082019050919050565b60006020820190508181036000830152612b2e81612af2565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000612b91602d83612285565b9150612b9c82612b35565b604082019050919050565b60006020820190508181036000830152612bc081612b84565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612c018261232c565b9150612c0c8361232c565b9250828202612c1a8161232c565b91508282048414831517612c3157612c30612bc7565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612c728261232c565b9150612c7d8361232c565b925082612c8d57612c8c612c38565b5b828204905092915050565b7f596f7520617265206e6f7420746865206f776e6572206f66207468697320746f60008201527f6b656e0000000000000000000000000000000000000000000000000000000000602082015250565b6000612cf4602383612285565b9150612cff82612c98565b604082019050919050565b60006020820190508181036000830152612d2381612ce7565b9050919050565b6000612d358261232c565b9150612d408361232c565b9250828201905080821115612d5857612d57612bc7565b5b92915050565b7f45786365656473206d617820737570706c790000000000000000000000000000600082015250565b6000612d94601283612285565b9150612d9f82612d5e565b602082019050919050565b60006020820190508181036000830152612dc381612d87565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000612e048261232c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612e3657612e35612bc7565b5b600182019050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000612e77601883612285565b9150612e8282612e41565b602082019050919050565b60006020820190508181036000830152612ea681612e6a565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000612f09602983612285565b9150612f1482612ead565b604082019050919050565b60006020820190508181036000830152612f3881612efc565b9050919050565b600081905092915050565b6000612f558261227a565b612f5f8185612f3f565b9350612f6f818560208601612296565b80840191505092915050565b6000612f878285612f4a565b9150612f938284612f4a565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612ffb602683612285565b915061300682612f9f565b604082019050919050565b6000602082019050818103600083015261302a81612fee565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061308d602583612285565b915061309882613031565b604082019050919050565b600060208201905081810360008301526130bc81613080565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061311f602483612285565b915061312a826130c3565b604082019050919050565b6000602082019050818103600083015261314e81613112565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061318b602083612285565b915061319682613155565b602082019050919050565b600060208201905081810360008301526131ba8161317e565b9050919050565b7f436f756e7465723a2064656372656d656e74206f766572666c6f770000000000600082015250565b60006131f7601b83612285565b9150613202826131c1565b602082019050919050565b60006020820190508181036000830152613226816131ea565b9050919050565b7f4d617820737570706c7920726561636865640000000000000000000000000000600082015250565b6000613263601283612285565b915061326e8261322d565b602082019050919050565b6000602082019050818103600083015261329281613256565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006132cf601983612285565b91506132da82613299565b602082019050919050565b600060208201905081810360008301526132fe816132c2565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000613361603283612285565b915061336c82613305565b604082019050919050565b6000602082019050818103600083015261339081613354565b9050919050565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b60006133f3602e83612285565b91506133fe82613397565b604082019050919050565b60006020820190508181036000830152613422816133e6565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261348b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261344e565b613495868361344e565b95508019841693508086168417925050509392505050565b6000819050919050565b60006134d26134cd6134c88461232c565b6134ad565b61232c565b9050919050565b6000819050919050565b6134ec836134b7565b6135006134f8826134d9565b84845461345b565b825550505050565b600090565b613515613508565b6135208184846134e3565b505050565b5b818110156135445761353960008261350d565b600181019050613526565b5050565b601f8211156135895761355a81613429565b6135638461343e565b81016020851015613572578190505b61358661357e8561343e565b830182613525565b50505b505050565b600082821c905092915050565b60006135ac6000198460080261358e565b1980831691505092915050565b60006135c5838361359b565b9150826002028217905092915050565b6135de8261227a565b67ffffffffffffffff8111156135f7576135f6612542565b5b61360182546129e0565b61360c828285613548565b600060209050601f83116001811461363f576000841561362d578287015190505b61363785826135b9565b86555061369f565b601f19841661364d86613429565b60005b8281101561367557848901518255600182019150602085019450602081019050613650565b86831015613692578489015161368e601f89168261359b565b8355505b6001600288020188555050505b505050505050565b600081519050919050565b600082825260208201905092915050565b60006136ce826136a7565b6136d881856136b2565b93506136e8818560208601612296565b6136f1816122c0565b840191505092915050565b600060808201905061371160008301876123c1565b61371e60208301866123c1565b61372b6040830185612457565b818103606083015261373d81846136c3565b905095945050505050565b600081519050613757816121eb565b92915050565b600060208284031215613773576137726121b5565b5b600061378184828501613748565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006137c0602083612285565b91506137cb8261378a565b602082019050919050565b600060208201905081810360008301526137ef816137b3565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061382c601c83612285565b9150613837826137f6565b602082019050919050565b6000602082019050818103600083015261385b8161381f565b905091905056fea26469706673582212200f6a8d11e0fe059101d84e0b5a16342fb91fe52cc5dc97cc56a3d3dda363fc5f64736f6c63430008120033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061014d5760003560e01c80635738f44e116100c3578063a22cb4651161007c578063a22cb46514610379578063b88d4fde14610395578063c63adb2b146103b1578063c87b56dd146103cf578063e985e9c5146103ff578063f2fde38b1461042f5761014d565b80635738f44e146102b75780636352211e146102d357806370a0823114610303578063715018a6146103335780638da5cb5b1461033d57806395d89b411461035b5761014d565b806323b872dd1161011557806323b872dd1461020a5780632a55205a1461022657806332cb6b0c146102575780633ccfd60b1461027557806342842e0e1461027f57806342966c681461029b5761014d565b806301ffc9a71461015257806306fdde0314610182578063081812fc146101a0578063095ea7b3146101d057806318160ddd146101ec575b600080fd5b61016c60048036038101906101679190612217565b61044b565b604051610179919061225f565b60405180910390f35b61018a6104ac565b604051610197919061230a565b60405180910390f35b6101ba60048036038101906101b59190612362565b61053e565b6040516101c791906123d0565b60405180910390f35b6101ea60048036038101906101e59190612417565b610584565b005b6101f461069b565b6040516102019190612466565b60405180910390f35b610224600480360381019061021f9190612481565b6106ac565b005b610240600480360381019061023b91906124d4565b61070c565b60405161024e929190612514565b60405180910390f35b61025f610743565b60405161026c9190612466565b60405180910390f35b61027d610748565b005b61029960048036038101906102949190612481565b61079f565b005b6102b560048036038101906102b09190612362565b6107bf565b005b6102d160048036038101906102cc9190612758565b610853565b005b6102ed60048036038101906102e89190612362565b6108fc565b6040516102fa91906123d0565b60405180910390f35b61031d600480360381019061031891906127b4565b610982565b60405161032a9190612466565b60405180910390f35b61033b610a39565b005b610345610a4d565b60405161035291906123d0565b60405180910390f35b610363610a77565b604051610370919061230a565b60405180910390f35b610393600480360381019061038e919061280d565b610b09565b005b6103af60048036038101906103aa91906128ee565b610b1f565b005b6103b9610b81565b6040516103c69190612466565b60405180910390f35b6103e960048036038101906103e49190612362565b610b87565b6040516103f6919061230a565b60405180910390f35b61041960048036038101906104149190612971565b610c99565b604051610426919061225f565b60405180910390f35b610449600480360381019061044491906127b4565b610d2d565b005b6000634906490660e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806104a557506104a482610db0565b5b9050919050565b6060600080546104bb906129e0565b80601f01602080910402602001604051908101604052809291908181526020018280546104e7906129e0565b80156105345780601f1061050957610100808354040283529160200191610534565b820191906000526020600020905b81548152906001019060200180831161051757829003601f168201915b5050505050905090565b600061054982610e92565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061058f826108fc565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036105ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105f690612a83565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661061e610edd565b73ffffffffffffffffffffffffffffffffffffffff16148061064d575061064c81610647610edd565b610c99565b5b61068c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068390612b15565b60405180910390fd5b6106968383610ee5565b505050565b60006106a76008610f9e565b905090565b6106bd6106b7610edd565b82610fac565b6106fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106f390612ba7565b60405180910390fd5b610707838383611041565b505050565b60008060006127106101f4856107229190612bf6565b61072c9190612c67565b9050610736610a4d565b8192509250509250929050565b606481565b61075061133a565b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561079b573d6000803e3d6000fd5b5050565b6107ba83838360405180602001604052806000815250610b1f565b505050565b6107c761133a565b3373ffffffffffffffffffffffffffffffffffffffff166107e7826108fc565b73ffffffffffffffffffffffffffffffffffffffff161461083d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083490612d0a565b60405180910390fd5b610846816113b8565b610850600861140b565b50565b61085b61133a565b606481516108696008610f9e565b6108739190612d2a565b11156108b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ab90612daa565b60405180910390fd5b60005b81518110156108f7576108e4838383815181106108d7576108d6612dca565b5b6020026020010151611467565b80806108ef90612df9565b9150506108b7565b505050565b600080610908836114e4565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610979576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097090612e8d565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036109f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e990612f1f565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610a4161133a565b610a4b6000611521565b565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610a86906129e0565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab2906129e0565b8015610aff5780601f10610ad457610100808354040283529160200191610aff565b820191906000526020600020905b815481529060010190602001808311610ae257829003601f168201915b5050505050905090565b610b1b610b14610edd565b83836115e7565b5050565b610b30610b2a610edd565b83610fac565b610b6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6690612ba7565b60405180910390fd5b610b7b84848484611753565b50505050565b6101f481565b6060610b9282610e92565b6000600660008481526020019081526020016000208054610bb2906129e0565b80601f0160208091040260200160405190810160405280929190818152602001828054610bde906129e0565b8015610c2b5780601f10610c0057610100808354040283529160200191610c2b565b820191906000526020600020905b815481529060010190602001808311610c0e57829003601f168201915b505050505090506000610c3c6117af565b90506000815103610c51578192505050610c94565b600082511115610c86578082604051602001610c6e929190612f7b565b60405160208183030381529060405292505050610c94565b610c8f846117c6565b925050505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610d3561133a565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610da4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9b90613011565b60405180910390fd5b610dad81611521565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610e7b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610e8b5750610e8a8261182e565b5b9050919050565b610e9b81611898565b610eda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed190612e8d565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610f58836108fc565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b600080610fb8836108fc565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610ffa5750610ff98185610c99565b5b8061103857508373ffffffffffffffffffffffffffffffffffffffff166110208461053e565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611061826108fc565b73ffffffffffffffffffffffffffffffffffffffff16146110b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ae906130a3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611126576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111d90613135565b60405180910390fd5b61113383838360016118d9565b8273ffffffffffffffffffffffffffffffffffffffff16611153826108fc565b73ffffffffffffffffffffffffffffffffffffffff16146111a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a0906130a3565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461133583838360016118df565b505050565b611342610edd565b73ffffffffffffffffffffffffffffffffffffffff16611360610a4d565b73ffffffffffffffffffffffffffffffffffffffff16146113b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ad906131a1565b60405180910390fd5b565b6113c1816118e5565b60006006600083815260200190815260200160002080546113e1906129e0565b90501461140857600660008281526020019081526020016000206000611407919061214e565b5b50565b60008160000154905060008111611457576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144e9061320d565b60405180910390fd5b6001810382600001819055505050565b60646114736008610f9e565b106114b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114aa90613279565b60405180910390fd5b6114bd6008611a33565b60006114c96008610f9e565b90506114d58382611a49565b6114df8183611a67565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611655576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164c906132e5565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611746919061225f565b60405180910390a3505050565b61175e848484611041565b61176a84848484611b0b565b6117a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a090613377565b60405180910390fd5b50505050565b606060405180602001604052806000815250905090565b60606117d182610e92565b60006117db6117af565b905060008151116117fb5760405180602001604052806000815250611826565b8061180584611c92565b604051602001611816929190612f7b565b6040516020818303038152906040525b915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166118ba836114e4565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b50505050565b50505050565b60006118f0826108fc565b90506119008160008460016118d9565b611909826108fc565b90506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611a2f8160008460016118df565b5050565b6001816000016000828254019250508190555050565b611a63828260405180602001604052806000815250611d60565b5050565b611a7082611898565b611aaf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa690613409565b60405180910390fd5b80600660008481526020019081526020016000209081611acf91906135d5565b507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce782604051611aff9190612466565b60405180910390a15050565b6000611b2c8473ffffffffffffffffffffffffffffffffffffffff16611dbb565b15611c85578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611b55610edd565b8786866040518563ffffffff1660e01b8152600401611b7794939291906136fc565b6020604051808303816000875af1925050508015611bb357506040513d601f19601f82011682018060405250810190611bb0919061375d565b60015b611c35573d8060008114611be3576040519150601f19603f3d011682016040523d82523d6000602084013e611be8565b606091505b506000815103611c2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2490613377565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611c8a565b600190505b949350505050565b606060006001611ca184611dde565b01905060008167ffffffffffffffff811115611cc057611cbf612542565b5b6040519080825280601f01601f191660200182016040528015611cf25781602001600182028036833780820191505090505b509050600082602001820190505b600115611d55578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611d4957611d48612c38565b5b04945060008503611d00575b819350505050919050565b611d6a8383611f31565b611d776000848484611b0b565b611db6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dad90613377565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611e3c577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381611e3257611e31612c38565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310611e79576d04ee2d6d415b85acef81000000008381611e6f57611e6e612c38565b5b0492506020810190505b662386f26fc100008310611ea857662386f26fc100008381611e9e57611e9d612c38565b5b0492506010810190505b6305f5e1008310611ed1576305f5e1008381611ec757611ec6612c38565b5b0492506008810190505b6127108310611ef6576127108381611eec57611eeb612c38565b5b0492506004810190505b60648310611f195760648381611f0f57611f0e612c38565b5b0492506002810190505b600a8310611f28576001810190505b80915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611fa0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f97906137d6565b60405180910390fd5b611fa981611898565b15611fe9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe090613842565b60405180910390fd5b611ff76000838360016118d9565b61200081611898565b15612040576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203790613842565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461214a6000838360016118df565b5050565b50805461215a906129e0565b6000825580601f1061216c575061218b565b601f01602090049060005260206000209081019061218a919061218e565b5b50565b5b808211156121a757600081600090555060010161218f565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6121f4816121bf565b81146121ff57600080fd5b50565b600081359050612211816121eb565b92915050565b60006020828403121561222d5761222c6121b5565b5b600061223b84828501612202565b91505092915050565b60008115159050919050565b61225981612244565b82525050565b60006020820190506122746000830184612250565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156122b4578082015181840152602081019050612299565b60008484015250505050565b6000601f19601f8301169050919050565b60006122dc8261227a565b6122e68185612285565b93506122f6818560208601612296565b6122ff816122c0565b840191505092915050565b6000602082019050818103600083015261232481846122d1565b905092915050565b6000819050919050565b61233f8161232c565b811461234a57600080fd5b50565b60008135905061235c81612336565b92915050565b600060208284031215612378576123776121b5565b5b60006123868482850161234d565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123ba8261238f565b9050919050565b6123ca816123af565b82525050565b60006020820190506123e560008301846123c1565b92915050565b6123f4816123af565b81146123ff57600080fd5b50565b600081359050612411816123eb565b92915050565b6000806040838503121561242e5761242d6121b5565b5b600061243c85828601612402565b925050602061244d8582860161234d565b9150509250929050565b6124608161232c565b82525050565b600060208201905061247b6000830184612457565b92915050565b60008060006060848603121561249a576124996121b5565b5b60006124a886828701612402565b93505060206124b986828701612402565b92505060406124ca8682870161234d565b9150509250925092565b600080604083850312156124eb576124ea6121b5565b5b60006124f98582860161234d565b925050602061250a8582860161234d565b9150509250929050565b600060408201905061252960008301856123c1565b6125366020830184612457565b9392505050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61257a826122c0565b810181811067ffffffffffffffff8211171561259957612598612542565b5b80604052505050565b60006125ac6121ab565b90506125b88282612571565b919050565b600067ffffffffffffffff8211156125d8576125d7612542565b5b602082029050602081019050919050565b600080fd5b600080fd5b600067ffffffffffffffff82111561260e5761260d612542565b5b612617826122c0565b9050602081019050919050565b82818337600083830152505050565b6000612646612641846125f3565b6125a2565b905082815260208101848484011115612662576126616125ee565b5b61266d848285612624565b509392505050565b600082601f83011261268a5761268961253d565b5b813561269a848260208601612633565b91505092915050565b60006126b66126b1846125bd565b6125a2565b905080838252602082019050602084028301858111156126d9576126d86125e9565b5b835b8181101561272057803567ffffffffffffffff8111156126fe576126fd61253d565b5b80860161270b8982612675565b855260208501945050506020810190506126db565b5050509392505050565b600082601f83011261273f5761273e61253d565b5b813561274f8482602086016126a3565b91505092915050565b6000806040838503121561276f5761276e6121b5565b5b600061277d85828601612402565b925050602083013567ffffffffffffffff81111561279e5761279d6121ba565b5b6127aa8582860161272a565b9150509250929050565b6000602082840312156127ca576127c96121b5565b5b60006127d884828501612402565b91505092915050565b6127ea81612244565b81146127f557600080fd5b50565b600081359050612807816127e1565b92915050565b60008060408385031215612824576128236121b5565b5b600061283285828601612402565b9250506020612843858286016127f8565b9150509250929050565b600067ffffffffffffffff82111561286857612867612542565b5b612871826122c0565b9050602081019050919050565b600061289161288c8461284d565b6125a2565b9050828152602081018484840111156128ad576128ac6125ee565b5b6128b8848285612624565b509392505050565b600082601f8301126128d5576128d461253d565b5b81356128e584826020860161287e565b91505092915050565b60008060008060808587031215612908576129076121b5565b5b600061291687828801612402565b945050602061292787828801612402565b93505060406129388782880161234d565b925050606085013567ffffffffffffffff811115612959576129586121ba565b5b612965878288016128c0565b91505092959194509250565b60008060408385031215612988576129876121b5565b5b600061299685828601612402565b92505060206129a785828601612402565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806129f857607f821691505b602082108103612a0b57612a0a6129b1565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612a6d602183612285565b9150612a7882612a11565b604082019050919050565b60006020820190508181036000830152612a9c81612a60565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000612aff603d83612285565b9150612b0a82612aa3565b604082019050919050565b60006020820190508181036000830152612b2e81612af2565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000612b91602d83612285565b9150612b9c82612b35565b604082019050919050565b60006020820190508181036000830152612bc081612b84565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612c018261232c565b9150612c0c8361232c565b9250828202612c1a8161232c565b91508282048414831517612c3157612c30612bc7565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612c728261232c565b9150612c7d8361232c565b925082612c8d57612c8c612c38565b5b828204905092915050565b7f596f7520617265206e6f7420746865206f776e6572206f66207468697320746f60008201527f6b656e0000000000000000000000000000000000000000000000000000000000602082015250565b6000612cf4602383612285565b9150612cff82612c98565b604082019050919050565b60006020820190508181036000830152612d2381612ce7565b9050919050565b6000612d358261232c565b9150612d408361232c565b9250828201905080821115612d5857612d57612bc7565b5b92915050565b7f45786365656473206d617820737570706c790000000000000000000000000000600082015250565b6000612d94601283612285565b9150612d9f82612d5e565b602082019050919050565b60006020820190508181036000830152612dc381612d87565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000612e048261232c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612e3657612e35612bc7565b5b600182019050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000612e77601883612285565b9150612e8282612e41565b602082019050919050565b60006020820190508181036000830152612ea681612e6a565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000612f09602983612285565b9150612f1482612ead565b604082019050919050565b60006020820190508181036000830152612f3881612efc565b9050919050565b600081905092915050565b6000612f558261227a565b612f5f8185612f3f565b9350612f6f818560208601612296565b80840191505092915050565b6000612f878285612f4a565b9150612f938284612f4a565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612ffb602683612285565b915061300682612f9f565b604082019050919050565b6000602082019050818103600083015261302a81612fee565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061308d602583612285565b915061309882613031565b604082019050919050565b600060208201905081810360008301526130bc81613080565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061311f602483612285565b915061312a826130c3565b604082019050919050565b6000602082019050818103600083015261314e81613112565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061318b602083612285565b915061319682613155565b602082019050919050565b600060208201905081810360008301526131ba8161317e565b9050919050565b7f436f756e7465723a2064656372656d656e74206f766572666c6f770000000000600082015250565b60006131f7601b83612285565b9150613202826131c1565b602082019050919050565b60006020820190508181036000830152613226816131ea565b9050919050565b7f4d617820737570706c7920726561636865640000000000000000000000000000600082015250565b6000613263601283612285565b915061326e8261322d565b602082019050919050565b6000602082019050818103600083015261329281613256565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006132cf601983612285565b91506132da82613299565b602082019050919050565b600060208201905081810360008301526132fe816132c2565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000613361603283612285565b915061336c82613305565b604082019050919050565b6000602082019050818103600083015261339081613354565b9050919050565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b60006133f3602e83612285565b91506133fe82613397565b604082019050919050565b60006020820190508181036000830152613422816133e6565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261348b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261344e565b613495868361344e565b95508019841693508086168417925050509392505050565b6000819050919050565b60006134d26134cd6134c88461232c565b6134ad565b61232c565b9050919050565b6000819050919050565b6134ec836134b7565b6135006134f8826134d9565b84845461345b565b825550505050565b600090565b613515613508565b6135208184846134e3565b505050565b5b818110156135445761353960008261350d565b600181019050613526565b5050565b601f8211156135895761355a81613429565b6135638461343e565b81016020851015613572578190505b61358661357e8561343e565b830182613525565b50505b505050565b600082821c905092915050565b60006135ac6000198460080261358e565b1980831691505092915050565b60006135c5838361359b565b9150826002028217905092915050565b6135de8261227a565b67ffffffffffffffff8111156135f7576135f6612542565b5b61360182546129e0565b61360c828285613548565b600060209050601f83116001811461363f576000841561362d578287015190505b61363785826135b9565b86555061369f565b601f19841661364d86613429565b60005b8281101561367557848901518255600182019150602085019450602081019050613650565b86831015613692578489015161368e601f89168261359b565b8355505b6001600288020188555050505b505050505050565b600081519050919050565b600082825260208201905092915050565b60006136ce826136a7565b6136d881856136b2565b93506136e8818560208601612296565b6136f1816122c0565b840191505092915050565b600060808201905061371160008301876123c1565b61371e60208301866123c1565b61372b6040830185612457565b818103606083015261373d81846136c3565b905095945050505050565b600081519050613757816121eb565b92915050565b600060208284031215613773576137726121b5565b5b600061378184828501613748565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006137c0602083612285565b91506137cb8261378a565b602082019050919050565b600060208201905081810360008301526137ef816137b3565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061382c601c83612285565b9150613837826137f6565b602082019050919050565b6000602082019050818103600083015261385b8161381f565b905091905056fea26469706673582212200f6a8d11e0fe059101d84e0b5a16342fb91fe52cc5dc97cc56a3d3dda363fc5f64736f6c63430008120033
Deployed Bytecode Sourcemap
62493:2134:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55579:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39009:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40521:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40039:416;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62929:98;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41221:301;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64241:383;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;62652:40;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62764:155;;;:::i;:::-;;41593:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63813:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63486:319;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38719:223;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38450:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59247:103;;;:::i;:::-;;58606:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39178:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40764:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41815:279;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64085:40;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55857:624;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40990:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59505:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55579:207;55681:4;55727:10;55720:18;;55705:33;;;:11;:33;;;;:73;;;;55742:36;55766:11;55742:23;:36::i;:::-;55705:73;55698:80;;55579:207;;;:::o;39009:100::-;39063:13;39096:5;39089:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39009:100;:::o;40521:171::-;40597:7;40617:23;40632:7;40617:14;:23::i;:::-;40660:15;:24;40676:7;40660:24;;;;;;;;;;;;;;;;;;;;;40653:31;;40521:171;;;:::o;40039:416::-;40120:13;40136:23;40151:7;40136:14;:23::i;:::-;40120:39;;40184:5;40178:11;;:2;:11;;;40170:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;40278:5;40262:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;40287:37;40304:5;40311:12;:10;:12::i;:::-;40287:16;:37::i;:::-;40262:62;40240:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;40426:21;40435:2;40439:7;40426:8;:21::i;:::-;40109:346;40039:416;;:::o;62929:98::-;62973:7;63000:19;:9;:17;:19::i;:::-;62993:26;;62929:98;:::o;41221:301::-;41382:41;41401:12;:10;:12::i;:::-;41415:7;41382:18;:41::i;:::-;41374:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;41486:28;41496:4;41502:2;41506:7;41486:9;:28::i;:::-;41221:301;;;:::o;64241:383::-;64378:16;64396:21;64435:15;64481:5;64122:3;64454:10;:23;;;;:::i;:::-;64453:33;;;;:::i;:::-;64435:51;;64530:7;:5;:7::i;:::-;64539;64522:25;;;;;64241:383;;;;;:::o;62652:40::-;62689:3;62652:40;:::o;62764:155::-;58492:13;:11;:13::i;:::-;62816:15:::1;62834:21;62816:39;;62878:10;62870:28;;:37;62899:7;62870:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;62801:118;62764:155::o:0;41593:151::-;41697:39;41714:4;41720:2;41724:7;41697:39;;;;;;;;;;;;:16;:39::i;:::-;41593:151;;;:::o;63813:204::-;58492:13;:11;:13::i;:::-;63900:10:::1;63880:30;;:16;63888:7;63880;:16::i;:::-;:30;;;63872:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;63967:14;63973:7;63967:5;:14::i;:::-;63990:21;:9;:19;:21::i;:::-;63813:204:::0;:::o;63486:319::-;58492:13;:11;:13::i;:::-;62689:3:::1;63619:12;:19;63597;:9;:17;:19::i;:::-;:41;;;;:::i;:::-;:55;;63589:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;63693:6;63688:110;63709:12;:19;63705:1;:23;63688:110;;;63750:36;63759:9;63770:12;63783:1;63770:15;;;;;;;;:::i;:::-;;;;;;;;63750:8;:36::i;:::-;63730:3;;;;;:::i;:::-;;;;63688:110;;;;63486:319:::0;;:::o;38719:223::-;38791:7;38811:13;38827:17;38836:7;38827:8;:17::i;:::-;38811:33;;38880:1;38863:19;;:5;:19;;;38855:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;38929:5;38922:12;;;38719:223;;;:::o;38450:207::-;38522:7;38567:1;38550:19;;:5;:19;;;38542:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;38633:9;:16;38643:5;38633:16;;;;;;;;;;;;;;;;38626:23;;38450:207;;;:::o;59247:103::-;58492:13;:11;:13::i;:::-;59312:30:::1;59339:1;59312:18;:30::i;:::-;59247:103::o:0;58606:87::-;58652:7;58679:6;;;;;;;;;;;58672:13;;58606:87;:::o;39178:104::-;39234:13;39267:7;39260:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39178:104;:::o;40764:155::-;40859:52;40878:12;:10;:12::i;:::-;40892:8;40902;40859:18;:52::i;:::-;40764:155;;:::o;41815:279::-;41946:41;41965:12;:10;:12::i;:::-;41979:7;41946:18;:41::i;:::-;41938:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;42048:38;42062:4;42068:2;42072:7;42081:4;42048:13;:38::i;:::-;41815:279;;;;:::o;64085:40::-;64122:3;64085:40;:::o;55857:624::-;55930:13;55956:23;55971:7;55956:14;:23::i;:::-;55992;56018:10;:19;56029:7;56018:19;;;;;;;;;;;55992:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56048:18;56069:10;:8;:10::i;:::-;56048:31;;56177:1;56161:4;56155:18;:23;56151:72;;56202:9;56195:16;;;;;;56151:72;56353:1;56333:9;56327:23;:27;56323:108;;;56402:4;56408:9;56385:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56371:48;;;;;;56323:108;56450:23;56465:7;56450:14;:23::i;:::-;56443:30;;;;55857:624;;;;:::o;40990:164::-;41087:4;41111:18;:25;41130:5;41111:25;;;;;;;;;;;;;;;:35;41137:8;41111:35;;;;;;;;;;;;;;;;;;;;;;;;;41104:42;;40990:164;;;;:::o;59505:201::-;58492:13;:11;:13::i;:::-;59614:1:::1;59594:22;;:8;:22;;::::0;59586:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;59670:28;59689:8;59670:18;:28::i;:::-;59505:201:::0;:::o;38081:305::-;38183:4;38235:25;38220:40;;;:11;:40;;;;:105;;;;38292:33;38277:48;;;:11;:48;;;;38220:105;:158;;;;38342:36;38366:11;38342:23;:36::i;:::-;38220:158;38200:178;;38081:305;;;:::o;50084:135::-;50166:16;50174:7;50166;:16::i;:::-;50158:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;50084:135;:::o;18115:98::-;18168:7;18195:10;18188:17;;18115:98;:::o;49397:174::-;49499:2;49472:15;:24;49488:7;49472:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;49555:7;49551:2;49517:46;;49526:23;49541:7;49526:14;:23::i;:::-;49517:46;;;;;;;;;;;;49397:174;;:::o;60936:114::-;61001:7;61028;:14;;;61021:21;;60936:114;;;:::o;44084:264::-;44177:4;44194:13;44210:23;44225:7;44210:14;:23::i;:::-;44194:39;;44263:5;44252:16;;:7;:16;;;:52;;;;44272:32;44289:5;44296:7;44272:16;:32::i;:::-;44252:52;:87;;;;44332:7;44308:31;;:20;44320:7;44308:11;:20::i;:::-;:31;;;44252:87;44244:96;;;44084:264;;;;:::o;48049:1229::-;48174:4;48147:31;;:23;48162:7;48147:14;:23::i;:::-;:31;;;48139:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;48253:1;48239:16;;:2;:16;;;48231:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;48309:42;48330:4;48336:2;48340:7;48349:1;48309:20;:42::i;:::-;48481:4;48454:31;;:23;48469:7;48454:14;:23::i;:::-;:31;;;48446:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;48599:15;:24;48615:7;48599:24;;;;;;;;;;;;48592:31;;;;;;;;;;;49094:1;49075:9;:15;49085:4;49075:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;49127:1;49110:9;:13;49120:2;49110:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;49169:2;49150:7;:16;49158:7;49150:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;49208:7;49204:2;49189:27;;49198:4;49189:27;;;;;;;;;;;;49229:41;49249:4;49255:2;49259:7;49268:1;49229:19;:41::i;:::-;48049:1229;;;:::o;58771:132::-;58846:12;:10;:12::i;:::-;58835:23;;:7;:5;:7::i;:::-;:23;;;58827:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58771:132::o;57160:206::-;57229:20;57241:7;57229:11;:20::i;:::-;57303:1;57272:10;:19;57283:7;57272:19;;;;;;;;;;;57266:33;;;;;:::i;:::-;;;:38;57262:97;;57328:10;:19;57339:7;57328:19;;;;;;;;;;;;57321:26;;;;:::i;:::-;57262:97;57160:206;:::o;61193:235::-;61257:13;61273:7;:14;;;61257:30;;61314:1;61306:5;:9;61298:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;61408:1;61400:5;:9;61383:7;:14;;:26;;;;61246:182;61193:235;:::o;63035:366::-;62689:3;63169:19;:9;:17;:19::i;:::-;:32;63161:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;63237:21;:9;:19;:21::i;:::-;63269:15;63287:19;:9;:17;:19::i;:::-;63269:37;;63319:29;63329:9;63340:7;63319:9;:29::i;:::-;63359:34;63372:7;63381:11;63359:12;:34::i;:::-;63108:293;63035:366;;:::o;43359:117::-;43425:7;43452;:16;43460:7;43452:16;;;;;;;;;;;;;;;;;;;;;43445:23;;43359:117;;;:::o;59866:191::-;59940:16;59959:6;;;;;;;;;;;59940:25;;59985:8;59976:6;;:17;;;;;;;;;;;;;;;;;;60040:8;60009:40;;60030:8;60009:40;;;;;;;;;;;;59929:128;59866:191;:::o;49714:281::-;49835:8;49826:17;;:5;:17;;;49818:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;49922:8;49884:18;:25;49903:5;49884:25;;;;;;;;;;;;;;;:35;49910:8;49884:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;49968:8;49946:41;;49961:5;49946:41;;;49978:8;49946:41;;;;;;:::i;:::-;;;;;;;;49714:281;;;:::o;42975:270::-;43088:28;43098:4;43104:2;43108:7;43088:9;:28::i;:::-;43135:47;43158:4;43164:2;43168:7;43177:4;43135:22;:47::i;:::-;43127:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;42975:270;;;;:::o;39883:94::-;39934:13;39960:9;;;;;;;;;;;;;;39883:94;:::o;39353:281::-;39426:13;39452:23;39467:7;39452:14;:23::i;:::-;39488:21;39512:10;:8;:10::i;:::-;39488:34;;39564:1;39546:7;39540:21;:25;:86;;;;;;;;;;;;;;;;;39592:7;39601:18;:7;:16;:18::i;:::-;39575:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;39540:86;39533:93;;;39353:281;;;:::o;36512:157::-;36597:4;36636:25;36621:40;;;:11;:40;;;;36614:47;;36512:157;;;:::o;43789:128::-;43854:4;43907:1;43878:31;;:17;43887:7;43878:8;:17::i;:::-;:31;;;;43871:38;;43789:128;;;:::o;52368:116::-;;;;;:::o;53206:115::-;;;;;:::o;46929:783::-;46989:13;47005:23;47020:7;47005:14;:23::i;:::-;46989:39;;47041:51;47062:5;47077:1;47081:7;47090:1;47041:20;:51::i;:::-;47205:23;47220:7;47205:14;:23::i;:::-;47197:31;;47276:15;:24;47292:7;47276:24;;;;;;;;;;;;47269:31;;;;;;;;;;;47541:1;47521:9;:16;47531:5;47521:16;;;;;;;;;;;;;;;;:21;;;;;;;;;;;47571:7;:16;47579:7;47571:16;;;;;;;;;;;;47564:23;;;;;;;;;;;47633:7;47629:1;47605:36;;47614:5;47605:36;;;;;;;;;;;;47654:50;47674:5;47689:1;47693:7;47702:1;47654:19;:50::i;:::-;46978:734;46929:783;:::o;61058:127::-;61165:1;61147:7;:14;;;:19;;;;;;;;;;;61058:127;:::o;44690:110::-;44766:26;44776:2;44780:7;44766:26;;;;;;;;;;;;:9;:26::i;:::-;44690:110;;:::o;56677:258::-;56777:16;56785:7;56777;:16::i;:::-;56769:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;56877:9;56855:10;:19;56866:7;56855:19;;;;;;;;;;;:31;;;;;;:::i;:::-;;56904:23;56919:7;56904:23;;;;;;:::i;:::-;;;;;;;;56677:258;;:::o;50783:853::-;50937:4;50958:15;:2;:13;;;:15::i;:::-;50954:675;;;51010:2;50994:36;;;51031:12;:10;:12::i;:::-;51045:4;51051:7;51060:4;50994:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;50990:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51252:1;51235:6;:13;:18;51231:328;;51278:60;;;;;;;;;;:::i;:::-;;;;;;;;51231:328;51509:6;51503:13;51494:6;51490:2;51486:15;51479:38;50990:584;51126:41;;;51116:51;;;:6;:51;;;;51109:58;;;;;50954:675;51613:4;51606:11;;50783:853;;;;;;;:::o;33247:716::-;33303:13;33354:14;33391:1;33371:17;33382:5;33371:10;:17::i;:::-;:21;33354:38;;33407:20;33441:6;33430:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33407:41;;33463:11;33592:6;33588:2;33584:15;33576:6;33572:28;33565:35;;33629:288;33636:4;33629:288;;;33661:5;;;;;;;;33803:8;33798:2;33791:5;33787:14;33782:30;33777:3;33769:44;33859:2;33850:11;;;;;;:::i;:::-;;;;;33893:1;33884:5;:10;33629:288;33880:21;33629:288;33938:6;33931:13;;;;;33247:716;;;:::o;45027:285::-;45122:18;45128:2;45132:7;45122:5;:18::i;:::-;45173:53;45204:1;45208:2;45212:7;45221:4;45173:22;:53::i;:::-;45151:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;45027:285;;;:::o;9277:326::-;9337:4;9594:1;9572:7;:19;;;:23;9565:30;;9277:326;;;:::o;28744:948::-;28797:7;28817:14;28834:1;28817:18;;28884:8;28875:5;:17;28871:106;;28922:8;28913:17;;;;;;:::i;:::-;;;;;28959:2;28949:12;;;;28871:106;29004:8;28995:5;:17;28991:106;;29042:8;29033:17;;;;;;:::i;:::-;;;;;29079:2;29069:12;;;;28991:106;29124:8;29115:5;:17;29111:106;;29162:8;29153:17;;;;;;:::i;:::-;;;;;29199:2;29189:12;;;;29111:106;29244:7;29235:5;:16;29231:103;;29281:7;29272:16;;;;;;:::i;:::-;;;;;29317:1;29307:11;;;;29231:103;29361:7;29352:5;:16;29348:103;;29398:7;29389:16;;;;;;:::i;:::-;;;;;29434:1;29424:11;;;;29348:103;29478:7;29469:5;:16;29465:103;;29515:7;29506:16;;;;;;:::i;:::-;;;;;29551:1;29541:11;;;;29465:103;29595:7;29586:5;:16;29582:68;;29633:1;29623:11;;;;29582:68;29678:6;29671:13;;;28744:948;;;:::o;45648:942::-;45742:1;45728:16;;:2;:16;;;45720:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;45801:16;45809:7;45801;:16::i;:::-;45800:17;45792:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;45863:48;45892:1;45896:2;45900:7;45909:1;45863:20;:48::i;:::-;46010:16;46018:7;46010;:16::i;:::-;46009:17;46001:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;46425:1;46408:9;:13;46418:2;46408:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;46469:2;46450:7;:16;46458:7;46450:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;46514:7;46510:2;46489:33;;46506:1;46489:33;;;;;;;;;;;;46535:47;46563:1;46567:2;46571:7;46580:1;46535:19;:47::i;:::-;45648:942;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::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:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:474::-;5935:6;5943;5992:2;5980:9;5971:7;5967:23;5963:32;5960:119;;;5998:79;;:::i;:::-;5960:119;6118:1;6143:53;6188:7;6179:6;6168:9;6164:22;6143:53;:::i;:::-;6133:63;;6089:117;6245:2;6271:53;6316:7;6307:6;6296:9;6292:22;6271:53;:::i;:::-;6261:63;;6216:118;5867:474;;;;;:::o;6347:332::-;6468:4;6506:2;6495:9;6491:18;6483:26;;6519:71;6587:1;6576:9;6572:17;6563:6;6519:71;:::i;:::-;6600:72;6668:2;6657:9;6653:18;6644:6;6600:72;:::i;:::-;6347:332;;;;;:::o;6685:117::-;6794:1;6791;6784:12;6808:180;6856:77;6853:1;6846:88;6953:4;6950:1;6943:15;6977:4;6974:1;6967:15;6994:281;7077:27;7099:4;7077:27;:::i;:::-;7069:6;7065:40;7207:6;7195:10;7192:22;7171:18;7159:10;7156:34;7153:62;7150:88;;;7218:18;;:::i;:::-;7150:88;7258:10;7254:2;7247:22;7037:238;6994:281;;:::o;7281:129::-;7315:6;7342:20;;:::i;:::-;7332:30;;7371:33;7399:4;7391:6;7371:33;:::i;:::-;7281:129;;;:::o;7416:321::-;7503:4;7593:18;7585:6;7582:30;7579:56;;;7615:18;;:::i;:::-;7579:56;7665:4;7657:6;7653:17;7645:25;;7725:4;7719;7715:15;7707:23;;7416:321;;;:::o;7743:117::-;7852:1;7849;7842:12;7866:117;7975:1;7972;7965:12;7989:308;8051:4;8141:18;8133:6;8130:30;8127:56;;;8163:18;;:::i;:::-;8127:56;8201:29;8223:6;8201:29;:::i;:::-;8193:37;;8285:4;8279;8275:15;8267:23;;7989:308;;;:::o;8303:146::-;8400:6;8395:3;8390;8377:30;8441:1;8432:6;8427:3;8423:16;8416:27;8303:146;;;:::o;8455:425::-;8533:5;8558:66;8574:49;8616:6;8574:49;:::i;:::-;8558:66;:::i;:::-;8549:75;;8647:6;8640:5;8633:21;8685:4;8678:5;8674:16;8723:3;8714:6;8709:3;8705:16;8702:25;8699:112;;;8730:79;;:::i;:::-;8699:112;8820:54;8867:6;8862:3;8857;8820:54;:::i;:::-;8539:341;8455:425;;;;;:::o;8900:340::-;8956:5;9005:3;8998:4;8990:6;8986:17;8982:27;8972:122;;9013:79;;:::i;:::-;8972:122;9130:6;9117:20;9155:79;9230:3;9222:6;9215:4;9207:6;9203:17;9155:79;:::i;:::-;9146:88;;8962:278;8900:340;;;;:::o;9262:945::-;9368:5;9393:91;9409:74;9476:6;9409:74;:::i;:::-;9393:91;:::i;:::-;9384:100;;9504:5;9533:6;9526:5;9519:21;9567:4;9560:5;9556:16;9549:23;;9620:4;9612:6;9608:17;9600:6;9596:30;9649:3;9641:6;9638:15;9635:122;;;9668:79;;:::i;:::-;9635:122;9783:6;9766:435;9800:6;9795:3;9792:15;9766:435;;;9889:3;9876:17;9925:18;9912:11;9909:35;9906:122;;;9947:79;;:::i;:::-;9906:122;10071:11;10063:6;10059:24;10109:47;10152:3;10140:10;10109:47;:::i;:::-;10104:3;10097:60;10186:4;10181:3;10177:14;10170:21;;9842:359;;9826:4;9821:3;9817:14;9810:21;;9766:435;;;9770:21;9374:833;;9262:945;;;;;:::o;10229:390::-;10310:5;10359:3;10352:4;10344:6;10340:17;10336:27;10326:122;;10367:79;;:::i;:::-;10326:122;10484:6;10471:20;10509:104;10609:3;10601:6;10594:4;10586:6;10582:17;10509:104;:::i;:::-;10500:113;;10316:303;10229:390;;;;:::o;10625:704::-;10728:6;10736;10785:2;10773:9;10764:7;10760:23;10756:32;10753:119;;;10791:79;;:::i;:::-;10753:119;10911:1;10936:53;10981:7;10972:6;10961:9;10957:22;10936:53;:::i;:::-;10926:63;;10882:117;11066:2;11055:9;11051:18;11038:32;11097:18;11089:6;11086:30;11083:117;;;11119:79;;:::i;:::-;11083:117;11224:88;11304:7;11295:6;11284:9;11280:22;11224:88;:::i;:::-;11214:98;;11009:313;10625:704;;;;;:::o;11335:329::-;11394:6;11443:2;11431:9;11422:7;11418:23;11414:32;11411:119;;;11449:79;;:::i;:::-;11411:119;11569:1;11594:53;11639:7;11630:6;11619:9;11615:22;11594:53;:::i;:::-;11584:63;;11540:117;11335:329;;;;:::o;11670:116::-;11740:21;11755:5;11740:21;:::i;:::-;11733:5;11730:32;11720:60;;11776:1;11773;11766:12;11720:60;11670:116;:::o;11792:133::-;11835:5;11873:6;11860:20;11851:29;;11889:30;11913:5;11889:30;:::i;:::-;11792:133;;;;:::o;11931:468::-;11996:6;12004;12053:2;12041:9;12032:7;12028:23;12024:32;12021:119;;;12059:79;;:::i;:::-;12021:119;12179:1;12204:53;12249:7;12240:6;12229:9;12225:22;12204:53;:::i;:::-;12194:63;;12150:117;12306:2;12332:50;12374:7;12365:6;12354:9;12350:22;12332:50;:::i;:::-;12322:60;;12277:115;11931:468;;;;;:::o;12405:307::-;12466:4;12556:18;12548:6;12545:30;12542:56;;;12578:18;;:::i;:::-;12542:56;12616:29;12638:6;12616:29;:::i;:::-;12608:37;;12700:4;12694;12690:15;12682:23;;12405:307;;;:::o;12718:423::-;12795:5;12820:65;12836:48;12877:6;12836:48;:::i;:::-;12820:65;:::i;:::-;12811:74;;12908:6;12901:5;12894:21;12946:4;12939:5;12935:16;12984:3;12975:6;12970:3;12966:16;12963:25;12960:112;;;12991:79;;:::i;:::-;12960:112;13081:54;13128:6;13123:3;13118;13081:54;:::i;:::-;12801:340;12718:423;;;;;:::o;13160:338::-;13215:5;13264:3;13257:4;13249:6;13245:17;13241:27;13231:122;;13272:79;;:::i;:::-;13231:122;13389:6;13376:20;13414:78;13488:3;13480:6;13473:4;13465:6;13461:17;13414:78;:::i;:::-;13405:87;;13221:277;13160:338;;;;:::o;13504:943::-;13599:6;13607;13615;13623;13672:3;13660:9;13651:7;13647:23;13643:33;13640:120;;;13679:79;;:::i;:::-;13640:120;13799:1;13824:53;13869:7;13860:6;13849:9;13845:22;13824:53;:::i;:::-;13814:63;;13770:117;13926:2;13952:53;13997:7;13988:6;13977:9;13973:22;13952:53;:::i;:::-;13942:63;;13897:118;14054:2;14080:53;14125:7;14116:6;14105:9;14101:22;14080:53;:::i;:::-;14070:63;;14025:118;14210:2;14199:9;14195:18;14182:32;14241:18;14233:6;14230:30;14227:117;;;14263:79;;:::i;:::-;14227:117;14368:62;14422:7;14413:6;14402:9;14398:22;14368:62;:::i;:::-;14358:72;;14153:287;13504:943;;;;;;;:::o;14453:474::-;14521:6;14529;14578:2;14566:9;14557:7;14553:23;14549:32;14546:119;;;14584:79;;:::i;:::-;14546:119;14704:1;14729:53;14774:7;14765:6;14754:9;14750:22;14729:53;:::i;:::-;14719:63;;14675:117;14831:2;14857:53;14902:7;14893:6;14882:9;14878:22;14857:53;:::i;:::-;14847:63;;14802:118;14453:474;;;;;:::o;14933:180::-;14981:77;14978:1;14971:88;15078:4;15075:1;15068:15;15102:4;15099:1;15092:15;15119:320;15163:6;15200:1;15194:4;15190:12;15180:22;;15247:1;15241:4;15237:12;15268:18;15258:81;;15324:4;15316:6;15312:17;15302:27;;15258:81;15386:2;15378:6;15375:14;15355:18;15352:38;15349:84;;15405:18;;:::i;:::-;15349:84;15170:269;15119:320;;;:::o;15445:220::-;15585:34;15581:1;15573:6;15569:14;15562:58;15654:3;15649:2;15641:6;15637:15;15630:28;15445:220;:::o;15671:366::-;15813:3;15834:67;15898:2;15893:3;15834:67;:::i;:::-;15827:74;;15910:93;15999:3;15910:93;:::i;:::-;16028:2;16023:3;16019:12;16012:19;;15671:366;;;:::o;16043:419::-;16209:4;16247:2;16236:9;16232:18;16224:26;;16296:9;16290:4;16286:20;16282:1;16271:9;16267:17;16260:47;16324:131;16450:4;16324:131;:::i;:::-;16316:139;;16043:419;;;:::o;16468:248::-;16608:34;16604:1;16596:6;16592:14;16585:58;16677:31;16672:2;16664:6;16660:15;16653:56;16468:248;:::o;16722:366::-;16864:3;16885:67;16949:2;16944:3;16885:67;:::i;:::-;16878:74;;16961:93;17050:3;16961:93;:::i;:::-;17079:2;17074:3;17070:12;17063:19;;16722:366;;;:::o;17094:419::-;17260:4;17298:2;17287:9;17283:18;17275:26;;17347:9;17341:4;17337:20;17333:1;17322:9;17318:17;17311:47;17375:131;17501:4;17375:131;:::i;:::-;17367:139;;17094:419;;;:::o;17519:232::-;17659:34;17655:1;17647:6;17643:14;17636:58;17728:15;17723:2;17715:6;17711:15;17704:40;17519:232;:::o;17757:366::-;17899:3;17920:67;17984:2;17979:3;17920:67;:::i;:::-;17913:74;;17996:93;18085:3;17996:93;:::i;:::-;18114:2;18109:3;18105:12;18098:19;;17757:366;;;:::o;18129:419::-;18295:4;18333:2;18322:9;18318:18;18310:26;;18382:9;18376:4;18372:20;18368:1;18357:9;18353:17;18346:47;18410:131;18536:4;18410:131;:::i;:::-;18402:139;;18129:419;;;:::o;18554:180::-;18602:77;18599:1;18592:88;18699:4;18696:1;18689:15;18723:4;18720:1;18713:15;18740:410;18780:7;18803:20;18821:1;18803:20;:::i;:::-;18798:25;;18837:20;18855:1;18837:20;:::i;:::-;18832:25;;18892:1;18889;18885:9;18914:30;18932:11;18914:30;:::i;:::-;18903:41;;19093:1;19084:7;19080:15;19077:1;19074:22;19054:1;19047:9;19027:83;19004:139;;19123:18;;:::i;:::-;19004:139;18788:362;18740:410;;;;:::o;19156:180::-;19204:77;19201:1;19194:88;19301:4;19298:1;19291:15;19325:4;19322:1;19315:15;19342:185;19382:1;19399:20;19417:1;19399:20;:::i;:::-;19394:25;;19433:20;19451:1;19433:20;:::i;:::-;19428:25;;19472:1;19462:35;;19477:18;;:::i;:::-;19462:35;19519:1;19516;19512:9;19507:14;;19342:185;;;;:::o;19533:222::-;19673:34;19669:1;19661:6;19657:14;19650:58;19742:5;19737:2;19729:6;19725:15;19718:30;19533:222;:::o;19761:366::-;19903:3;19924:67;19988:2;19983:3;19924:67;:::i;:::-;19917:74;;20000:93;20089:3;20000:93;:::i;:::-;20118:2;20113:3;20109:12;20102:19;;19761:366;;;:::o;20133:419::-;20299:4;20337:2;20326:9;20322:18;20314:26;;20386:9;20380:4;20376:20;20372:1;20361:9;20357:17;20350:47;20414:131;20540:4;20414:131;:::i;:::-;20406:139;;20133:419;;;:::o;20558:191::-;20598:3;20617:20;20635:1;20617:20;:::i;:::-;20612:25;;20651:20;20669:1;20651:20;:::i;:::-;20646:25;;20694:1;20691;20687:9;20680:16;;20715:3;20712:1;20709:10;20706:36;;;20722:18;;:::i;:::-;20706:36;20558:191;;;;:::o;20755:168::-;20895:20;20891:1;20883:6;20879:14;20872:44;20755:168;:::o;20929:366::-;21071:3;21092:67;21156:2;21151:3;21092:67;:::i;:::-;21085:74;;21168:93;21257:3;21168:93;:::i;:::-;21286:2;21281:3;21277:12;21270:19;;20929:366;;;:::o;21301:419::-;21467:4;21505:2;21494:9;21490:18;21482:26;;21554:9;21548:4;21544:20;21540:1;21529:9;21525:17;21518:47;21582:131;21708:4;21582:131;:::i;:::-;21574:139;;21301:419;;;:::o;21726:180::-;21774:77;21771:1;21764:88;21871:4;21868:1;21861:15;21895:4;21892:1;21885:15;21912:233;21951:3;21974:24;21992:5;21974:24;:::i;:::-;21965:33;;22020:66;22013:5;22010:77;22007:103;;22090:18;;:::i;:::-;22007:103;22137:1;22130:5;22126:13;22119:20;;21912:233;;;:::o;22151:174::-;22291:26;22287:1;22279:6;22275:14;22268:50;22151:174;:::o;22331:366::-;22473:3;22494:67;22558:2;22553:3;22494:67;:::i;:::-;22487:74;;22570:93;22659:3;22570:93;:::i;:::-;22688:2;22683:3;22679:12;22672:19;;22331:366;;;:::o;22703:419::-;22869:4;22907:2;22896:9;22892:18;22884:26;;22956:9;22950:4;22946:20;22942:1;22931:9;22927:17;22920:47;22984:131;23110:4;22984:131;:::i;:::-;22976:139;;22703:419;;;:::o;23128:228::-;23268:34;23264:1;23256:6;23252:14;23245:58;23337:11;23332:2;23324:6;23320:15;23313:36;23128:228;:::o;23362:366::-;23504:3;23525:67;23589:2;23584:3;23525:67;:::i;:::-;23518:74;;23601:93;23690:3;23601:93;:::i;:::-;23719:2;23714:3;23710:12;23703:19;;23362:366;;;:::o;23734:419::-;23900:4;23938:2;23927:9;23923:18;23915:26;;23987:9;23981:4;23977:20;23973:1;23962:9;23958:17;23951:47;24015:131;24141:4;24015:131;:::i;:::-;24007:139;;23734:419;;;:::o;24159:148::-;24261:11;24298:3;24283:18;;24159:148;;;;:::o;24313:390::-;24419:3;24447:39;24480:5;24447:39;:::i;:::-;24502:89;24584:6;24579:3;24502:89;:::i;:::-;24495:96;;24600:65;24658:6;24653:3;24646:4;24639:5;24635:16;24600:65;:::i;:::-;24690:6;24685:3;24681:16;24674:23;;24423:280;24313:390;;;;:::o;24709:435::-;24889:3;24911:95;25002:3;24993:6;24911:95;:::i;:::-;24904:102;;25023:95;25114:3;25105:6;25023:95;:::i;:::-;25016:102;;25135:3;25128:10;;24709:435;;;;;:::o;25150:225::-;25290:34;25286:1;25278:6;25274:14;25267:58;25359:8;25354:2;25346:6;25342:15;25335:33;25150:225;:::o;25381:366::-;25523:3;25544:67;25608:2;25603:3;25544:67;:::i;:::-;25537:74;;25620:93;25709:3;25620:93;:::i;:::-;25738:2;25733:3;25729:12;25722:19;;25381:366;;;:::o;25753:419::-;25919:4;25957:2;25946:9;25942:18;25934:26;;26006:9;26000:4;25996:20;25992:1;25981:9;25977:17;25970:47;26034:131;26160:4;26034:131;:::i;:::-;26026:139;;25753:419;;;:::o;26178:224::-;26318:34;26314:1;26306:6;26302:14;26295:58;26387:7;26382:2;26374:6;26370:15;26363:32;26178:224;:::o;26408:366::-;26550:3;26571:67;26635:2;26630:3;26571:67;:::i;:::-;26564:74;;26647:93;26736:3;26647:93;:::i;:::-;26765:2;26760:3;26756:12;26749:19;;26408:366;;;:::o;26780:419::-;26946:4;26984:2;26973:9;26969:18;26961:26;;27033:9;27027:4;27023:20;27019:1;27008:9;27004:17;26997:47;27061:131;27187:4;27061:131;:::i;:::-;27053:139;;26780:419;;;:::o;27205:223::-;27345:34;27341:1;27333:6;27329:14;27322:58;27414:6;27409:2;27401:6;27397:15;27390:31;27205:223;:::o;27434:366::-;27576:3;27597:67;27661:2;27656:3;27597:67;:::i;:::-;27590:74;;27673:93;27762:3;27673:93;:::i;:::-;27791:2;27786:3;27782:12;27775:19;;27434:366;;;:::o;27806:419::-;27972:4;28010:2;27999:9;27995:18;27987:26;;28059:9;28053:4;28049:20;28045:1;28034:9;28030:17;28023:47;28087:131;28213:4;28087:131;:::i;:::-;28079:139;;27806:419;;;:::o;28231:182::-;28371:34;28367:1;28359:6;28355:14;28348:58;28231:182;:::o;28419:366::-;28561:3;28582:67;28646:2;28641:3;28582:67;:::i;:::-;28575:74;;28658:93;28747:3;28658:93;:::i;:::-;28776:2;28771:3;28767:12;28760:19;;28419:366;;;:::o;28791:419::-;28957:4;28995:2;28984:9;28980:18;28972:26;;29044:9;29038:4;29034:20;29030:1;29019:9;29015:17;29008:47;29072:131;29198:4;29072:131;:::i;:::-;29064:139;;28791:419;;;:::o;29216:177::-;29356:29;29352:1;29344:6;29340:14;29333:53;29216:177;:::o;29399:366::-;29541:3;29562:67;29626:2;29621:3;29562:67;:::i;:::-;29555:74;;29638:93;29727:3;29638:93;:::i;:::-;29756:2;29751:3;29747:12;29740:19;;29399:366;;;:::o;29771:419::-;29937:4;29975:2;29964:9;29960:18;29952:26;;30024:9;30018:4;30014:20;30010:1;29999:9;29995:17;29988:47;30052:131;30178:4;30052:131;:::i;:::-;30044:139;;29771:419;;;:::o;30196:168::-;30336:20;30332:1;30324:6;30320:14;30313:44;30196:168;:::o;30370:366::-;30512:3;30533:67;30597:2;30592:3;30533:67;:::i;:::-;30526:74;;30609:93;30698:3;30609:93;:::i;:::-;30727:2;30722:3;30718:12;30711:19;;30370:366;;;:::o;30742:419::-;30908:4;30946:2;30935:9;30931:18;30923:26;;30995:9;30989:4;30985:20;30981:1;30970:9;30966:17;30959:47;31023:131;31149:4;31023:131;:::i;:::-;31015:139;;30742:419;;;:::o;31167:175::-;31307:27;31303:1;31295:6;31291:14;31284:51;31167:175;:::o;31348:366::-;31490:3;31511:67;31575:2;31570:3;31511:67;:::i;:::-;31504:74;;31587:93;31676:3;31587:93;:::i;:::-;31705:2;31700:3;31696:12;31689:19;;31348:366;;;:::o;31720:419::-;31886:4;31924:2;31913:9;31909:18;31901:26;;31973:9;31967:4;31963:20;31959:1;31948:9;31944:17;31937:47;32001:131;32127:4;32001:131;:::i;:::-;31993:139;;31720:419;;;:::o;32145:237::-;32285:34;32281:1;32273:6;32269:14;32262:58;32354:20;32349:2;32341:6;32337:15;32330:45;32145:237;:::o;32388:366::-;32530:3;32551:67;32615:2;32610:3;32551:67;:::i;:::-;32544:74;;32627:93;32716:3;32627:93;:::i;:::-;32745:2;32740:3;32736:12;32729:19;;32388:366;;;:::o;32760:419::-;32926:4;32964:2;32953:9;32949:18;32941:26;;33013:9;33007:4;33003:20;32999:1;32988:9;32984:17;32977:47;33041:131;33167:4;33041:131;:::i;:::-;33033:139;;32760:419;;;:::o;33185:233::-;33325:34;33321:1;33313:6;33309:14;33302:58;33394:16;33389:2;33381:6;33377:15;33370:41;33185:233;:::o;33424:366::-;33566:3;33587:67;33651:2;33646:3;33587:67;:::i;:::-;33580:74;;33663:93;33752:3;33663:93;:::i;:::-;33781:2;33776:3;33772:12;33765:19;;33424:366;;;:::o;33796:419::-;33962:4;34000:2;33989:9;33985:18;33977:26;;34049:9;34043:4;34039:20;34035:1;34024:9;34020:17;34013:47;34077:131;34203:4;34077:131;:::i;:::-;34069:139;;33796:419;;;:::o;34221:141::-;34270:4;34293:3;34285:11;;34316:3;34313:1;34306:14;34350:4;34347:1;34337:18;34329:26;;34221:141;;;:::o;34368:93::-;34405:6;34452:2;34447;34440:5;34436:14;34432:23;34422:33;;34368:93;;;:::o;34467:107::-;34511:8;34561:5;34555:4;34551:16;34530:37;;34467:107;;;;:::o;34580:393::-;34649:6;34699:1;34687:10;34683:18;34722:97;34752:66;34741:9;34722:97;:::i;:::-;34840:39;34870:8;34859:9;34840:39;:::i;:::-;34828:51;;34912:4;34908:9;34901:5;34897:21;34888:30;;34961:4;34951:8;34947:19;34940:5;34937:30;34927:40;;34656:317;;34580:393;;;;;:::o;34979:60::-;35007:3;35028:5;35021:12;;34979:60;;;:::o;35045:142::-;35095:9;35128:53;35146:34;35155:24;35173:5;35155:24;:::i;:::-;35146:34;:::i;:::-;35128:53;:::i;:::-;35115:66;;35045:142;;;:::o;35193:75::-;35236:3;35257:5;35250:12;;35193:75;;;:::o;35274:269::-;35384:39;35415:7;35384:39;:::i;:::-;35445:91;35494:41;35518:16;35494:41;:::i;:::-;35486:6;35479:4;35473:11;35445:91;:::i;:::-;35439:4;35432:105;35350:193;35274:269;;;:::o;35549:73::-;35594:3;35549:73;:::o;35628:189::-;35705:32;;:::i;:::-;35746:65;35804:6;35796;35790:4;35746:65;:::i;:::-;35681:136;35628:189;;:::o;35823:186::-;35883:120;35900:3;35893:5;35890:14;35883:120;;;35954:39;35991:1;35984:5;35954:39;:::i;:::-;35927:1;35920:5;35916:13;35907:22;;35883:120;;;35823:186;;:::o;36015:543::-;36116:2;36111:3;36108:11;36105:446;;;36150:38;36182:5;36150:38;:::i;:::-;36234:29;36252:10;36234:29;:::i;:::-;36224:8;36220:44;36417:2;36405:10;36402:18;36399:49;;;36438:8;36423:23;;36399:49;36461:80;36517:22;36535:3;36517:22;:::i;:::-;36507:8;36503:37;36490:11;36461:80;:::i;:::-;36120:431;;36105:446;36015:543;;;:::o;36564:117::-;36618:8;36668:5;36662:4;36658:16;36637:37;;36564:117;;;;:::o;36687:169::-;36731:6;36764:51;36812:1;36808:6;36800:5;36797:1;36793:13;36764:51;:::i;:::-;36760:56;36845:4;36839;36835:15;36825:25;;36738:118;36687:169;;;;:::o;36861:295::-;36937:4;37083:29;37108:3;37102:4;37083:29;:::i;:::-;37075:37;;37145:3;37142:1;37138:11;37132:4;37129:21;37121:29;;36861:295;;;;:::o;37161:1395::-;37278:37;37311:3;37278:37;:::i;:::-;37380:18;37372:6;37369:30;37366:56;;;37402:18;;:::i;:::-;37366:56;37446:38;37478:4;37472:11;37446:38;:::i;:::-;37531:67;37591:6;37583;37577:4;37531:67;:::i;:::-;37625:1;37649:4;37636:17;;37681:2;37673:6;37670:14;37698:1;37693:618;;;;38355:1;38372:6;38369:77;;;38421:9;38416:3;38412:19;38406:26;38397:35;;38369:77;38472:67;38532:6;38525:5;38472:67;:::i;:::-;38466:4;38459:81;38328:222;37663:887;;37693:618;37745:4;37741:9;37733:6;37729:22;37779:37;37811:4;37779:37;:::i;:::-;37838:1;37852:208;37866:7;37863:1;37860:14;37852:208;;;37945:9;37940:3;37936:19;37930:26;37922:6;37915:42;37996:1;37988:6;37984:14;37974:24;;38043:2;38032:9;38028:18;38015:31;;37889:4;37886:1;37882:12;37877:17;;37852:208;;;38088:6;38079:7;38076:19;38073:179;;;38146:9;38141:3;38137:19;38131:26;38189:48;38231:4;38223:6;38219:17;38208:9;38189:48;:::i;:::-;38181:6;38174:64;38096:156;38073:179;38298:1;38294;38286:6;38282:14;38278:22;38272:4;38265:36;37700:611;;;37663:887;;37253:1303;;;37161:1395;;:::o;38562:98::-;38613:6;38647:5;38641:12;38631:22;;38562:98;;;:::o;38666:168::-;38749:11;38783:6;38778:3;38771:19;38823:4;38818:3;38814:14;38799:29;;38666:168;;;;:::o;38840:373::-;38926:3;38954:38;38986:5;38954:38;:::i;:::-;39008:70;39071:6;39066:3;39008:70;:::i;:::-;39001:77;;39087:65;39145:6;39140:3;39133:4;39126:5;39122:16;39087:65;:::i;:::-;39177:29;39199:6;39177:29;:::i;:::-;39172:3;39168:39;39161:46;;38930:283;38840:373;;;;:::o;39219:640::-;39414:4;39452:3;39441:9;39437:19;39429:27;;39466:71;39534:1;39523:9;39519:17;39510:6;39466:71;:::i;:::-;39547:72;39615:2;39604:9;39600:18;39591:6;39547:72;:::i;:::-;39629;39697:2;39686:9;39682:18;39673:6;39629:72;:::i;:::-;39748:9;39742:4;39738:20;39733:2;39722:9;39718:18;39711:48;39776:76;39847:4;39838:6;39776:76;:::i;:::-;39768:84;;39219:640;;;;;;;:::o;39865:141::-;39921:5;39952:6;39946:13;39937:22;;39968:32;39994:5;39968:32;:::i;:::-;39865:141;;;;:::o;40012:349::-;40081:6;40130:2;40118:9;40109:7;40105:23;40101:32;40098:119;;;40136:79;;:::i;:::-;40098:119;40256:1;40281:63;40336:7;40327:6;40316:9;40312:22;40281:63;:::i;:::-;40271:73;;40227:127;40012:349;;;;:::o;40367:182::-;40507:34;40503:1;40495:6;40491:14;40484:58;40367:182;:::o;40555:366::-;40697:3;40718:67;40782:2;40777:3;40718:67;:::i;:::-;40711:74;;40794:93;40883:3;40794:93;:::i;:::-;40912:2;40907:3;40903:12;40896:19;;40555:366;;;:::o;40927:419::-;41093:4;41131:2;41120:9;41116:18;41108:26;;41180:9;41174:4;41170:20;41166:1;41155:9;41151:17;41144:47;41208:131;41334:4;41208:131;:::i;:::-;41200:139;;40927:419;;;:::o;41352:178::-;41492:30;41488:1;41480:6;41476:14;41469:54;41352:178;:::o;41536:366::-;41678:3;41699:67;41763:2;41758:3;41699:67;:::i;:::-;41692:74;;41775:93;41864:3;41775:93;:::i;:::-;41893:2;41888:3;41884:12;41877:19;;41536:366;;;:::o;41908:419::-;42074:4;42112:2;42101:9;42097:18;42089:26;;42161:9;42155:4;42151:20;42147:1;42136:9;42132:17;42125:47;42189:131;42315:4;42189:131;:::i;:::-;42181:139;;41908:419;;;:::o
Swarm Source
ipfs://0f6a8d11e0fe059101d84e0b5a16342fb91fe52cc5dc97cc56a3d3dda363fc5f
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.