Source Code
Overview
ETH Balance
0.0468 ETH
Token Holdings
More Info
ContractCreator
TokenTracker
Multichain Info
N/A
Latest 25 from a total of 69 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Mint | 3421730 | 20 days ago | IN | 0.001 ETH | 0.00042165 | ||||
Mint | 3151207 | 62 days ago | IN | 0.001 ETH | 0.00063468 | ||||
Mint | 3120195 | 67 days ago | IN | 0.001 ETH | 0.00042165 | ||||
Purchase NFT | 3044278 | 78 days ago | IN | 0.003 ETH | 0.00030647 | ||||
Mint | 3044276 | 78 days ago | IN | 0.001 ETH | 0.00045663 | ||||
List NFT | 3039551 | 79 days ago | IN | 0 ETH | 0.00035205 | ||||
Mint | 3033646 | 80 days ago | IN | 0.001 ETH | 0.00042165 | ||||
Mint | 3012756 | 83 days ago | IN | 0.001 ETH | 0.00042165 | ||||
Mint | 3005132 | 84 days ago | IN | 0.001 ETH | 0.00042165 | ||||
Mint | 3004966 | 84 days ago | IN | 0.001 ETH | 0.00042165 | ||||
Mint | 3004955 | 84 days ago | IN | 0.001 ETH | 0.00042165 | ||||
Mint | 2990086 | 86 days ago | IN | 0.001 ETH | 0.00042165 | ||||
List NFT | 2984475 | 87 days ago | IN | 0 ETH | 0.00035205 | ||||
Mint | 2984470 | 87 days ago | IN | 0.001 ETH | 0.00042165 | ||||
List NFT | 2984466 | 87 days ago | IN | 0 ETH | 0.00035208 | ||||
Mint | 2984463 | 87 days ago | IN | 0.001 ETH | 0.00042165 | ||||
Withdraw Funds | 2983660 | 87 days ago | IN | 0 ETH | 0.00006523 | ||||
Mint | 2983647 | 87 days ago | IN | 0.001 ETH | 0.00042165 | ||||
Mint | 2977032 | 88 days ago | IN | 0.001 ETH | 0.00042165 | ||||
List NFT | 2971920 | 89 days ago | IN | 0 ETH | 0.00037822 | ||||
List NFT | 2971892 | 89 days ago | IN | 0 ETH | 0.00037822 | ||||
List NFT | 2971884 | 89 days ago | IN | 0 ETH | 0.00037822 | ||||
Mint | 2971628 | 89 days ago | IN | 0.001 ETH | 0.00042165 | ||||
Mint | 2965259 | 90 days ago | IN | 0.001 ETH | 0.00042165 | ||||
Mint | 2965235 | 90 days ago | IN | 0.001 ETH | 0.00042165 |
Latest 6 internal transactions
Advanced mode:
Loading...
Loading
Contract Name:
SelvaPunks
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-12-05 */ // Sources flattened with hardhat v2.8.0 https://hardhat.org // File @openzeppelin/contracts/utils/introspection/[email protected] // 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/[email protected] // 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/[email protected] // 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/[email protected] // 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/[email protected] // 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/[email protected] // OpenZeppelin Contracts (last updated v4.9.4) (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; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } } // File @openzeppelin/contracts/utils/math/[email protected] // 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/[email protected] // 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/[email protected] // 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/[email protected] // 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/[email protected] // 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/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev See {ERC721-_beforeTokenTransfer}. */ function _beforeTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual override { super._beforeTokenTransfer(from, to, firstTokenId, batchSize); if (batchSize > 1) { // Will only trigger during construction. Batch transferring (minting) is not available afterwards. revert("ERC721Enumerable: consecutive transfers not supported"); } uint256 tokenId = firstTokenId; if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File @openzeppelin/contracts/interfaces/[email protected] // OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol) pragma solidity ^0.8.0; // File @openzeppelin/contracts/interfaces/[email protected] // OpenZeppelin Contracts v4.4.1 (interfaces/IERC721.sol) pragma solidity ^0.8.0; // File @openzeppelin/contracts/interfaces/[email protected] // 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/[email protected] // 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/[email protected] // 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/[email protected] // 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 contracts/SelvaPunks.sol pragma solidity ^0.8.4; contract SelvaPunks is ERC721Enumerable, ERC721URIStorage, Ownable { using Counters for Counters.Counter; uint256 public constant MAX_SUPPLY = 100; uint256 public constant MINT_PRICE = 0.001 ether; uint256 public constant MARKETPLACE_FEE_PERCENTAGE = 5; Counters.Counter private _tokenIdCounter; address public ORGANIZATION_WALLET = 0x6F023b4d92A1062F4768D8c89Ef5B1be275c9E83; struct MarketplaceListing { address seller; uint256 price; bool isActive; } struct Withdrawal { uint256 amount; uint256 timestamp; } mapping(uint256 => MarketplaceListing) public marketplaceListings; Withdrawal[] public withdrawals; uint256 public lastWithdrawalTimestamp; uint256 public totalMintRevenueSinceLastWithdrawal; uint256 public totalMarketplaceRevenueSinceLastWithdrawal; uint256 public totalMintRevenueRetirado; uint256 public totalMarketplaceRevenueRetirado; event NFTMinted(address indexed minter, uint256 tokenId, string tokenURI); event NFTListed(uint256 indexed tokenId, address indexed seller, uint256 price); event NFTDelisted(uint256 indexed tokenId); event NFTPurchased(uint256 indexed tokenId, address indexed buyer, address indexed seller, uint256 price, string tokenURI); event FundsWithdrawn(uint256 amount, uint256 timestamp); event MintRevenueUpdated(uint256 amount, uint256 timestamp); event MarketplaceRevenueUpdated(uint256 amount, uint256 timestamp); event MintRevenueRetirado(uint256 amount, uint256 timestamp); event MarketplaceRevenueRetirado(uint256 amount, uint256 timestamp); constructor(address _organizationWallet) ERC721("SelvaPunks", "SPKS") Ownable() { require(_organizationWallet != address(0), "Invalid organization wallet"); ORGANIZATION_WALLET = _organizationWallet; } function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) { super._burn(tokenId); } function supportsInterface(bytes4 interfaceId) public view override(ERC721Enumerable, ERC721URIStorage) returns (bool) { return super.supportsInterface(interfaceId); } function tokenURI(uint256 tokenId) public view override(ERC721, ERC721URIStorage) returns (string memory) { return super.tokenURI(tokenId); } function mint(uint256 quantity) public payable { require(quantity > 0, "Must mint at least 1 NFT"); require(_tokenIdCounter.current() + quantity <= MAX_SUPPLY, "Exceeds maximum supply"); require(msg.value == MINT_PRICE * quantity, "Incorrect payment amount"); totalMintRevenueSinceLastWithdrawal += msg.value; for (uint256 i = 0; i < quantity; i++) { uint256 newTokenId = _tokenIdCounter.current(); _tokenIdCounter.increment(); _safeMint(msg.sender, newTokenId); emit NFTMinted(msg.sender, newTokenId, tokenURI(newTokenId)); } emit MintRevenueUpdated(msg.value, block.timestamp); } function listNFT(uint256 tokenId, uint256 price) public { require(ownerOf(tokenId) == msg.sender, "Only owner can list"); require(price > 0, "Price must be greater than 0"); _transfer(msg.sender, address(this), tokenId); marketplaceListings[tokenId] = MarketplaceListing({ seller: msg.sender, price: price, isActive: true }); emit NFTListed(tokenId, msg.sender, price); } function purchaseNFT(uint256 tokenId) public payable { MarketplaceListing storage listing = marketplaceListings[tokenId]; require(listing.isActive, "NFT not for sale"); require(msg.value == listing.price, "Incorrect payment amount"); uint256 marketplaceFee = (msg.value * MARKETPLACE_FEE_PERCENTAGE) / 100; uint256 sellerProceeds = msg.value - marketplaceFee; totalMarketplaceRevenueSinceLastWithdrawal += marketplaceFee; payable(listing.seller).transfer(sellerProceeds); string memory tokenURI_ = tokenURI(tokenId); _transfer(address(this), msg.sender, tokenId); listing.isActive = false; emit NFTPurchased(tokenId, msg.sender, listing.seller, msg.value, tokenURI_); emit MarketplaceRevenueUpdated(marketplaceFee, block.timestamp); } function withdrawFunds() public { require(msg.sender == ORGANIZATION_WALLET, "Only organization can withdraw"); require(block.timestamp >= lastWithdrawalTimestamp + 30 days, "Withdrawals allowed once per month"); uint256 contractBalance = address(this).balance; require(contractBalance > 0, "No funds to withdraw"); lastWithdrawalTimestamp = block.timestamp; withdrawals.push(Withdrawal({ amount: contractBalance, timestamp: block.timestamp })); uint256 totalMintRevenue = totalMintRevenueSinceLastWithdrawal; uint256 totalMarketplaceRevenue = totalMarketplaceRevenueSinceLastWithdrawal; totalMintRevenueRetirado = totalMintRevenueSinceLastWithdrawal; totalMarketplaceRevenueRetirado = totalMarketplaceRevenueSinceLastWithdrawal; totalMintRevenueSinceLastWithdrawal = 0; totalMarketplaceRevenueSinceLastWithdrawal = 0; emit FundsWithdrawn(contractBalance, block.timestamp); emit MintRevenueUpdated(totalMintRevenue, block.timestamp); emit MarketplaceRevenueUpdated(totalMarketplaceRevenue, block.timestamp); (bool success, ) = ORGANIZATION_WALLET.call{value: contractBalance}(""); require(success, "Transfer failed"); } function getLastWithdrawals(uint256 n) public view returns (Withdrawal[] memory) { uint256 count = n > withdrawals.length ? withdrawals.length : n; Withdrawal[] memory recentWithdrawals = new Withdrawal[](count); for (uint256 i = 0; i < count; i++) { recentWithdrawals[i] = withdrawals[withdrawals.length - 1 - i]; } return recentWithdrawals; } function _baseURI() internal pure override returns (string memory) { return "https://raw.githubusercontent.com/itsMarck/SelvaPunks/main/imagenes/"; } function totalMinted() public view returns (uint256) { return _tokenIdCounter.current(); } function getMintRevenueBeforeLastWithdrawal() public view returns (uint256) { return totalMintRevenueSinceLastWithdrawal; } function getSalesRevenueBeforeLastWithdrawal() public view returns (uint256) { return totalMarketplaceRevenueSinceLastWithdrawal; } function getMintRevenueRetirado() public view returns (uint256) { return totalMintRevenueRetirado; } function getSalesRevenueRetirado() public view returns (uint256) { return totalMarketplaceRevenueRetirado; } function getLastWithdrawalTotal() public view returns (uint256) { uint256 totalWithdrawn = 0; for (uint256 i = 0; i < withdrawals.length; i++) { totalWithdrawn += withdrawals[i].amount; } return totalWithdrawn; } // Sobrescribir _beforeTokenTransfer para resolver conflictos function _beforeTokenTransfer( address from, address to, uint256 tokenId, uint256 batchSize ) internal override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId, batchSize); } }
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_organizationWallet","type":"address"}],"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":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"FundsWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"MarketplaceRevenueRetirado","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"MarketplaceRevenueUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"MetadataUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"MintRevenueRetirado","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"MintRevenueUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"NFTDelisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"seller","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"NFTListed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"tokenURI","type":"string"}],"name":"NFTMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":true,"internalType":"address","name":"seller","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"string","name":"tokenURI","type":"string"}],"name":"NFTPurchased","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":"MARKETPLACE_FEE_PERCENTAGE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ORGANIZATION_WALLET","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastWithdrawalTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"n","type":"uint256"}],"name":"getLastWithdrawals","outputs":[{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"internalType":"struct SelvaPunks.Withdrawal[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintRevenueBeforeLastWithdrawal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintRevenueRetirado","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSalesRevenueBeforeLastWithdrawal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSalesRevenueRetirado","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastWithdrawalTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"}],"name":"listNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"marketplaceListings","outputs":[{"internalType":"address","name":"seller","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"bool","name":"isActive","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"purchaseNFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMarketplaceRevenueRetirado","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMarketplaceRevenueSinceLastWithdrawal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMintRevenueRetirado","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMintRevenueSinceLastWithdrawal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"withdrawals","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6080604052736f023b4d92a1062f4768d8c89ef5b1be275c9e83600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200006657600080fd5b50604051620053ab380380620053ab83398181016040528101906200008c91906200039c565b6040518060400160405280600a81526020017f53656c766150756e6b73000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f53504b5300000000000000000000000000000000000000000000000000000000815250816000908051906020019062000110929190620002d5565b50806001908051906020019062000129929190620002d5565b5050506200014c620001406200020760201b60201c565b6200020f60201b60201c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415620001bf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001b690620003ef565b60405180910390fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050620004fe565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002e39062000456565b90600052602060002090601f01602090048101928262000307576000855562000353565b82601f106200032257805160ff191683800117855562000353565b8280016001018555821562000353579182015b828111156200035257825182559160200191906001019062000335565b5b50905062000362919062000366565b5090565b5b808211156200038157600081600090555060010162000367565b5090565b6000815190506200039681620004e4565b92915050565b600060208284031215620003af57600080fd5b6000620003bf8482850162000385565b91505092915050565b6000620003d7601b8362000411565b9150620003e482620004bb565b602082019050919050565b600060208201905081810360008301526200040a81620003c8565b9050919050565b600082825260208201905092915050565b60006200042f8262000436565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600060028204905060018216806200046f57607f821691505b602082108114156200048657620004856200048c565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f496e76616c6964206f7267616e697a6174696f6e2077616c6c65740000000000600082015250565b620004ef8162000422565b8114620004fb57600080fd5b50565b614e9d806200050e6000396000f3fe6080604052600436106102465760003560e01c80638da5cb5b11610139578063a62c4169116100b6578063c523585d1161007a578063c523585d1461086d578063c87b56dd146108aa578063e985e9c5146108e7578063f2fde38b14610924578063f4c2ad241461094d578063fe111c821461097857610246565b8063a62c416914610798578063b4a3748d146107c3578063b81b559a146107ee578063b88d4fde14610819578063c002d23d1461084257610246565b806396a4b34c116100fd57806396a4b34c146106d2578063a0712d68146106fd578063a22cb46514610719578063a2309ff814610742578063a2a7e9251461076d57610246565b80638da5cb5b146105fd5780638fa1598714610628578063905560ab1461065357806394383f141461067e57806395d89b41146106a757610246565b806342842e0e116101c75780636352211e1161018b5780636352211e1461051657806370a0823114610553578063715018a61461059057806381d9a51c146105a7578063872a2879146105d257610246565b806342842e0e1461040857806348c32093146104315780634f6ccce7146104705780635cc07076146104ad5780635d2d9e51146104eb57610246565b806318160ddd1161020e57806318160ddd1461033557806323b872dd1461036057806324600fc3146103895780632f745c59146103a057806332cb6b0c146103dd57610246565b806301ffc9a71461024b57806306fdde0314610288578063081812fc146102b3578063095ea7b3146102f0578063150bde0314610319575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d91906138db565b6109a3565b60405161027f9190613fc0565b60405180910390f35b34801561029457600080fd5b5061029d6109b5565b6040516102aa9190613fdb565b60405180910390f35b3480156102bf57600080fd5b506102da60048036038101906102d5919061392d565b610a47565b6040516102e79190613f00565b60405180910390f35b3480156102fc57600080fd5b506103176004803603810190610312919061389f565b610a8d565b005b610333600480360381019061032e919061392d565b610ba5565b005b34801561034157600080fd5b5061034a610e05565b604051610357919061433d565b60405180910390f35b34801561036c57600080fd5b5061038760048036038101906103829190613799565b610e12565b005b34801561039557600080fd5b5061039e610e72565b005b3480156103ac57600080fd5b506103c760048036038101906103c2919061389f565b6111a9565b6040516103d4919061433d565b60405180910390f35b3480156103e957600080fd5b506103f261124e565b6040516103ff919061433d565b60405180910390f35b34801561041457600080fd5b5061042f600480360381019061042a9190613799565b611253565b005b34801561043d57600080fd5b506104586004803603810190610453919061392d565b611273565b60405161046793929190613f67565b60405180910390f35b34801561047c57600080fd5b506104976004803603810190610492919061392d565b6112ca565b6040516104a4919061433d565b60405180910390f35b3480156104b957600080fd5b506104d460048036038101906104cf919061392d565b611361565b6040516104e2929190614388565b60405180910390f35b3480156104f757600080fd5b50610500611395565b60405161050d919061433d565b60405180910390f35b34801561052257600080fd5b5061053d6004803603810190610538919061392d565b61139f565b60405161054a9190613f00565b60405180910390f35b34801561055f57600080fd5b5061057a60048036038101906105759190613734565b611426565b604051610587919061433d565b60405180910390f35b34801561059c57600080fd5b506105a56114de565b005b3480156105b357600080fd5b506105bc6114f2565b6040516105c9919061433d565b60405180910390f35b3480156105de57600080fd5b506105e76114f8565b6040516105f4919061433d565b60405180910390f35b34801561060957600080fd5b506106126114fe565b60405161061f9190613f00565b60405180910390f35b34801561063457600080fd5b5061063d611528565b60405161064a919061433d565b60405180910390f35b34801561065f57600080fd5b50610668611532565b6040516106759190613f00565b60405180910390f35b34801561068a57600080fd5b506106a560048036038101906106a09190613956565b611558565b005b3480156106b357600080fd5b506106bc61172a565b6040516106c99190613fdb565b60405180910390f35b3480156106de57600080fd5b506106e76117bc565b6040516106f4919061433d565b60405180910390f35b6107176004803603810190610712919061392d565b6117c2565b005b34801561072557600080fd5b50610740600480360381019061073b9190613863565b6119a0565b005b34801561074e57600080fd5b506107576119b6565b604051610764919061433d565b60405180910390f35b34801561077957600080fd5b506107826119c7565b60405161078f919061433d565b60405180910390f35b3480156107a457600080fd5b506107ad6119d1565b6040516107ba919061433d565b60405180910390f35b3480156107cf57600080fd5b506107d86119d7565b6040516107e5919061433d565b60405180910390f35b3480156107fa57600080fd5b50610803611a62565b604051610810919061433d565b60405180910390f35b34801561082557600080fd5b50610840600480360381019061083b91906137e8565b611a6c565b005b34801561084e57600080fd5b50610857611ace565b604051610864919061433d565b60405180910390f35b34801561087957600080fd5b50610894600480360381019061088f919061392d565b611ad9565b6040516108a19190613f9e565b60405180910390f35b3480156108b657600080fd5b506108d160048036038101906108cc919061392d565b611c66565b6040516108de9190613fdb565b60405180910390f35b3480156108f357600080fd5b5061090e6004803603810190610909919061375d565b611c78565b60405161091b9190613fc0565b60405180910390f35b34801561093057600080fd5b5061094b60048036038101906109469190613734565b611d0c565b005b34801561095957600080fd5b50610962611d90565b60405161096f919061433d565b60405180910390f35b34801561098457600080fd5b5061098d611d95565b60405161099a919061433d565b60405180910390f35b60006109ae82611d9b565b9050919050565b6060600080546109c490614659565b80601f01602080910402602001604051908101604052809291908181526020018280546109f090614659565b8015610a3d5780601f10610a1257610100808354040283529160200191610a3d565b820191906000526020600020905b815481529060010190602001808311610a2057829003601f168201915b5050505050905090565b6000610a5282611dfc565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a988261139f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b009061425d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b28611e47565b73ffffffffffffffffffffffffffffffffffffffff161480610b575750610b5681610b51611e47565b611c78565b5b610b96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8d9061429d565b60405180910390fd5b610ba08383611e4f565b505050565b6000600e600083815260200190815260200160002090508060020160009054906101000a900460ff16610c0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c049061423d565b60405180910390fd5b80600101543414610c53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4a9061411d565b60405180910390fd5b60006064600534610c649190614515565b610c6e91906144e4565b905060008134610c7e919061456f565b90508160126000828254610c92919061448e565b925050819055508260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610d03573d6000803e3d6000fd5b506000610d0f85611c66565b9050610d1c303387611f08565b60008460020160006101000a81548160ff0219169083151502179055508360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16867ff591cf925d535eee5d7321d86daccdf216e5bf5c24de8e7f9bb2dc11bf360d4e3485604051610dbd929190614358565b60405180910390a47f6cf862fab92fb73dae1895d13ed4c2f10e8aab930281e31b889f6f017d8fbaa88342604051610df6929190614388565b60405180910390a15050505050565b6000600880549050905090565b610e23610e1d611e47565b82612202565b610e62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5990613ffd565b60405180910390fd5b610e6d838383611f08565b505050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef99061415d565b60405180910390fd5b62278d00601054610f13919061448e565b421015610f55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4c906141bd565b60405180910390fd5b600047905060008111610f9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f949061413d565b60405180910390fd5b42601081905550600f6040518060400160405280838152602001428152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550506000601154905060006012549050601154601381905550601254601481905550600060118190555060006012819055507fd66662c0ded9e58fd31d5e44944bcfd07ffc15e6927ecc1382e7941cb7bd24c4834260405161105b929190614388565b60405180910390a17f745f6e7706b5a51a2a014cdc44b43fb3eb24c4f46e518ae50aafae840f3634de8242604051611094929190614388565b60405180910390a17f6cf862fab92fb73dae1895d13ed4c2f10e8aab930281e31b889f6f017d8fbaa881426040516110cd929190614388565b60405180910390a16000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168460405161111d90613eeb565b60006040518083038185875af1925050503d806000811461115a576040519150601f19603f3d011682016040523d82523d6000602084013e61115f565b606091505b50509050806111a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119a9061407d565b60405180910390fd5b50505050565b60006111b483611426565b82106111f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ec9061401d565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b606481565b61126e83838360405180602001604052806000815250611a6c565b505050565b600e6020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020160009054906101000a900460ff16905083565b60006112d4610e05565b8210611315576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130c906142bd565b60405180910390fd5b6008828154811061134f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b600f818154811061137157600080fd5b90600052602060002090600202016000915090508060000154908060010154905082565b6000601354905090565b6000806113ab83612297565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561141d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114149061421d565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611497576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148e9061419d565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6114e66122d4565b6114f06000612352565b565b60115481565b60125481565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000601254905090565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b3373ffffffffffffffffffffffffffffffffffffffff166115788361139f565b73ffffffffffffffffffffffffffffffffffffffff16146115ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c5906142fd565b60405180910390fd5b60008111611611576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116089061431d565b60405180910390fd5b61161c333084611f08565b60405180606001604052803373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200160011515815250600e600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020160006101000a81548160ff0219169083151502179055509050503373ffffffffffffffffffffffffffffffffffffffff16827f5f9c03de076f5063cd3ebcfe8ef7aa8af378e4b35a83c77ba9777e97083879a28360405161171e919061433d565b60405180910390a35050565b60606001805461173990614659565b80601f016020809104026020016040519081016040528092919081815260200182805461176590614659565b80156117b25780601f10611787576101008083540402835291602001916117b2565b820191906000526020600020905b81548152906001019060200180831161179557829003601f168201915b5050505050905090565b60145481565b60008111611805576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117fc9061417d565b60405180910390fd5b606481611812600c612418565b61181c919061448e565b111561185d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118549061427d565b60405180910390fd5b8066038d7ea4c680006118709190614515565b34146118b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a89061411d565b60405180910390fd5b34601160008282546118c3919061448e565b9250508190555060005b818110156119635760006118e1600c612418565b90506118ed600c612426565b6118f7338261243c565b3373ffffffffffffffffffffffffffffffffffffffff167fd35bb95e09c04b219e35047ce7b7b300e3384264ef84a40456943dbc0fc17c148261193984611c66565b604051611947929190614358565b60405180910390a250808061195b906146bc565b9150506118cd565b507f745f6e7706b5a51a2a014cdc44b43fb3eb24c4f46e518ae50aafae840f3634de3442604051611995929190614388565b60405180910390a150565b6119b26119ab611e47565b838361245a565b5050565b60006119c2600c612418565b905090565b6000601454905090565b60105481565b6000806000905060005b600f80549050811015611a5a57600f8181548110611a28577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600202016000015482611a45919061448e565b91508080611a52906146bc565b9150506119e1565b508091505090565b6000601154905090565b611a7d611a77611e47565b83612202565b611abc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab390613ffd565b60405180910390fd5b611ac8848484846125c7565b50505050565b66038d7ea4c6800081565b60606000600f805490508311611aef5782611af6565b600f805490505b905060008167ffffffffffffffff811115611b3a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611b7357816020015b611b60613649565b815260200190600190039081611b585790505b50905060005b82811015611c5b57600f816001600f80549050611b96919061456f565b611ba0919061456f565b81548110611bd7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906002020160405180604001604052908160008201548152602001600182015481525050828281518110611c3d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101819052508080611c53906146bc565b915050611b79565b508092505050919050565b6060611c7182612623565b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611d146122d4565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7b9061405d565b60405180910390fd5b611d8d81612352565b50565b600581565b60135481565b6000634906490660e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611df55750611df482612736565b5b9050919050565b611e05816127b0565b611e44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3b9061421d565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611ec28361139f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b8273ffffffffffffffffffffffffffffffffffffffff16611f288261139f565b73ffffffffffffffffffffffffffffffffffffffff1614611f7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f759061409d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611fee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe5906140dd565b60405180910390fd5b611ffb83838360016127f1565b8273ffffffffffffffffffffffffffffffffffffffff1661201b8261139f565b73ffffffffffffffffffffffffffffffffffffffff1614612071576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120689061409d565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46121fd8383836001612803565b505050565b60008061220e8361139f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612250575061224f8185611c78565b5b8061228e57508373ffffffffffffffffffffffffffffffffffffffff1661227684610a47565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6122dc611e47565b73ffffffffffffffffffffffffffffffffffffffff166122fa6114fe565b73ffffffffffffffffffffffffffffffffffffffff1614612350576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612347906141fd565b60405180910390fd5b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081600001549050919050565b6001816000016000828254019250508190555050565b612456828260405180602001604052806000815250612809565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156124c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c0906140fd565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516125ba9190613fc0565b60405180910390a3505050565b6125d2848484611f08565b6125de84848484612864565b61261d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126149061403d565b60405180910390fd5b50505050565b606061262e82611dfc565b6000600a6000848152602001908152602001600020805461264e90614659565b80601f016020809104026020016040519081016040528092919081815260200182805461267a90614659565b80156126c75780601f1061269c576101008083540402835291602001916126c7565b820191906000526020600020905b8154815290600101906020018083116126aa57829003601f168201915b5050505050905060006126d86129fb565b90506000815114156126ee578192505050612731565b60008251111561272357808260405160200161270b929190613ec7565b60405160208183030381529060405292505050612731565b61272c84612a1b565b925050505b919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806127a957506127a882612a83565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166127d283612297565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6127fd84848484612b65565b50505050565b50505050565b6128138383612cc5565b6128206000848484612864565b61285f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128569061403d565b60405180910390fd5b505050565b60006128858473ffffffffffffffffffffffffffffffffffffffff16612ee3565b156129ee578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026128ae611e47565b8786866040518563ffffffff1660e01b81526004016128d09493929190613f1b565b602060405180830381600087803b1580156128ea57600080fd5b505af192505050801561291b57506040513d601f19601f820116820180604052508101906129189190613904565b60015b61299e573d806000811461294b576040519150601f19603f3d011682016040523d82523d6000602084013e612950565b606091505b50600081511415612996576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298d9061403d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506129f3565b600190505b949350505050565b6060604051806080016040528060448152602001614e2460449139905090565b6060612a2682611dfc565b6000612a306129fb565b90506000815111612a505760405180602001604052806000815250612a7b565b80612a5a84612f06565b604051602001612a6b929190613ec7565b6040516020818303038152906040525b915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612b4e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612b5e5750612b5d8261302a565b5b9050919050565b612b7184848484613094565b6001811115612bb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bac906142dd565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612bfd57612bf88161309a565b612c3c565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614612c3b57612c3a85826130e3565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612c7f57612c7a81613250565b612cbe565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612cbd57612cbc8482613393565b5b5b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2c906141dd565b60405180910390fd5b612d3e816127b0565b15612d7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d75906140bd565b60405180910390fd5b612d8c6000838360016127f1565b612d95816127b0565b15612dd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dcc906140bd565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612edf600083836001612803565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b606060006001612f1584613412565b01905060008167ffffffffffffffff811115612f5a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612f8c5781602001600182028036833780820191505090505b509050600082602001820190505b60011561301f578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581613009577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b049450600085141561301a5761301f565b612f9a565b819350505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016130f084611426565b6130fa919061456f565b90506000600760008481526020019081526020016000205490508181146131df576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613264919061456f565b90506000600960008481526020019081526020016000205490506000600883815481106132ba577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613302577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613377577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061339e83611426565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310613496577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161348c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b0492506040810190505b6d04ee2d6d415b85acef810000000083106134f9576d04ee2d6d415b85acef810000000083816134ef577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b0492506020810190505b662386f26fc10000831061354e57662386f26fc100008381613544577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b0492506010810190505b6305f5e100831061359d576305f5e1008381613593577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b0492506008810190505b61271083106135e85761271083816135de577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b0492506004810190505b606483106136315760648381613627577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b0492506002810190505b600a8310613640576001810190505b80915050919050565b604051806040016040528060008152602001600081525090565b6000613676613671846143d6565b6143b1565b90508281526020810184848401111561368e57600080fd5b613699848285614617565b509392505050565b6000813590506136b081614dc7565b92915050565b6000813590506136c581614dde565b92915050565b6000813590506136da81614df5565b92915050565b6000815190506136ef81614df5565b92915050565b600082601f83011261370657600080fd5b8135613716848260208601613663565b91505092915050565b60008135905061372e81614e0c565b92915050565b60006020828403121561374657600080fd5b6000613754848285016136a1565b91505092915050565b6000806040838503121561377057600080fd5b600061377e858286016136a1565b925050602061378f858286016136a1565b9150509250929050565b6000806000606084860312156137ae57600080fd5b60006137bc868287016136a1565b93505060206137cd868287016136a1565b92505060406137de8682870161371f565b9150509250925092565b600080600080608085870312156137fe57600080fd5b600061380c878288016136a1565b945050602061381d878288016136a1565b935050604061382e8782880161371f565b925050606085013567ffffffffffffffff81111561384b57600080fd5b613857878288016136f5565b91505092959194509250565b6000806040838503121561387657600080fd5b6000613884858286016136a1565b9250506020613895858286016136b6565b9150509250929050565b600080604083850312156138b257600080fd5b60006138c0858286016136a1565b92505060206138d18582860161371f565b9150509250929050565b6000602082840312156138ed57600080fd5b60006138fb848285016136cb565b91505092915050565b60006020828403121561391657600080fd5b6000613924848285016136e0565b91505092915050565b60006020828403121561393f57600080fd5b600061394d8482850161371f565b91505092915050565b6000806040838503121561396957600080fd5b60006139778582860161371f565b92505060206139888582860161371f565b9150509250929050565b600061399e8383613e7a565b60408301905092915050565b6139b3816145a3565b82525050565b60006139c482614417565b6139ce8185614445565b93506139d983614407565b8060005b83811015613a0a5781516139f18882613992565b97506139fc83614438565b9250506001810190506139dd565b5085935050505092915050565b613a20816145b5565b82525050565b6000613a3182614422565b613a3b8185614456565b9350613a4b818560208601614626565b613a54816147c1565b840191505092915050565b6000613a6a8261442d565b613a748185614472565b9350613a84818560208601614626565b613a8d816147c1565b840191505092915050565b6000613aa38261442d565b613aad8185614483565b9350613abd818560208601614626565b80840191505092915050565b6000613ad6602d83614472565b9150613ae1826147d2565b604082019050919050565b6000613af9602b83614472565b9150613b0482614821565b604082019050919050565b6000613b1c603283614472565b9150613b2782614870565b604082019050919050565b6000613b3f602683614472565b9150613b4a826148bf565b604082019050919050565b6000613b62600f83614472565b9150613b6d8261490e565b602082019050919050565b6000613b85602583614472565b9150613b9082614937565b604082019050919050565b6000613ba8601c83614472565b9150613bb382614986565b602082019050919050565b6000613bcb602483614472565b9150613bd6826149af565b604082019050919050565b6000613bee601983614472565b9150613bf9826149fe565b602082019050919050565b6000613c11601883614472565b9150613c1c82614a27565b602082019050919050565b6000613c34601483614472565b9150613c3f82614a50565b602082019050919050565b6000613c57601e83614472565b9150613c6282614a79565b602082019050919050565b6000613c7a601883614472565b9150613c8582614aa2565b602082019050919050565b6000613c9d602983614472565b9150613ca882614acb565b604082019050919050565b6000613cc0602283614472565b9150613ccb82614b1a565b604082019050919050565b6000613ce3602083614472565b9150613cee82614b69565b602082019050919050565b6000613d06602083614472565b9150613d1182614b92565b602082019050919050565b6000613d29601883614472565b9150613d3482614bbb565b602082019050919050565b6000613d4c601083614472565b9150613d5782614be4565b602082019050919050565b6000613d6f602183614472565b9150613d7a82614c0d565b604082019050919050565b6000613d92601683614472565b9150613d9d82614c5c565b602082019050919050565b6000613db5600083614467565b9150613dc082614c85565b600082019050919050565b6000613dd8603d83614472565b9150613de382614c88565b604082019050919050565b6000613dfb602c83614472565b9150613e0682614cd7565b604082019050919050565b6000613e1e603583614472565b9150613e2982614d26565b604082019050919050565b6000613e41601383614472565b9150613e4c82614d75565b602082019050919050565b6000613e64601c83614472565b9150613e6f82614d9e565b602082019050919050565b604082016000820151613e906000850182613ea9565b506020820151613ea36020850182613ea9565b50505050565b613eb28161460d565b82525050565b613ec18161460d565b82525050565b6000613ed38285613a98565b9150613edf8284613a98565b91508190509392505050565b6000613ef682613da8565b9150819050919050565b6000602082019050613f1560008301846139aa565b92915050565b6000608082019050613f3060008301876139aa565b613f3d60208301866139aa565b613f4a6040830185613eb8565b8181036060830152613f5c8184613a26565b905095945050505050565b6000606082019050613f7c60008301866139aa565b613f896020830185613eb8565b613f966040830184613a17565b949350505050565b60006020820190508181036000830152613fb881846139b9565b905092915050565b6000602082019050613fd56000830184613a17565b92915050565b60006020820190508181036000830152613ff58184613a5f565b905092915050565b6000602082019050818103600083015261401681613ac9565b9050919050565b6000602082019050818103600083015261403681613aec565b9050919050565b6000602082019050818103600083015261405681613b0f565b9050919050565b6000602082019050818103600083015261407681613b32565b9050919050565b6000602082019050818103600083015261409681613b55565b9050919050565b600060208201905081810360008301526140b681613b78565b9050919050565b600060208201905081810360008301526140d681613b9b565b9050919050565b600060208201905081810360008301526140f681613bbe565b9050919050565b6000602082019050818103600083015261411681613be1565b9050919050565b6000602082019050818103600083015261413681613c04565b9050919050565b6000602082019050818103600083015261415681613c27565b9050919050565b6000602082019050818103600083015261417681613c4a565b9050919050565b6000602082019050818103600083015261419681613c6d565b9050919050565b600060208201905081810360008301526141b681613c90565b9050919050565b600060208201905081810360008301526141d681613cb3565b9050919050565b600060208201905081810360008301526141f681613cd6565b9050919050565b6000602082019050818103600083015261421681613cf9565b9050919050565b6000602082019050818103600083015261423681613d1c565b9050919050565b6000602082019050818103600083015261425681613d3f565b9050919050565b6000602082019050818103600083015261427681613d62565b9050919050565b6000602082019050818103600083015261429681613d85565b9050919050565b600060208201905081810360008301526142b681613dcb565b9050919050565b600060208201905081810360008301526142d681613dee565b9050919050565b600060208201905081810360008301526142f681613e11565b9050919050565b6000602082019050818103600083015261431681613e34565b9050919050565b6000602082019050818103600083015261433681613e57565b9050919050565b60006020820190506143526000830184613eb8565b92915050565b600060408201905061436d6000830185613eb8565b818103602083015261437f8184613a5f565b90509392505050565b600060408201905061439d6000830185613eb8565b6143aa6020830184613eb8565b9392505050565b60006143bb6143cc565b90506143c7828261468b565b919050565b6000604051905090565b600067ffffffffffffffff8211156143f1576143f0614792565b5b6143fa826147c1565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006144998261460d565b91506144a48361460d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156144d9576144d8614705565b5b828201905092915050565b60006144ef8261460d565b91506144fa8361460d565b92508261450a57614509614734565b5b828204905092915050565b60006145208261460d565b915061452b8361460d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561456457614563614705565b5b828202905092915050565b600061457a8261460d565b91506145858361460d565b92508282101561459857614597614705565b5b828203905092915050565b60006145ae826145ed565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614644578082015181840152602081019050614629565b83811115614653576000848401525b50505050565b6000600282049050600182168061467157607f821691505b6020821081141561468557614684614763565b5b50919050565b614694826147c1565b810181811067ffffffffffffffff821117156146b3576146b2614792565b5b80604052505050565b60006146c78261460d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156146fa576146f9614705565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f5472616e73666572206661696c65640000000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f496e636f7272656374207061796d656e7420616d6f756e740000000000000000600082015250565b7f4e6f2066756e647320746f207769746864726177000000000000000000000000600082015250565b7f4f6e6c79206f7267616e697a6174696f6e2063616e2077697468647261770000600082015250565b7f4d757374206d696e74206174206c656173742031204e46540000000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f5769746864726177616c7320616c6c6f776564206f6e636520706572206d6f6e60008201527f7468000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4e4654206e6f7420666f722073616c6500000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f45786365656473206d6178696d756d20737570706c7900000000000000000000600082015250565b50565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b7f4f6e6c79206f776e65722063616e206c69737400000000000000000000000000600082015250565b7f5072696365206d7573742062652067726561746572207468616e203000000000600082015250565b614dd0816145a3565b8114614ddb57600080fd5b50565b614de7816145b5565b8114614df257600080fd5b50565b614dfe816145c1565b8114614e0957600080fd5b50565b614e158161460d565b8114614e2057600080fd5b5056fe68747470733a2f2f7261772e67697468756275736572636f6e74656e742e636f6d2f6974734d6172636b2f53656c766150756e6b732f6d61696e2f696d6167656e65732fa26469706673582212204d80a2029a05d8c76d3c17e91ee0fec7116aacf2982c8940c9af9e57aca3c59164736f6c634300080400330000000000000000000000006f023b4d92a1062f4768d8c89ef5b1be275c9e83
Deployed Bytecode
0x6080604052600436106102465760003560e01c80638da5cb5b11610139578063a62c4169116100b6578063c523585d1161007a578063c523585d1461086d578063c87b56dd146108aa578063e985e9c5146108e7578063f2fde38b14610924578063f4c2ad241461094d578063fe111c821461097857610246565b8063a62c416914610798578063b4a3748d146107c3578063b81b559a146107ee578063b88d4fde14610819578063c002d23d1461084257610246565b806396a4b34c116100fd57806396a4b34c146106d2578063a0712d68146106fd578063a22cb46514610719578063a2309ff814610742578063a2a7e9251461076d57610246565b80638da5cb5b146105fd5780638fa1598714610628578063905560ab1461065357806394383f141461067e57806395d89b41146106a757610246565b806342842e0e116101c75780636352211e1161018b5780636352211e1461051657806370a0823114610553578063715018a61461059057806381d9a51c146105a7578063872a2879146105d257610246565b806342842e0e1461040857806348c32093146104315780634f6ccce7146104705780635cc07076146104ad5780635d2d9e51146104eb57610246565b806318160ddd1161020e57806318160ddd1461033557806323b872dd1461036057806324600fc3146103895780632f745c59146103a057806332cb6b0c146103dd57610246565b806301ffc9a71461024b57806306fdde0314610288578063081812fc146102b3578063095ea7b3146102f0578063150bde0314610319575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d91906138db565b6109a3565b60405161027f9190613fc0565b60405180910390f35b34801561029457600080fd5b5061029d6109b5565b6040516102aa9190613fdb565b60405180910390f35b3480156102bf57600080fd5b506102da60048036038101906102d5919061392d565b610a47565b6040516102e79190613f00565b60405180910390f35b3480156102fc57600080fd5b506103176004803603810190610312919061389f565b610a8d565b005b610333600480360381019061032e919061392d565b610ba5565b005b34801561034157600080fd5b5061034a610e05565b604051610357919061433d565b60405180910390f35b34801561036c57600080fd5b5061038760048036038101906103829190613799565b610e12565b005b34801561039557600080fd5b5061039e610e72565b005b3480156103ac57600080fd5b506103c760048036038101906103c2919061389f565b6111a9565b6040516103d4919061433d565b60405180910390f35b3480156103e957600080fd5b506103f261124e565b6040516103ff919061433d565b60405180910390f35b34801561041457600080fd5b5061042f600480360381019061042a9190613799565b611253565b005b34801561043d57600080fd5b506104586004803603810190610453919061392d565b611273565b60405161046793929190613f67565b60405180910390f35b34801561047c57600080fd5b506104976004803603810190610492919061392d565b6112ca565b6040516104a4919061433d565b60405180910390f35b3480156104b957600080fd5b506104d460048036038101906104cf919061392d565b611361565b6040516104e2929190614388565b60405180910390f35b3480156104f757600080fd5b50610500611395565b60405161050d919061433d565b60405180910390f35b34801561052257600080fd5b5061053d6004803603810190610538919061392d565b61139f565b60405161054a9190613f00565b60405180910390f35b34801561055f57600080fd5b5061057a60048036038101906105759190613734565b611426565b604051610587919061433d565b60405180910390f35b34801561059c57600080fd5b506105a56114de565b005b3480156105b357600080fd5b506105bc6114f2565b6040516105c9919061433d565b60405180910390f35b3480156105de57600080fd5b506105e76114f8565b6040516105f4919061433d565b60405180910390f35b34801561060957600080fd5b506106126114fe565b60405161061f9190613f00565b60405180910390f35b34801561063457600080fd5b5061063d611528565b60405161064a919061433d565b60405180910390f35b34801561065f57600080fd5b50610668611532565b6040516106759190613f00565b60405180910390f35b34801561068a57600080fd5b506106a560048036038101906106a09190613956565b611558565b005b3480156106b357600080fd5b506106bc61172a565b6040516106c99190613fdb565b60405180910390f35b3480156106de57600080fd5b506106e76117bc565b6040516106f4919061433d565b60405180910390f35b6107176004803603810190610712919061392d565b6117c2565b005b34801561072557600080fd5b50610740600480360381019061073b9190613863565b6119a0565b005b34801561074e57600080fd5b506107576119b6565b604051610764919061433d565b60405180910390f35b34801561077957600080fd5b506107826119c7565b60405161078f919061433d565b60405180910390f35b3480156107a457600080fd5b506107ad6119d1565b6040516107ba919061433d565b60405180910390f35b3480156107cf57600080fd5b506107d86119d7565b6040516107e5919061433d565b60405180910390f35b3480156107fa57600080fd5b50610803611a62565b604051610810919061433d565b60405180910390f35b34801561082557600080fd5b50610840600480360381019061083b91906137e8565b611a6c565b005b34801561084e57600080fd5b50610857611ace565b604051610864919061433d565b60405180910390f35b34801561087957600080fd5b50610894600480360381019061088f919061392d565b611ad9565b6040516108a19190613f9e565b60405180910390f35b3480156108b657600080fd5b506108d160048036038101906108cc919061392d565b611c66565b6040516108de9190613fdb565b60405180910390f35b3480156108f357600080fd5b5061090e6004803603810190610909919061375d565b611c78565b60405161091b9190613fc0565b60405180910390f35b34801561093057600080fd5b5061094b60048036038101906109469190613734565b611d0c565b005b34801561095957600080fd5b50610962611d90565b60405161096f919061433d565b60405180910390f35b34801561098457600080fd5b5061098d611d95565b60405161099a919061433d565b60405180910390f35b60006109ae82611d9b565b9050919050565b6060600080546109c490614659565b80601f01602080910402602001604051908101604052809291908181526020018280546109f090614659565b8015610a3d5780601f10610a1257610100808354040283529160200191610a3d565b820191906000526020600020905b815481529060010190602001808311610a2057829003601f168201915b5050505050905090565b6000610a5282611dfc565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a988261139f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b009061425d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b28611e47565b73ffffffffffffffffffffffffffffffffffffffff161480610b575750610b5681610b51611e47565b611c78565b5b610b96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8d9061429d565b60405180910390fd5b610ba08383611e4f565b505050565b6000600e600083815260200190815260200160002090508060020160009054906101000a900460ff16610c0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c049061423d565b60405180910390fd5b80600101543414610c53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4a9061411d565b60405180910390fd5b60006064600534610c649190614515565b610c6e91906144e4565b905060008134610c7e919061456f565b90508160126000828254610c92919061448e565b925050819055508260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610d03573d6000803e3d6000fd5b506000610d0f85611c66565b9050610d1c303387611f08565b60008460020160006101000a81548160ff0219169083151502179055508360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16867ff591cf925d535eee5d7321d86daccdf216e5bf5c24de8e7f9bb2dc11bf360d4e3485604051610dbd929190614358565b60405180910390a47f6cf862fab92fb73dae1895d13ed4c2f10e8aab930281e31b889f6f017d8fbaa88342604051610df6929190614388565b60405180910390a15050505050565b6000600880549050905090565b610e23610e1d611e47565b82612202565b610e62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5990613ffd565b60405180910390fd5b610e6d838383611f08565b505050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef99061415d565b60405180910390fd5b62278d00601054610f13919061448e565b421015610f55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4c906141bd565b60405180910390fd5b600047905060008111610f9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f949061413d565b60405180910390fd5b42601081905550600f6040518060400160405280838152602001428152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550506000601154905060006012549050601154601381905550601254601481905550600060118190555060006012819055507fd66662c0ded9e58fd31d5e44944bcfd07ffc15e6927ecc1382e7941cb7bd24c4834260405161105b929190614388565b60405180910390a17f745f6e7706b5a51a2a014cdc44b43fb3eb24c4f46e518ae50aafae840f3634de8242604051611094929190614388565b60405180910390a17f6cf862fab92fb73dae1895d13ed4c2f10e8aab930281e31b889f6f017d8fbaa881426040516110cd929190614388565b60405180910390a16000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168460405161111d90613eeb565b60006040518083038185875af1925050503d806000811461115a576040519150601f19603f3d011682016040523d82523d6000602084013e61115f565b606091505b50509050806111a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119a9061407d565b60405180910390fd5b50505050565b60006111b483611426565b82106111f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ec9061401d565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b606481565b61126e83838360405180602001604052806000815250611a6c565b505050565b600e6020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020160009054906101000a900460ff16905083565b60006112d4610e05565b8210611315576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130c906142bd565b60405180910390fd5b6008828154811061134f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b600f818154811061137157600080fd5b90600052602060002090600202016000915090508060000154908060010154905082565b6000601354905090565b6000806113ab83612297565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561141d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114149061421d565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611497576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148e9061419d565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6114e66122d4565b6114f06000612352565b565b60115481565b60125481565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000601254905090565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b3373ffffffffffffffffffffffffffffffffffffffff166115788361139f565b73ffffffffffffffffffffffffffffffffffffffff16146115ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c5906142fd565b60405180910390fd5b60008111611611576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116089061431d565b60405180910390fd5b61161c333084611f08565b60405180606001604052803373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200160011515815250600e600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020160006101000a81548160ff0219169083151502179055509050503373ffffffffffffffffffffffffffffffffffffffff16827f5f9c03de076f5063cd3ebcfe8ef7aa8af378e4b35a83c77ba9777e97083879a28360405161171e919061433d565b60405180910390a35050565b60606001805461173990614659565b80601f016020809104026020016040519081016040528092919081815260200182805461176590614659565b80156117b25780601f10611787576101008083540402835291602001916117b2565b820191906000526020600020905b81548152906001019060200180831161179557829003601f168201915b5050505050905090565b60145481565b60008111611805576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117fc9061417d565b60405180910390fd5b606481611812600c612418565b61181c919061448e565b111561185d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118549061427d565b60405180910390fd5b8066038d7ea4c680006118709190614515565b34146118b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a89061411d565b60405180910390fd5b34601160008282546118c3919061448e565b9250508190555060005b818110156119635760006118e1600c612418565b90506118ed600c612426565b6118f7338261243c565b3373ffffffffffffffffffffffffffffffffffffffff167fd35bb95e09c04b219e35047ce7b7b300e3384264ef84a40456943dbc0fc17c148261193984611c66565b604051611947929190614358565b60405180910390a250808061195b906146bc565b9150506118cd565b507f745f6e7706b5a51a2a014cdc44b43fb3eb24c4f46e518ae50aafae840f3634de3442604051611995929190614388565b60405180910390a150565b6119b26119ab611e47565b838361245a565b5050565b60006119c2600c612418565b905090565b6000601454905090565b60105481565b6000806000905060005b600f80549050811015611a5a57600f8181548110611a28577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600202016000015482611a45919061448e565b91508080611a52906146bc565b9150506119e1565b508091505090565b6000601154905090565b611a7d611a77611e47565b83612202565b611abc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab390613ffd565b60405180910390fd5b611ac8848484846125c7565b50505050565b66038d7ea4c6800081565b60606000600f805490508311611aef5782611af6565b600f805490505b905060008167ffffffffffffffff811115611b3a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611b7357816020015b611b60613649565b815260200190600190039081611b585790505b50905060005b82811015611c5b57600f816001600f80549050611b96919061456f565b611ba0919061456f565b81548110611bd7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906002020160405180604001604052908160008201548152602001600182015481525050828281518110611c3d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101819052508080611c53906146bc565b915050611b79565b508092505050919050565b6060611c7182612623565b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611d146122d4565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7b9061405d565b60405180910390fd5b611d8d81612352565b50565b600581565b60135481565b6000634906490660e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611df55750611df482612736565b5b9050919050565b611e05816127b0565b611e44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3b9061421d565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611ec28361139f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b8273ffffffffffffffffffffffffffffffffffffffff16611f288261139f565b73ffffffffffffffffffffffffffffffffffffffff1614611f7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f759061409d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611fee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe5906140dd565b60405180910390fd5b611ffb83838360016127f1565b8273ffffffffffffffffffffffffffffffffffffffff1661201b8261139f565b73ffffffffffffffffffffffffffffffffffffffff1614612071576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120689061409d565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46121fd8383836001612803565b505050565b60008061220e8361139f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612250575061224f8185611c78565b5b8061228e57508373ffffffffffffffffffffffffffffffffffffffff1661227684610a47565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6122dc611e47565b73ffffffffffffffffffffffffffffffffffffffff166122fa6114fe565b73ffffffffffffffffffffffffffffffffffffffff1614612350576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612347906141fd565b60405180910390fd5b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081600001549050919050565b6001816000016000828254019250508190555050565b612456828260405180602001604052806000815250612809565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156124c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c0906140fd565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516125ba9190613fc0565b60405180910390a3505050565b6125d2848484611f08565b6125de84848484612864565b61261d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126149061403d565b60405180910390fd5b50505050565b606061262e82611dfc565b6000600a6000848152602001908152602001600020805461264e90614659565b80601f016020809104026020016040519081016040528092919081815260200182805461267a90614659565b80156126c75780601f1061269c576101008083540402835291602001916126c7565b820191906000526020600020905b8154815290600101906020018083116126aa57829003601f168201915b5050505050905060006126d86129fb565b90506000815114156126ee578192505050612731565b60008251111561272357808260405160200161270b929190613ec7565b60405160208183030381529060405292505050612731565b61272c84612a1b565b925050505b919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806127a957506127a882612a83565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166127d283612297565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6127fd84848484612b65565b50505050565b50505050565b6128138383612cc5565b6128206000848484612864565b61285f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128569061403d565b60405180910390fd5b505050565b60006128858473ffffffffffffffffffffffffffffffffffffffff16612ee3565b156129ee578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026128ae611e47565b8786866040518563ffffffff1660e01b81526004016128d09493929190613f1b565b602060405180830381600087803b1580156128ea57600080fd5b505af192505050801561291b57506040513d601f19601f820116820180604052508101906129189190613904565b60015b61299e573d806000811461294b576040519150601f19603f3d011682016040523d82523d6000602084013e612950565b606091505b50600081511415612996576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298d9061403d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506129f3565b600190505b949350505050565b6060604051806080016040528060448152602001614e2460449139905090565b6060612a2682611dfc565b6000612a306129fb565b90506000815111612a505760405180602001604052806000815250612a7b565b80612a5a84612f06565b604051602001612a6b929190613ec7565b6040516020818303038152906040525b915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612b4e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612b5e5750612b5d8261302a565b5b9050919050565b612b7184848484613094565b6001811115612bb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bac906142dd565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612bfd57612bf88161309a565b612c3c565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614612c3b57612c3a85826130e3565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612c7f57612c7a81613250565b612cbe565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612cbd57612cbc8482613393565b5b5b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2c906141dd565b60405180910390fd5b612d3e816127b0565b15612d7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d75906140bd565b60405180910390fd5b612d8c6000838360016127f1565b612d95816127b0565b15612dd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dcc906140bd565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612edf600083836001612803565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b606060006001612f1584613412565b01905060008167ffffffffffffffff811115612f5a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612f8c5781602001600182028036833780820191505090505b509050600082602001820190505b60011561301f578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581613009577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b049450600085141561301a5761301f565b612f9a565b819350505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016130f084611426565b6130fa919061456f565b90506000600760008481526020019081526020016000205490508181146131df576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613264919061456f565b90506000600960008481526020019081526020016000205490506000600883815481106132ba577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613302577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613377577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061339e83611426565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310613496577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161348c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b0492506040810190505b6d04ee2d6d415b85acef810000000083106134f9576d04ee2d6d415b85acef810000000083816134ef577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b0492506020810190505b662386f26fc10000831061354e57662386f26fc100008381613544577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b0492506010810190505b6305f5e100831061359d576305f5e1008381613593577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b0492506008810190505b61271083106135e85761271083816135de577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b0492506004810190505b606483106136315760648381613627577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b0492506002810190505b600a8310613640576001810190505b80915050919050565b604051806040016040528060008152602001600081525090565b6000613676613671846143d6565b6143b1565b90508281526020810184848401111561368e57600080fd5b613699848285614617565b509392505050565b6000813590506136b081614dc7565b92915050565b6000813590506136c581614dde565b92915050565b6000813590506136da81614df5565b92915050565b6000815190506136ef81614df5565b92915050565b600082601f83011261370657600080fd5b8135613716848260208601613663565b91505092915050565b60008135905061372e81614e0c565b92915050565b60006020828403121561374657600080fd5b6000613754848285016136a1565b91505092915050565b6000806040838503121561377057600080fd5b600061377e858286016136a1565b925050602061378f858286016136a1565b9150509250929050565b6000806000606084860312156137ae57600080fd5b60006137bc868287016136a1565b93505060206137cd868287016136a1565b92505060406137de8682870161371f565b9150509250925092565b600080600080608085870312156137fe57600080fd5b600061380c878288016136a1565b945050602061381d878288016136a1565b935050604061382e8782880161371f565b925050606085013567ffffffffffffffff81111561384b57600080fd5b613857878288016136f5565b91505092959194509250565b6000806040838503121561387657600080fd5b6000613884858286016136a1565b9250506020613895858286016136b6565b9150509250929050565b600080604083850312156138b257600080fd5b60006138c0858286016136a1565b92505060206138d18582860161371f565b9150509250929050565b6000602082840312156138ed57600080fd5b60006138fb848285016136cb565b91505092915050565b60006020828403121561391657600080fd5b6000613924848285016136e0565b91505092915050565b60006020828403121561393f57600080fd5b600061394d8482850161371f565b91505092915050565b6000806040838503121561396957600080fd5b60006139778582860161371f565b92505060206139888582860161371f565b9150509250929050565b600061399e8383613e7a565b60408301905092915050565b6139b3816145a3565b82525050565b60006139c482614417565b6139ce8185614445565b93506139d983614407565b8060005b83811015613a0a5781516139f18882613992565b97506139fc83614438565b9250506001810190506139dd565b5085935050505092915050565b613a20816145b5565b82525050565b6000613a3182614422565b613a3b8185614456565b9350613a4b818560208601614626565b613a54816147c1565b840191505092915050565b6000613a6a8261442d565b613a748185614472565b9350613a84818560208601614626565b613a8d816147c1565b840191505092915050565b6000613aa38261442d565b613aad8185614483565b9350613abd818560208601614626565b80840191505092915050565b6000613ad6602d83614472565b9150613ae1826147d2565b604082019050919050565b6000613af9602b83614472565b9150613b0482614821565b604082019050919050565b6000613b1c603283614472565b9150613b2782614870565b604082019050919050565b6000613b3f602683614472565b9150613b4a826148bf565b604082019050919050565b6000613b62600f83614472565b9150613b6d8261490e565b602082019050919050565b6000613b85602583614472565b9150613b9082614937565b604082019050919050565b6000613ba8601c83614472565b9150613bb382614986565b602082019050919050565b6000613bcb602483614472565b9150613bd6826149af565b604082019050919050565b6000613bee601983614472565b9150613bf9826149fe565b602082019050919050565b6000613c11601883614472565b9150613c1c82614a27565b602082019050919050565b6000613c34601483614472565b9150613c3f82614a50565b602082019050919050565b6000613c57601e83614472565b9150613c6282614a79565b602082019050919050565b6000613c7a601883614472565b9150613c8582614aa2565b602082019050919050565b6000613c9d602983614472565b9150613ca882614acb565b604082019050919050565b6000613cc0602283614472565b9150613ccb82614b1a565b604082019050919050565b6000613ce3602083614472565b9150613cee82614b69565b602082019050919050565b6000613d06602083614472565b9150613d1182614b92565b602082019050919050565b6000613d29601883614472565b9150613d3482614bbb565b602082019050919050565b6000613d4c601083614472565b9150613d5782614be4565b602082019050919050565b6000613d6f602183614472565b9150613d7a82614c0d565b604082019050919050565b6000613d92601683614472565b9150613d9d82614c5c565b602082019050919050565b6000613db5600083614467565b9150613dc082614c85565b600082019050919050565b6000613dd8603d83614472565b9150613de382614c88565b604082019050919050565b6000613dfb602c83614472565b9150613e0682614cd7565b604082019050919050565b6000613e1e603583614472565b9150613e2982614d26565b604082019050919050565b6000613e41601383614472565b9150613e4c82614d75565b602082019050919050565b6000613e64601c83614472565b9150613e6f82614d9e565b602082019050919050565b604082016000820151613e906000850182613ea9565b506020820151613ea36020850182613ea9565b50505050565b613eb28161460d565b82525050565b613ec18161460d565b82525050565b6000613ed38285613a98565b9150613edf8284613a98565b91508190509392505050565b6000613ef682613da8565b9150819050919050565b6000602082019050613f1560008301846139aa565b92915050565b6000608082019050613f3060008301876139aa565b613f3d60208301866139aa565b613f4a6040830185613eb8565b8181036060830152613f5c8184613a26565b905095945050505050565b6000606082019050613f7c60008301866139aa565b613f896020830185613eb8565b613f966040830184613a17565b949350505050565b60006020820190508181036000830152613fb881846139b9565b905092915050565b6000602082019050613fd56000830184613a17565b92915050565b60006020820190508181036000830152613ff58184613a5f565b905092915050565b6000602082019050818103600083015261401681613ac9565b9050919050565b6000602082019050818103600083015261403681613aec565b9050919050565b6000602082019050818103600083015261405681613b0f565b9050919050565b6000602082019050818103600083015261407681613b32565b9050919050565b6000602082019050818103600083015261409681613b55565b9050919050565b600060208201905081810360008301526140b681613b78565b9050919050565b600060208201905081810360008301526140d681613b9b565b9050919050565b600060208201905081810360008301526140f681613bbe565b9050919050565b6000602082019050818103600083015261411681613be1565b9050919050565b6000602082019050818103600083015261413681613c04565b9050919050565b6000602082019050818103600083015261415681613c27565b9050919050565b6000602082019050818103600083015261417681613c4a565b9050919050565b6000602082019050818103600083015261419681613c6d565b9050919050565b600060208201905081810360008301526141b681613c90565b9050919050565b600060208201905081810360008301526141d681613cb3565b9050919050565b600060208201905081810360008301526141f681613cd6565b9050919050565b6000602082019050818103600083015261421681613cf9565b9050919050565b6000602082019050818103600083015261423681613d1c565b9050919050565b6000602082019050818103600083015261425681613d3f565b9050919050565b6000602082019050818103600083015261427681613d62565b9050919050565b6000602082019050818103600083015261429681613d85565b9050919050565b600060208201905081810360008301526142b681613dcb565b9050919050565b600060208201905081810360008301526142d681613dee565b9050919050565b600060208201905081810360008301526142f681613e11565b9050919050565b6000602082019050818103600083015261431681613e34565b9050919050565b6000602082019050818103600083015261433681613e57565b9050919050565b60006020820190506143526000830184613eb8565b92915050565b600060408201905061436d6000830185613eb8565b818103602083015261437f8184613a5f565b90509392505050565b600060408201905061439d6000830185613eb8565b6143aa6020830184613eb8565b9392505050565b60006143bb6143cc565b90506143c7828261468b565b919050565b6000604051905090565b600067ffffffffffffffff8211156143f1576143f0614792565b5b6143fa826147c1565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006144998261460d565b91506144a48361460d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156144d9576144d8614705565b5b828201905092915050565b60006144ef8261460d565b91506144fa8361460d565b92508261450a57614509614734565b5b828204905092915050565b60006145208261460d565b915061452b8361460d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561456457614563614705565b5b828202905092915050565b600061457a8261460d565b91506145858361460d565b92508282101561459857614597614705565b5b828203905092915050565b60006145ae826145ed565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614644578082015181840152602081019050614629565b83811115614653576000848401525b50505050565b6000600282049050600182168061467157607f821691505b6020821081141561468557614684614763565b5b50919050565b614694826147c1565b810181811067ffffffffffffffff821117156146b3576146b2614792565b5b80604052505050565b60006146c78261460d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156146fa576146f9614705565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f5472616e73666572206661696c65640000000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f496e636f7272656374207061796d656e7420616d6f756e740000000000000000600082015250565b7f4e6f2066756e647320746f207769746864726177000000000000000000000000600082015250565b7f4f6e6c79206f7267616e697a6174696f6e2063616e2077697468647261770000600082015250565b7f4d757374206d696e74206174206c656173742031204e46540000000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f5769746864726177616c7320616c6c6f776564206f6e636520706572206d6f6e60008201527f7468000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4e4654206e6f7420666f722073616c6500000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f45786365656473206d6178696d756d20737570706c7900000000000000000000600082015250565b50565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b7f4f6e6c79206f776e65722063616e206c69737400000000000000000000000000600082015250565b7f5072696365206d7573742062652067726561746572207468616e203000000000600082015250565b614dd0816145a3565b8114614ddb57600080fd5b50565b614de7816145b5565b8114614df257600080fd5b50565b614dfe816145c1565b8114614e0957600080fd5b50565b614e158161460d565b8114614e2057600080fd5b5056fe68747470733a2f2f7261772e67697468756275736572636f6e74656e742e636f6d2f6974734d6172636b2f53656c766150756e6b732f6d61696e2f696d6167656e65732fa26469706673582212204d80a2029a05d8c76d3c17e91ee0fec7116aacf2982c8940c9af9e57aca3c59164736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000006f023b4d92a1062f4768d8c89ef5b1be275c9e83
-----Decoded View---------------
Arg [0] : _organizationWallet (address): 0x6F023b4d92A1062F4768D8c89Ef5B1be275c9E83
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000006f023b4d92a1062f4768d8c89ef5b1be275c9e83
Deployed Bytecode Sourcemap
69969:7730:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72010:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39283:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40795:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40313:416;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73650:861;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56966:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41495:301;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74519:1312;;;;;;;;;;;;;:::i;:::-;;56634:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70087:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41867:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70591:65;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;57156:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70663:31;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;76837:114;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38993:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38724:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67614:103;;;;;;;;;;;;;:::i;:::-;;70748:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70805:57;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66973:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76686:145;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70301:79;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73167:475;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39452:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70915:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72452:707;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41038:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76429:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76959:122;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70701:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77089:272;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76541:137;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42089:279;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70134:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75839:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72240:196;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41264:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67872:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70189:54;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70869:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72010:222;72159:4;72188:36;72212:11;72188:23;:36::i;:::-;72181:43;;72010:222;;;:::o;39283:100::-;39337:13;39370:5;39363:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39283:100;:::o;40795:171::-;40871:7;40891:23;40906:7;40891:14;:23::i;:::-;40934:15;:24;40950:7;40934:24;;;;;;;;;;;;;;;;;;;;;40927:31;;40795:171;;;:::o;40313:416::-;40394:13;40410:23;40425:7;40410:14;:23::i;:::-;40394:39;;40458:5;40452:11;;:2;:11;;;;40444:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;40552:5;40536:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;40561:37;40578:5;40585:12;:10;:12::i;:::-;40561:16;:37::i;:::-;40536:62;40514:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;40700:21;40709:2;40713:7;40700:8;:21::i;:::-;40313:416;;;:::o;73650:861::-;73714:34;73751:19;:28;73771:7;73751:28;;;;;;;;;;;73714:65;;73800:7;:16;;;;;;;;;;;;73792:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;73869:7;:13;;;73856:9;:26;73848:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;73924:22;73992:3;70242:1;73950:9;:38;;;;:::i;:::-;73949:46;;;;:::i;:::-;73924:71;;74006:22;74043:14;74031:9;:26;;;;:::i;:::-;74006:51;;74116:14;74070:42;;:60;;;;;;;:::i;:::-;;;;;;;;74151:7;:14;;;;;;;;;;;;74143:32;;:48;74176:14;74143:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74204:23;74230:17;74239:7;74230:8;:17::i;:::-;74204:43;;74260:45;74278:4;74285:10;74297:7;74260:9;:45::i;:::-;74335:5;74316:7;:16;;;:24;;;;;;;;;;;;;;;;;;74392:7;:14;;;;;;;;;;;;74358:71;;74380:10;74358:71;;74371:7;74358:71;74408:9;74419;74358:71;;;;;;;:::i;:::-;;;;;;;;74445:58;74471:14;74487:15;74445:58;;;;;;;:::i;:::-;;;;;;;;73650:861;;;;;:::o;56966:113::-;57027:7;57054:10;:17;;;;57047:24;;56966:113;:::o;41495:301::-;41656:41;41675:12;:10;:12::i;:::-;41689:7;41656:18;:41::i;:::-;41648:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;41760:28;41770:4;41776:2;41780:7;41760:9;:28::i;:::-;41495:301;;;:::o;74519:1312::-;74584:19;;;;;;;;;;;74570:33;;:10;:33;;;74562:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;74702:7;74676:23;;:33;;;;:::i;:::-;74657:15;:52;;74649:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;74761:23;74787:21;74761:47;;74845:1;74827:15;:19;74819:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;74910:15;74884:23;:41;;;;74938:11;74955:67;;;;;;;;74976:15;74955:67;;;;75004:15;74955:67;;;74938:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75036:24;75063:35;;75036:62;;75109:31;75143:42;;75109:76;;75235:35;;75208:24;:62;;;;75315:42;;75281:31;:76;;;;75408:1;75370:35;:39;;;;75465:1;75420:42;:46;;;;75484:48;75499:15;75516;75484:48;;;;;;;:::i;:::-;;;;;;;;75548:53;75567:16;75585:15;75548:53;;;;;;;:::i;:::-;;;;;;;;75617:67;75643:23;75668:15;75617:67;;;;;;;:::i;:::-;;;;;;;;75707:12;75725:19;;;;;;;;;;;:24;;75757:15;75725:52;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75706:71;;;75796:7;75788:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;74519:1312;;;;:::o;56634:256::-;56731:7;56767:23;56784:5;56767:16;:23::i;:::-;56759:5;:31;56751:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;56856:12;:19;56869:5;56856:19;;;;;;;;;;;;;;;:26;56876:5;56856:26;;;;;;;;;;;;56849:33;;56634:256;;;;:::o;70087:40::-;70124:3;70087:40;:::o;41867:151::-;41971:39;41988:4;41994:2;41998:7;41971:39;;;;;;;;;;;;:16;:39::i;:::-;41867:151;;;:::o;70591:65::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;57156:233::-;57231:7;57267:30;:28;:30::i;:::-;57259:5;:38;57251:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;57364:10;57375:5;57364:17;;;;;;;;;;;;;;;;;;;;;;;;57357:24;;57156:233;;;:::o;70663:31::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;76837:114::-;76892:7;76919:24;;76912:31;;76837:114;:::o;38993:223::-;39065:7;39085:13;39101:17;39110:7;39101:8;:17::i;:::-;39085:33;;39154:1;39137:19;;:5;:19;;;;39129:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;39203:5;39196:12;;;38993:223;;;:::o;38724:207::-;38796:7;38841:1;38824:19;;:5;:19;;;;38816:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;38907:9;:16;38917:5;38907:16;;;;;;;;;;;;;;;;38900:23;;38724:207;;;:::o;67614:103::-;66859:13;:11;:13::i;:::-;67679:30:::1;67706:1;67679:18;:30::i;:::-;67614:103::o:0;70748:50::-;;;;:::o;70805:57::-;;;;:::o;66973:87::-;67019:7;67046:6;;;;;;;;;;;67039:13;;66973:87;:::o;76686:145::-;76754:7;76781:42;;76774:49;;76686:145;:::o;70301:79::-;;;;;;;;;;;;;:::o;73167:475::-;73262:10;73242:30;;:16;73250:7;73242;:16::i;:::-;:30;;;73234:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;73323:1;73315:5;:9;73307:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;73370:45;73380:10;73400:4;73407:7;73370:9;:45::i;:::-;73459:120;;;;;;;;73501:10;73459:120;;;;;;73533:5;73459:120;;;;73563:4;73459:120;;;;;73428:19;:28;73448:7;73428:28;;;;;;;;;;;:151;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73616:10;73597:37;;73607:7;73597:37;73628:5;73597:37;;;;;;:::i;:::-;;;;;;;;73167:475;;:::o;39452:104::-;39508:13;39541:7;39534:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39452:104;:::o;70915:46::-;;;;:::o;72452:707::-;72529:1;72518:8;:12;72510:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;70124:3;72606:8;72578:25;:15;:23;:25::i;:::-;:36;;;;:::i;:::-;:50;;72570:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;72700:8;70171:11;72687:21;;;;:::i;:::-;72674:9;:34;72666:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;72789:9;72750:35;;:48;;;;;;;:::i;:::-;;;;;;;;72816:9;72811:277;72835:8;72831:1;:12;72811:277;;;72865:18;72886:25;:15;:23;:25::i;:::-;72865:46;;72926:27;:15;:25;:27::i;:::-;72968:33;72978:10;72990;72968:9;:33::i;:::-;73031:10;73021:55;;;73043:10;73055:20;73064:10;73055:8;:20::i;:::-;73021:55;;;;;;;:::i;:::-;;;;;;;;72811:277;72845:3;;;;;:::i;:::-;;;;72811:277;;;;73105:46;73124:9;73135:15;73105:46;;;;;;;:::i;:::-;;;;;;;;72452:707;:::o;41038:155::-;41133:52;41152:12;:10;:12::i;:::-;41166:8;41176;41133:18;:52::i;:::-;41038:155;;:::o;76429:104::-;76473:7;76500:25;:15;:23;:25::i;:::-;76493:32;;76429:104;:::o;76959:122::-;77015:7;77042:31;;77035:38;;76959:122;:::o;70701:38::-;;;;:::o;77089:272::-;77144:7;77164:22;77189:1;77164:26;;77206:9;77201:115;77225:11;:18;;;;77221:1;:22;77201:115;;;77283:11;77295:1;77283:14;;;;;;;;;;;;;;;;;;;;;;;;;;:21;;;77265:39;;;;;:::i;:::-;;;77245:3;;;;;:::i;:::-;;;;77201:115;;;;77333:14;77326:21;;;77089:272;:::o;76541:137::-;76608:7;76635:35;;76628:42;;76541:137;:::o;42089:279::-;42220:41;42239:12;:10;:12::i;:::-;42253:7;42220:18;:41::i;:::-;42212:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;42322:38;42336:4;42342:2;42346:7;42355:4;42322:13;:38::i;:::-;42089:279;;;;:::o;70134:48::-;70171:11;70134:48;:::o;75839:411::-;75899:19;75931:13;75951:11;:18;;;;75947:1;:22;:47;;75993:1;75947:47;;;75972:11;:18;;;;75947:47;75931:63;;76005:37;76062:5;76045:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;76005:63;;76086:9;76081:125;76105:5;76101:1;:9;76081:125;;;76155:11;76192:1;76188;76167:11;:18;;;;:22;;;;:::i;:::-;:26;;;;:::i;:::-;76155:39;;;;;;;;;;;;;;;;;;;;;;;;;;76132:62;;;;;;;;;;;;;;;;;;;;;;;;;:17;76150:1;76132:20;;;;;;;;;;;;;;;;;;;;;:62;;;;76112:3;;;;;:::i;:::-;;;;76081:125;;;;76225:17;76218:24;;;;75839:411;;;:::o;72240:196::-;72367:13;72405:23;72420:7;72405:14;:23::i;:::-;72398:30;;72240:196;;;:::o;41264:164::-;41361:4;41385:18;:25;41404:5;41385:25;;;;;;;;;;;;;;;:35;41411:8;41385:35;;;;;;;;;;;;;;;;;;;;;;;;;41378:42;;41264:164;;;;:::o;67872:201::-;66859:13;:11;:13::i;:::-;67981:1:::1;67961:22;;:8;:22;;;;67953:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;68037:28;68056:8;68037:18;:28::i;:::-;67872:201:::0;:::o;70189:54::-;70242:1;70189:54;:::o;70869:39::-;;;;:::o;63938:207::-;64040:4;64086:10;64079:18;;64064:33;;;:11;:33;;;;:73;;;;64101:36;64125:11;64101:23;:36::i;:::-;64064:73;64057:80;;63938:207;;;:::o;50358:135::-;50440:16;50448:7;50440;:16::i;:::-;50432:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;50358:135;:::o;18240:98::-;18293:7;18320:10;18313:17;;18240:98;:::o;49671:174::-;49773:2;49746:15;:24;49762:7;49746:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;49829:7;49825:2;49791:46;;49800:23;49815:7;49800:14;:23::i;:::-;49791:46;;;;;;;;;;;;49671:174;;:::o;48323:1229::-;48448:4;48421:31;;:23;48436:7;48421:14;:23::i;:::-;:31;;;48413:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;48527:1;48513:16;;:2;:16;;;;48505:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;48583:42;48604:4;48610:2;48614:7;48623:1;48583:20;:42::i;:::-;48755:4;48728:31;;:23;48743:7;48728:14;:23::i;:::-;:31;;;48720:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;48873:15;:24;48889:7;48873:24;;;;;;;;;;;;48866:31;;;;;;;;;;;49368:1;49349:9;:15;49359:4;49349:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;49401:1;49384:9;:13;49394:2;49384:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;49443:2;49424:7;:16;49432:7;49424:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;49482:7;49478:2;49463:27;;49472:4;49463:27;;;;;;;;;;;;49503:41;49523:4;49529:2;49533:7;49542:1;49503:19;:41::i;:::-;48323:1229;;;:::o;44358:264::-;44451:4;44468:13;44484:23;44499:7;44484:14;:23::i;:::-;44468:39;;44537:5;44526:16;;:7;:16;;;:52;;;;44546:32;44563:5;44570:7;44546:16;:32::i;:::-;44526:52;:87;;;;44606:7;44582:31;;:20;44594:7;44582:11;:20::i;:::-;:31;;;44526:87;44518:96;;;44358:264;;;;:::o;43633:117::-;43699:7;43726;:16;43734:7;43726:16;;;;;;;;;;;;;;;;;;;;;43719:23;;43633:117;;;:::o;67138:132::-;67213:12;:10;:12::i;:::-;67202:23;;:7;:5;:7::i;:::-;:23;;;67194:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67138:132::o;68233:191::-;68307:16;68326:6;;;;;;;;;;;68307:25;;68352:8;68343:6;;:17;;;;;;;;;;;;;;;;;;68407:8;68376:40;;68397:8;68376:40;;;;;;;;;;;;68233:191;;:::o;69311:114::-;69376:7;69403;:14;;;69396:21;;69311:114;;;:::o;69433:127::-;69540:1;69522:7;:14;;;:19;;;;;;;;;;;69433:127;:::o;44964:110::-;45040:26;45050:2;45054:7;45040:26;;;;;;;;;;;;:9;:26::i;:::-;44964:110;;:::o;49988:281::-;50109:8;50100:17;;:5;:17;;;;50092:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;50196:8;50158:18;:25;50177:5;50158:25;;;;;;;;;;;;;;;:35;50184:8;50158:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;50242:8;50220:41;;50235:5;50220:41;;;50252:8;50220:41;;;;;;:::i;:::-;;;;;;;;49988:281;;;:::o;43249:270::-;43362:28;43372:4;43378:2;43382:7;43362:9;:28::i;:::-;43409:47;43432:4;43438:2;43442:7;43451:4;43409:22;:47::i;:::-;43401:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;43249:270;;;;:::o;64216:624::-;64289:13;64315:23;64330:7;64315:14;:23::i;:::-;64351;64377:10;:19;64388:7;64377:19;;;;;;;;;;;64351:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64407:18;64428:10;:8;:10::i;:::-;64407:31;;64536:1;64520:4;64514:18;:23;64510:72;;;64561:9;64554:16;;;;;;64510:72;64712:1;64692:9;64686:23;:27;64682:108;;;64761:4;64767:9;64744:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;64730:48;;;;;;64682:108;64809:23;64824:7;64809:14;:23::i;:::-;64802:30;;;;64216:624;;;;:::o;56326:224::-;56428:4;56467:35;56452:50;;;:11;:50;;;;:90;;;;56506:36;56530:11;56506:23;:36::i;:::-;56452:90;56445:97;;56326:224;;;:::o;44063:128::-;44128:4;44181:1;44152:31;;:17;44161:7;44152:8;:17::i;:::-;:31;;;;44145:38;;44063:128;;;:::o;77442:254::-;77632:56;77659:4;77665:2;77669:7;77678:9;77632:26;:56::i;:::-;77442:254;;;;:::o;53480:115::-;;;;;:::o;45301:285::-;45396:18;45402:2;45406:7;45396:5;:18::i;:::-;45447:53;45478:1;45482:2;45486:7;45495:4;45447:22;:53::i;:::-;45425:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;45301:285;;;:::o;51057:853::-;51211:4;51232:15;:2;:13;;;:15::i;:::-;51228:675;;;51284:2;51268:36;;;51305:12;:10;:12::i;:::-;51319:4;51325:7;51334:4;51268:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;51264:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51526:1;51509:6;:13;:18;51505:328;;;51552:60;;;;;;;;;;:::i;:::-;;;;;;;;51505:328;51783:6;51777:13;51768:6;51764:2;51760:15;51753:38;51264:584;51400:41;;;51390:51;;;:6;:51;;;;51383:58;;;;;51228:675;51887:4;51880:11;;51057:853;;;;;;;:::o;76258:163::-;76310:13;76336:77;;;;;;;;;;;;;;;;;;;76258:163;:::o;39627:281::-;39700:13;39726:23;39741:7;39726:14;:23::i;:::-;39762:21;39786:10;:8;:10::i;:::-;39762:34;;39838:1;39820:7;39814:21;:25;:86;;;;;;;;;;;;;;;;;39866:7;39875:18;:7;:16;:18::i;:::-;39849:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;39814:86;39807:93;;;39627:281;;;:::o;38355:305::-;38457:4;38509:25;38494:40;;;:11;:40;;;;:105;;;;38566:33;38551:48;;;:11;:48;;;;38494:105;:158;;;;38616:36;38640:11;38616:23;:36::i;:::-;38494:158;38474:178;;38355:305;;;:::o;57463:915::-;57640:61;57667:4;57673:2;57677:12;57691:9;57640:26;:61::i;:::-;57730:1;57718:9;:13;57714:222;;;57861:63;;;;;;;;;;:::i;:::-;;;;;;;;57714:222;57948:15;57966:12;57948:30;;58011:1;57995:18;;:4;:18;;;57991:187;;;58030:40;58062:7;58030:31;:40::i;:::-;57991:187;;;58100:2;58092:10;;:4;:10;;;58088:90;;58119:47;58152:4;58158:7;58119:32;:47::i;:::-;58088:90;57991:187;58206:1;58192:16;;:2;:16;;;58188:183;;;58225:45;58262:7;58225:36;:45::i;:::-;58188:183;;;58298:4;58292:10;;:2;:10;;;58288:83;;58319:40;58347:2;58351:7;58319:27;:40::i;:::-;58288:83;58188:183;57463:915;;;;;:::o;45922:942::-;46016:1;46002:16;;:2;:16;;;;45994:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;46075:16;46083:7;46075;:16::i;:::-;46074:17;46066:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;46137:48;46166:1;46170:2;46174:7;46183:1;46137:20;:48::i;:::-;46284:16;46292:7;46284;:16::i;:::-;46283:17;46275:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;46699:1;46682:9;:13;46692:2;46682:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;46743:2;46724:7;:16;46732:7;46724:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;46788:7;46784:2;46763:33;;46780:1;46763:33;;;;;;;;;;;;46809:47;46837:1;46841:2;46845:7;46854:1;46809:19;:47::i;:::-;45922:942;;:::o;9379:326::-;9439:4;9696:1;9674:7;:19;;;:23;9667:30;;9379:326;;;:::o;33505:716::-;33561:13;33612:14;33649:1;33629:17;33640:5;33629:10;:17::i;:::-;:21;33612:38;;33665:20;33699:6;33688:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33665:41;;33721:11;33850:6;33846:2;33842:15;33834:6;33830:28;33823:35;;33887:288;33894:4;33887:288;;;33919:5;;;;;;;;34061:8;34056:2;34049:5;34045:14;34040:30;34035:3;34027:44;34117:2;34108:11;;;;;;;;;;;;;;;;;34151:1;34142:5;:10;34138:21;;;34154:5;;34138:21;33887:288;;;34196:6;34189:13;;;;;33505:716;;;:::o;36778:157::-;36863:4;36902:25;36887:40;;;:11;:40;;;;36880:47;;36778:157;;;:::o;52642:116::-;;;;;:::o;59101:164::-;59205:10;:17;;;;59178:15;:24;59194:7;59178:24;;;;;;;;;;;:44;;;;59233:10;59249:7;59233:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59101:164;:::o;59892:988::-;60158:22;60208:1;60183:22;60200:4;60183:16;:22::i;:::-;:26;;;;:::i;:::-;60158:51;;60220:18;60241:17;:26;60259:7;60241:26;;;;;;;;;;;;60220:47;;60388:14;60374:10;:28;60370:328;;60419:19;60441:12;:18;60454:4;60441:18;;;;;;;;;;;;;;;:34;60460:14;60441:34;;;;;;;;;;;;60419:56;;60525:11;60492:12;:18;60505:4;60492:18;;;;;;;;;;;;;;;:30;60511:10;60492:30;;;;;;;;;;;:44;;;;60642:10;60609:17;:30;60627:11;60609:30;;;;;;;;;;;:43;;;;60370:328;;60794:17;:26;60812:7;60794:26;;;;;;;;;;;60787:33;;;60838:12;:18;60851:4;60838:18;;;;;;;;;;;;;;;:34;60857:14;60838:34;;;;;;;;;;;60831:41;;;59892:988;;;;:::o;61175:1079::-;61428:22;61473:1;61453:10;:17;;;;:21;;;;:::i;:::-;61428:46;;61485:18;61506:15;:24;61522:7;61506:24;;;;;;;;;;;;61485:45;;61857:19;61879:10;61890:14;61879:26;;;;;;;;;;;;;;;;;;;;;;;;61857:48;;61943:11;61918:10;61929;61918:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;62054:10;62023:15;:28;62039:11;62023:28;;;;;;;;;;;:41;;;;62195:15;:24;62211:7;62195:24;;;;;;;;;;;62188:31;;;62230:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61175:1079;;;;:::o;58679:221::-;58764:14;58781:20;58798:2;58781:16;:20::i;:::-;58764:37;;58839:7;58812:12;:16;58825:2;58812:16;;;;;;;;;;;;;;;:24;58829:6;58812:24;;;;;;;;;;;:34;;;;58886:6;58857:17;:26;58875:7;58857:26;;;;;;;;;;;:35;;;;58679:221;;;:::o;28990:948::-;29043:7;29063:14;29080:1;29063:18;;29130:8;29121:5;:17;29117:106;;29168:8;29159:17;;;;;;;;;;;;;;;;;29205:2;29195:12;;;;29117:106;29250:8;29241:5;:17;29237:106;;29288:8;29279:17;;;;;;;;;;;;;;;;;29325:2;29315:12;;;;29237:106;29370:8;29361:5;:17;29357:106;;29408:8;29399:17;;;;;;;;;;;;;;;;;29445:2;29435:12;;;;29357:106;29490:7;29481:5;:16;29477:103;;29527:7;29518:16;;;;;;;;;;;;;;;;;29563:1;29553:11;;;;29477:103;29607:7;29598:5;:16;29594:103;;29644:7;29635:16;;;;;;;;;;;;;;;;;29680:1;29670:11;;;;29594:103;29724:7;29715:5;:16;29711:103;;29761:7;29752:16;;;;;;;;;;;;;;;;;29797:1;29787:11;;;;29711:103;29841:7;29832:5;:16;29828:68;;29879:1;29869:11;;;;29828:68;29924:6;29917:13;;;28990:948;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:139::-;402:5;440:6;427:20;418:29;;456:33;483:5;456:33;:::i;:::-;408:87;;;;:::o;501:133::-;544:5;582:6;569:20;560:29;;598:30;622:5;598:30;:::i;:::-;550:84;;;;:::o;640:137::-;685:5;723:6;710:20;701:29;;739:32;765:5;739:32;:::i;:::-;691:86;;;;:::o;783:141::-;839:5;870:6;864:13;855:22;;886:32;912:5;886:32;:::i;:::-;845:79;;;;:::o;943:271::-;998:5;1047:3;1040:4;1032:6;1028:17;1024:27;1014:2;;1065:1;1062;1055:12;1014:2;1105:6;1092:20;1130:78;1204:3;1196:6;1189:4;1181:6;1177:17;1130:78;:::i;:::-;1121:87;;1004:210;;;;;:::o;1220:139::-;1266:5;1304:6;1291:20;1282:29;;1320:33;1347:5;1320:33;:::i;:::-;1272:87;;;;:::o;1365:262::-;1424:6;1473:2;1461:9;1452:7;1448:23;1444:32;1441:2;;;1489:1;1486;1479:12;1441:2;1532:1;1557:53;1602:7;1593:6;1582:9;1578:22;1557:53;:::i;:::-;1547:63;;1503:117;1431:196;;;;:::o;1633:407::-;1701:6;1709;1758:2;1746:9;1737:7;1733:23;1729:32;1726:2;;;1774:1;1771;1764:12;1726:2;1817:1;1842:53;1887:7;1878:6;1867:9;1863:22;1842:53;:::i;:::-;1832:63;;1788:117;1944:2;1970:53;2015:7;2006:6;1995:9;1991:22;1970:53;:::i;:::-;1960:63;;1915:118;1716:324;;;;;:::o;2046:552::-;2123:6;2131;2139;2188:2;2176:9;2167:7;2163:23;2159:32;2156:2;;;2204:1;2201;2194:12;2156:2;2247:1;2272:53;2317:7;2308:6;2297:9;2293:22;2272:53;:::i;:::-;2262:63;;2218:117;2374:2;2400:53;2445:7;2436:6;2425:9;2421:22;2400:53;:::i;:::-;2390:63;;2345:118;2502:2;2528:53;2573:7;2564:6;2553:9;2549:22;2528:53;:::i;:::-;2518:63;;2473:118;2146:452;;;;;:::o;2604:809::-;2699:6;2707;2715;2723;2772:3;2760:9;2751:7;2747:23;2743:33;2740:2;;;2789:1;2786;2779:12;2740:2;2832:1;2857:53;2902:7;2893:6;2882:9;2878:22;2857:53;:::i;:::-;2847:63;;2803:117;2959:2;2985:53;3030:7;3021:6;3010:9;3006:22;2985:53;:::i;:::-;2975:63;;2930:118;3087:2;3113:53;3158:7;3149:6;3138:9;3134:22;3113:53;:::i;:::-;3103:63;;3058:118;3243:2;3232:9;3228:18;3215:32;3274:18;3266:6;3263:30;3260:2;;;3306:1;3303;3296:12;3260:2;3334:62;3388:7;3379:6;3368:9;3364:22;3334:62;:::i;:::-;3324:72;;3186:220;2730:683;;;;;;;:::o;3419:401::-;3484:6;3492;3541:2;3529:9;3520:7;3516:23;3512:32;3509:2;;;3557:1;3554;3547:12;3509:2;3600:1;3625:53;3670:7;3661:6;3650:9;3646:22;3625:53;:::i;:::-;3615:63;;3571:117;3727:2;3753:50;3795:7;3786:6;3775:9;3771:22;3753:50;:::i;:::-;3743:60;;3698:115;3499:321;;;;;:::o;3826:407::-;3894:6;3902;3951:2;3939:9;3930:7;3926:23;3922:32;3919:2;;;3967:1;3964;3957:12;3919:2;4010:1;4035:53;4080:7;4071:6;4060:9;4056:22;4035:53;:::i;:::-;4025:63;;3981:117;4137:2;4163:53;4208:7;4199:6;4188:9;4184:22;4163:53;:::i;:::-;4153:63;;4108:118;3909:324;;;;;:::o;4239:260::-;4297:6;4346:2;4334:9;4325:7;4321:23;4317:32;4314:2;;;4362:1;4359;4352:12;4314:2;4405:1;4430:52;4474:7;4465:6;4454:9;4450:22;4430:52;:::i;:::-;4420:62;;4376:116;4304:195;;;;:::o;4505:282::-;4574:6;4623:2;4611:9;4602:7;4598:23;4594:32;4591:2;;;4639:1;4636;4629:12;4591:2;4682:1;4707:63;4762:7;4753:6;4742:9;4738:22;4707:63;:::i;:::-;4697:73;;4653:127;4581:206;;;;:::o;4793:262::-;4852:6;4901:2;4889:9;4880:7;4876:23;4872:32;4869:2;;;4917:1;4914;4907:12;4869:2;4960:1;4985:53;5030:7;5021:6;5010:9;5006:22;4985:53;:::i;:::-;4975:63;;4931:117;4859:196;;;;:::o;5061:407::-;5129:6;5137;5186:2;5174:9;5165:7;5161:23;5157:32;5154:2;;;5202:1;5199;5192:12;5154:2;5245:1;5270:53;5315:7;5306:6;5295:9;5291:22;5270:53;:::i;:::-;5260:63;;5216:117;5372:2;5398:53;5443:7;5434:6;5423:9;5419:22;5398:53;:::i;:::-;5388:63;;5343:118;5144:324;;;;;:::o;5474:291::-;5599:10;5620:102;5718:3;5710:6;5620:102;:::i;:::-;5754:4;5749:3;5745:14;5731:28;;5610:155;;;;:::o;5771:118::-;5858:24;5876:5;5858:24;:::i;:::-;5853:3;5846:37;5836:53;;:::o;5967:956::-;6142:3;6171:82;6247:5;6171:82;:::i;:::-;6269:114;6376:6;6371:3;6269:114;:::i;:::-;6262:121;;6407:84;6485:5;6407:84;:::i;:::-;6514:7;6545:1;6530:368;6555:6;6552:1;6549:13;6530:368;;;6631:6;6625:13;6658:119;6773:3;6758:13;6658:119;:::i;:::-;6651:126;;6800:88;6881:6;6800:88;:::i;:::-;6790:98;;6590:308;6577:1;6574;6570:9;6565:14;;6530:368;;;6534:14;6914:3;6907:10;;6147:776;;;;;;;:::o;6929:109::-;7010:21;7025:5;7010:21;:::i;:::-;7005:3;6998:34;6988:50;;:::o;7044:360::-;7130:3;7158:38;7190:5;7158:38;:::i;:::-;7212:70;7275:6;7270:3;7212:70;:::i;:::-;7205:77;;7291:52;7336:6;7331:3;7324:4;7317:5;7313:16;7291:52;:::i;:::-;7368:29;7390:6;7368:29;:::i;:::-;7363:3;7359:39;7352:46;;7134:270;;;;;:::o;7410:364::-;7498:3;7526:39;7559:5;7526:39;:::i;:::-;7581:71;7645:6;7640:3;7581:71;:::i;:::-;7574:78;;7661:52;7706:6;7701:3;7694:4;7687:5;7683:16;7661:52;:::i;:::-;7738:29;7760:6;7738:29;:::i;:::-;7733:3;7729:39;7722:46;;7502:272;;;;;:::o;7780:377::-;7886:3;7914:39;7947:5;7914:39;:::i;:::-;7969:89;8051:6;8046:3;7969:89;:::i;:::-;7962:96;;8067:52;8112:6;8107:3;8100:4;8093:5;8089:16;8067:52;:::i;:::-;8144:6;8139:3;8135:16;8128:23;;7890:267;;;;;:::o;8163:366::-;8305:3;8326:67;8390:2;8385:3;8326:67;:::i;:::-;8319:74;;8402:93;8491:3;8402:93;:::i;:::-;8520:2;8515:3;8511:12;8504:19;;8309:220;;;:::o;8535:366::-;8677:3;8698:67;8762:2;8757:3;8698:67;:::i;:::-;8691:74;;8774:93;8863:3;8774:93;:::i;:::-;8892:2;8887:3;8883:12;8876:19;;8681:220;;;:::o;8907:366::-;9049:3;9070:67;9134:2;9129:3;9070:67;:::i;:::-;9063:74;;9146:93;9235:3;9146:93;:::i;:::-;9264:2;9259:3;9255:12;9248:19;;9053:220;;;:::o;9279:366::-;9421:3;9442:67;9506:2;9501:3;9442:67;:::i;:::-;9435:74;;9518:93;9607:3;9518:93;:::i;:::-;9636:2;9631:3;9627:12;9620:19;;9425:220;;;:::o;9651:366::-;9793:3;9814:67;9878:2;9873:3;9814:67;:::i;:::-;9807:74;;9890:93;9979:3;9890:93;:::i;:::-;10008:2;10003:3;9999:12;9992:19;;9797:220;;;:::o;10023:366::-;10165:3;10186:67;10250:2;10245:3;10186:67;:::i;:::-;10179:74;;10262:93;10351:3;10262:93;:::i;:::-;10380:2;10375:3;10371:12;10364:19;;10169:220;;;:::o;10395:366::-;10537:3;10558:67;10622:2;10617:3;10558:67;:::i;:::-;10551:74;;10634:93;10723:3;10634:93;:::i;:::-;10752:2;10747:3;10743:12;10736:19;;10541:220;;;:::o;10767:366::-;10909:3;10930:67;10994:2;10989:3;10930:67;:::i;:::-;10923:74;;11006:93;11095:3;11006:93;:::i;:::-;11124:2;11119:3;11115:12;11108:19;;10913:220;;;:::o;11139:366::-;11281:3;11302:67;11366:2;11361:3;11302:67;:::i;:::-;11295:74;;11378:93;11467:3;11378:93;:::i;:::-;11496:2;11491:3;11487:12;11480:19;;11285:220;;;:::o;11511:366::-;11653:3;11674:67;11738:2;11733:3;11674:67;:::i;:::-;11667:74;;11750:93;11839:3;11750:93;:::i;:::-;11868:2;11863:3;11859:12;11852:19;;11657:220;;;:::o;11883:366::-;12025:3;12046:67;12110:2;12105:3;12046:67;:::i;:::-;12039:74;;12122:93;12211:3;12122:93;:::i;:::-;12240:2;12235:3;12231:12;12224:19;;12029:220;;;:::o;12255:366::-;12397:3;12418:67;12482:2;12477:3;12418:67;:::i;:::-;12411:74;;12494:93;12583:3;12494:93;:::i;:::-;12612:2;12607:3;12603:12;12596:19;;12401:220;;;:::o;12627:366::-;12769:3;12790:67;12854:2;12849:3;12790:67;:::i;:::-;12783:74;;12866:93;12955:3;12866:93;:::i;:::-;12984:2;12979:3;12975:12;12968:19;;12773:220;;;:::o;12999:366::-;13141:3;13162:67;13226:2;13221:3;13162:67;:::i;:::-;13155:74;;13238:93;13327:3;13238:93;:::i;:::-;13356:2;13351:3;13347:12;13340:19;;13145:220;;;:::o;13371:366::-;13513:3;13534:67;13598:2;13593:3;13534:67;:::i;:::-;13527:74;;13610:93;13699:3;13610:93;:::i;:::-;13728:2;13723:3;13719:12;13712:19;;13517:220;;;:::o;13743:366::-;13885:3;13906:67;13970:2;13965:3;13906:67;:::i;:::-;13899:74;;13982:93;14071:3;13982:93;:::i;:::-;14100:2;14095:3;14091:12;14084:19;;13889:220;;;:::o;14115:366::-;14257:3;14278:67;14342:2;14337:3;14278:67;:::i;:::-;14271:74;;14354:93;14443:3;14354:93;:::i;:::-;14472:2;14467:3;14463:12;14456:19;;14261:220;;;:::o;14487:366::-;14629:3;14650:67;14714:2;14709:3;14650:67;:::i;:::-;14643:74;;14726:93;14815:3;14726:93;:::i;:::-;14844:2;14839:3;14835:12;14828:19;;14633:220;;;:::o;14859:366::-;15001:3;15022:67;15086:2;15081:3;15022:67;:::i;:::-;15015:74;;15098:93;15187:3;15098:93;:::i;:::-;15216:2;15211:3;15207:12;15200:19;;15005:220;;;:::o;15231:366::-;15373:3;15394:67;15458:2;15453:3;15394:67;:::i;:::-;15387:74;;15470:93;15559:3;15470:93;:::i;:::-;15588:2;15583:3;15579:12;15572:19;;15377:220;;;:::o;15603:366::-;15745:3;15766:67;15830:2;15825:3;15766:67;:::i;:::-;15759:74;;15842:93;15931:3;15842:93;:::i;:::-;15960:2;15955:3;15951:12;15944:19;;15749:220;;;:::o;15975:398::-;16134:3;16155:83;16236:1;16231:3;16155:83;:::i;:::-;16148:90;;16247:93;16336:3;16247:93;:::i;:::-;16365:1;16360:3;16356:11;16349:18;;16138:235;;;:::o;16379:366::-;16521:3;16542:67;16606:2;16601:3;16542:67;:::i;:::-;16535:74;;16618:93;16707:3;16618:93;:::i;:::-;16736:2;16731:3;16727:12;16720:19;;16525:220;;;:::o;16751:366::-;16893:3;16914:67;16978:2;16973:3;16914:67;:::i;:::-;16907:74;;16990:93;17079:3;16990:93;:::i;:::-;17108:2;17103:3;17099:12;17092:19;;16897:220;;;:::o;17123:366::-;17265:3;17286:67;17350:2;17345:3;17286:67;:::i;:::-;17279:74;;17362:93;17451:3;17362:93;:::i;:::-;17480:2;17475:3;17471:12;17464:19;;17269:220;;;:::o;17495:366::-;17637:3;17658:67;17722:2;17717:3;17658:67;:::i;:::-;17651:74;;17734:93;17823:3;17734:93;:::i;:::-;17852:2;17847:3;17843:12;17836:19;;17641:220;;;:::o;17867:366::-;18009:3;18030:67;18094:2;18089:3;18030:67;:::i;:::-;18023:74;;18106:93;18195:3;18106:93;:::i;:::-;18224:2;18219:3;18215:12;18208:19;;18013:220;;;:::o;18307:510::-;18450:4;18445:3;18441:14;18539:4;18532:5;18528:16;18522:23;18558:63;18615:4;18610:3;18606:14;18592:12;18558:63;:::i;:::-;18465:166;18718:4;18711:5;18707:16;18701:23;18737:63;18794:4;18789:3;18785:14;18771:12;18737:63;:::i;:::-;18641:169;18419:398;;;:::o;18823:108::-;18900:24;18918:5;18900:24;:::i;:::-;18895:3;18888:37;18878:53;;:::o;18937:118::-;19024:24;19042:5;19024:24;:::i;:::-;19019:3;19012:37;19002:53;;:::o;19061:435::-;19241:3;19263:95;19354:3;19345:6;19263:95;:::i;:::-;19256:102;;19375:95;19466:3;19457:6;19375:95;:::i;:::-;19368:102;;19487:3;19480:10;;19245:251;;;;;:::o;19502:379::-;19686:3;19708:147;19851:3;19708:147;:::i;:::-;19701:154;;19872:3;19865:10;;19690:191;;;:::o;19887:222::-;19980:4;20018:2;20007:9;20003:18;19995:26;;20031:71;20099:1;20088:9;20084:17;20075:6;20031:71;:::i;:::-;19985:124;;;;:::o;20115:640::-;20310:4;20348:3;20337:9;20333:19;20325:27;;20362:71;20430:1;20419:9;20415:17;20406:6;20362:71;:::i;:::-;20443:72;20511:2;20500:9;20496:18;20487:6;20443:72;:::i;:::-;20525;20593:2;20582:9;20578:18;20569:6;20525:72;:::i;:::-;20644:9;20638:4;20634:20;20629:2;20618:9;20614:18;20607:48;20672:76;20743:4;20734:6;20672:76;:::i;:::-;20664:84;;20315:440;;;;;;;:::o;20761:430::-;20904:4;20942:2;20931:9;20927:18;20919:26;;20955:71;21023:1;21012:9;21008:17;20999:6;20955:71;:::i;:::-;21036:72;21104:2;21093:9;21089:18;21080:6;21036:72;:::i;:::-;21118:66;21180:2;21169:9;21165:18;21156:6;21118:66;:::i;:::-;20909:282;;;;;;:::o;21197:485::-;21396:4;21434:2;21423:9;21419:18;21411:26;;21483:9;21477:4;21473:20;21469:1;21458:9;21454:17;21447:47;21511:164;21670:4;21661:6;21511:164;:::i;:::-;21503:172;;21401:281;;;;:::o;21688:210::-;21775:4;21813:2;21802:9;21798:18;21790:26;;21826:65;21888:1;21877:9;21873:17;21864:6;21826:65;:::i;:::-;21780:118;;;;:::o;21904:313::-;22017:4;22055:2;22044:9;22040:18;22032:26;;22104:9;22098:4;22094:20;22090:1;22079:9;22075:17;22068:47;22132:78;22205:4;22196:6;22132:78;:::i;:::-;22124:86;;22022:195;;;;:::o;22223:419::-;22389:4;22427:2;22416:9;22412:18;22404:26;;22476:9;22470:4;22466:20;22462:1;22451:9;22447:17;22440:47;22504:131;22630:4;22504:131;:::i;:::-;22496:139;;22394:248;;;:::o;22648:419::-;22814:4;22852:2;22841:9;22837:18;22829:26;;22901:9;22895:4;22891:20;22887:1;22876:9;22872:17;22865:47;22929:131;23055:4;22929:131;:::i;:::-;22921:139;;22819:248;;;:::o;23073:419::-;23239:4;23277:2;23266:9;23262:18;23254:26;;23326:9;23320:4;23316:20;23312:1;23301:9;23297:17;23290:47;23354:131;23480:4;23354:131;:::i;:::-;23346:139;;23244:248;;;:::o;23498:419::-;23664:4;23702:2;23691:9;23687:18;23679:26;;23751:9;23745:4;23741:20;23737:1;23726:9;23722:17;23715:47;23779:131;23905:4;23779:131;:::i;:::-;23771:139;;23669:248;;;:::o;23923:419::-;24089:4;24127:2;24116:9;24112:18;24104:26;;24176:9;24170:4;24166:20;24162:1;24151:9;24147:17;24140:47;24204:131;24330:4;24204:131;:::i;:::-;24196:139;;24094:248;;;:::o;24348:419::-;24514:4;24552:2;24541:9;24537:18;24529:26;;24601:9;24595:4;24591:20;24587:1;24576:9;24572:17;24565:47;24629:131;24755:4;24629:131;:::i;:::-;24621:139;;24519:248;;;:::o;24773:419::-;24939:4;24977:2;24966:9;24962:18;24954:26;;25026:9;25020:4;25016:20;25012:1;25001:9;24997:17;24990:47;25054:131;25180:4;25054:131;:::i;:::-;25046:139;;24944:248;;;:::o;25198:419::-;25364:4;25402:2;25391:9;25387:18;25379:26;;25451:9;25445:4;25441:20;25437:1;25426:9;25422:17;25415:47;25479:131;25605:4;25479:131;:::i;:::-;25471:139;;25369:248;;;:::o;25623:419::-;25789:4;25827:2;25816:9;25812:18;25804:26;;25876:9;25870:4;25866:20;25862:1;25851:9;25847:17;25840:47;25904:131;26030:4;25904:131;:::i;:::-;25896:139;;25794:248;;;:::o;26048:419::-;26214:4;26252:2;26241:9;26237:18;26229:26;;26301:9;26295:4;26291:20;26287:1;26276:9;26272:17;26265:47;26329:131;26455:4;26329:131;:::i;:::-;26321:139;;26219:248;;;:::o;26473:419::-;26639:4;26677:2;26666:9;26662:18;26654:26;;26726:9;26720:4;26716:20;26712:1;26701:9;26697:17;26690:47;26754:131;26880:4;26754:131;:::i;:::-;26746:139;;26644:248;;;:::o;26898:419::-;27064:4;27102:2;27091:9;27087:18;27079:26;;27151:9;27145:4;27141:20;27137:1;27126:9;27122:17;27115:47;27179:131;27305:4;27179:131;:::i;:::-;27171:139;;27069:248;;;:::o;27323:419::-;27489:4;27527:2;27516:9;27512:18;27504:26;;27576:9;27570:4;27566:20;27562:1;27551:9;27547:17;27540:47;27604:131;27730:4;27604:131;:::i;:::-;27596:139;;27494:248;;;:::o;27748:419::-;27914:4;27952:2;27941:9;27937:18;27929:26;;28001:9;27995:4;27991:20;27987:1;27976:9;27972:17;27965:47;28029:131;28155:4;28029:131;:::i;:::-;28021:139;;27919:248;;;:::o;28173:419::-;28339:4;28377:2;28366:9;28362:18;28354:26;;28426:9;28420:4;28416:20;28412:1;28401:9;28397:17;28390:47;28454:131;28580:4;28454:131;:::i;:::-;28446:139;;28344:248;;;:::o;28598:419::-;28764:4;28802:2;28791:9;28787:18;28779:26;;28851:9;28845:4;28841:20;28837:1;28826:9;28822:17;28815:47;28879:131;29005:4;28879:131;:::i;:::-;28871:139;;28769:248;;;:::o;29023:419::-;29189:4;29227:2;29216:9;29212:18;29204:26;;29276:9;29270:4;29266:20;29262:1;29251:9;29247:17;29240:47;29304:131;29430:4;29304:131;:::i;:::-;29296:139;;29194:248;;;:::o;29448:419::-;29614:4;29652:2;29641:9;29637:18;29629:26;;29701:9;29695:4;29691:20;29687:1;29676:9;29672:17;29665:47;29729:131;29855:4;29729:131;:::i;:::-;29721:139;;29619:248;;;:::o;29873:419::-;30039:4;30077:2;30066:9;30062:18;30054:26;;30126:9;30120:4;30116:20;30112:1;30101:9;30097:17;30090:47;30154:131;30280:4;30154:131;:::i;:::-;30146:139;;30044:248;;;:::o;30298:419::-;30464:4;30502:2;30491:9;30487:18;30479:26;;30551:9;30545:4;30541:20;30537:1;30526:9;30522:17;30515:47;30579:131;30705:4;30579:131;:::i;:::-;30571:139;;30469:248;;;:::o;30723:419::-;30889:4;30927:2;30916:9;30912:18;30904:26;;30976:9;30970:4;30966:20;30962:1;30951:9;30947:17;30940:47;31004:131;31130:4;31004:131;:::i;:::-;30996:139;;30894:248;;;:::o;31148:419::-;31314:4;31352:2;31341:9;31337:18;31329:26;;31401:9;31395:4;31391:20;31387:1;31376:9;31372:17;31365:47;31429:131;31555:4;31429:131;:::i;:::-;31421:139;;31319:248;;;:::o;31573:419::-;31739:4;31777:2;31766:9;31762:18;31754:26;;31826:9;31820:4;31816:20;31812:1;31801:9;31797:17;31790:47;31854:131;31980:4;31854:131;:::i;:::-;31846:139;;31744:248;;;:::o;31998:419::-;32164:4;32202:2;32191:9;32187:18;32179:26;;32251:9;32245:4;32241:20;32237:1;32226:9;32222:17;32215:47;32279:131;32405:4;32279:131;:::i;:::-;32271:139;;32169:248;;;:::o;32423:419::-;32589:4;32627:2;32616:9;32612:18;32604:26;;32676:9;32670:4;32666:20;32662:1;32651:9;32647:17;32640:47;32704:131;32830:4;32704:131;:::i;:::-;32696:139;;32594:248;;;:::o;32848:419::-;33014:4;33052:2;33041:9;33037:18;33029:26;;33101:9;33095:4;33091:20;33087:1;33076:9;33072:17;33065:47;33129:131;33255:4;33129:131;:::i;:::-;33121:139;;33019:248;;;:::o;33273:222::-;33366:4;33404:2;33393:9;33389:18;33381:26;;33417:71;33485:1;33474:9;33470:17;33461:6;33417:71;:::i;:::-;33371:124;;;;:::o;33501:423::-;33642:4;33680:2;33669:9;33665:18;33657:26;;33693:71;33761:1;33750:9;33746:17;33737:6;33693:71;:::i;:::-;33811:9;33805:4;33801:20;33796:2;33785:9;33781:18;33774:48;33839:78;33912:4;33903:6;33839:78;:::i;:::-;33831:86;;33647:277;;;;;:::o;33930:332::-;34051:4;34089:2;34078:9;34074:18;34066:26;;34102:71;34170:1;34159:9;34155:17;34146:6;34102:71;:::i;:::-;34183:72;34251:2;34240:9;34236:18;34227:6;34183:72;:::i;:::-;34056:206;;;;;:::o;34268:129::-;34302:6;34329:20;;:::i;:::-;34319:30;;34358:33;34386:4;34378:6;34358:33;:::i;:::-;34309:88;;;:::o;34403:75::-;34436:6;34469:2;34463:9;34453:19;;34443:35;:::o;34484:307::-;34545:4;34635:18;34627:6;34624:30;34621:2;;;34657:18;;:::i;:::-;34621:2;34695:29;34717:6;34695:29;:::i;:::-;34687:37;;34779:4;34773;34769:15;34761:23;;34550:241;;;:::o;34797:160::-;34892:4;34915:3;34907:11;;34945:4;34940:3;34936:14;34928:22;;34897:60;;;:::o;34963:142::-;35058:6;35092:5;35086:12;35076:22;;35065:40;;;:::o;35111:98::-;35162:6;35196:5;35190:12;35180:22;;35169:40;;;:::o;35215:99::-;35267:6;35301:5;35295:12;35285:22;;35274:40;;;:::o;35320:141::-;35418:4;35450;35445:3;35441:14;35433:22;;35423:38;;;:::o;35467:212::-;35594:11;35628:6;35623:3;35616:19;35668:4;35663:3;35659:14;35644:29;;35606:73;;;;:::o;35685:168::-;35768:11;35802:6;35797:3;35790:19;35842:4;35837:3;35833:14;35818:29;;35780:73;;;;:::o;35859:147::-;35960:11;35997:3;35982:18;;35972:34;;;;:::o;36012:169::-;36096:11;36130:6;36125:3;36118:19;36170:4;36165:3;36161:14;36146:29;;36108:73;;;;:::o;36187:148::-;36289:11;36326:3;36311:18;;36301:34;;;;:::o;36341:305::-;36381:3;36400:20;36418:1;36400:20;:::i;:::-;36395:25;;36434:20;36452:1;36434:20;:::i;:::-;36429:25;;36588:1;36520:66;36516:74;36513:1;36510:81;36507:2;;;36594:18;;:::i;:::-;36507:2;36638:1;36635;36631:9;36624:16;;36385:261;;;;:::o;36652:185::-;36692:1;36709:20;36727:1;36709:20;:::i;:::-;36704:25;;36743:20;36761:1;36743:20;:::i;:::-;36738:25;;36782:1;36772:2;;36787:18;;:::i;:::-;36772:2;36829:1;36826;36822:9;36817:14;;36694:143;;;;:::o;36843:348::-;36883:7;36906:20;36924:1;36906:20;:::i;:::-;36901:25;;36940:20;36958:1;36940:20;:::i;:::-;36935:25;;37128:1;37060:66;37056:74;37053:1;37050:81;37045:1;37038:9;37031:17;37027:105;37024:2;;;37135:18;;:::i;:::-;37024:2;37183:1;37180;37176:9;37165:20;;36891:300;;;;:::o;37197:191::-;37237:4;37257:20;37275:1;37257:20;:::i;:::-;37252:25;;37291:20;37309:1;37291:20;:::i;:::-;37286:25;;37330:1;37327;37324:8;37321:2;;;37335:18;;:::i;:::-;37321:2;37380:1;37377;37373:9;37365:17;;37242:146;;;;:::o;37394:96::-;37431:7;37460:24;37478:5;37460:24;:::i;:::-;37449:35;;37439:51;;;:::o;37496:90::-;37530:7;37573:5;37566:13;37559:21;37548:32;;37538:48;;;:::o;37592:149::-;37628:7;37668:66;37661:5;37657:78;37646:89;;37636:105;;;:::o;37747:126::-;37784:7;37824:42;37817:5;37813:54;37802:65;;37792:81;;;:::o;37879:77::-;37916:7;37945:5;37934:16;;37924:32;;;:::o;37962:154::-;38046:6;38041:3;38036;38023:30;38108:1;38099:6;38094:3;38090:16;38083:27;38013:103;;;:::o;38122:307::-;38190:1;38200:113;38214:6;38211:1;38208:13;38200:113;;;38299:1;38294:3;38290:11;38284:18;38280:1;38275:3;38271:11;38264:39;38236:2;38233:1;38229:10;38224:15;;38200:113;;;38331:6;38328:1;38325:13;38322:2;;;38411:1;38402:6;38397:3;38393:16;38386:27;38322:2;38171:258;;;;:::o;38435:320::-;38479:6;38516:1;38510:4;38506:12;38496:22;;38563:1;38557:4;38553:12;38584:18;38574:2;;38640:4;38632:6;38628:17;38618:27;;38574:2;38702;38694:6;38691:14;38671:18;38668:38;38665:2;;;38721:18;;:::i;:::-;38665:2;38486:269;;;;:::o;38761:281::-;38844:27;38866:4;38844:27;:::i;:::-;38836:6;38832:40;38974:6;38962:10;38959:22;38938:18;38926:10;38923:34;38920:62;38917:2;;;38985:18;;:::i;:::-;38917:2;39025:10;39021:2;39014:22;38804:238;;;:::o;39048:233::-;39087:3;39110:24;39128:5;39110:24;:::i;:::-;39101:33;;39156:66;39149:5;39146:77;39143:2;;;39226:18;;:::i;:::-;39143:2;39273:1;39266:5;39262:13;39255:20;;39091:190;;;:::o;39287:180::-;39335:77;39332:1;39325:88;39432:4;39429:1;39422:15;39456:4;39453:1;39446:15;39473:180;39521:77;39518:1;39511:88;39618:4;39615:1;39608:15;39642:4;39639:1;39632:15;39659:180;39707:77;39704:1;39697:88;39804:4;39801:1;39794:15;39828:4;39825:1;39818:15;39845:180;39893:77;39890:1;39883:88;39990:4;39987:1;39980:15;40014:4;40011:1;40004:15;40031:102;40072:6;40123:2;40119:7;40114:2;40107:5;40103:14;40099:28;40089:38;;40079:54;;;:::o;40139:232::-;40279:34;40275:1;40267:6;40263:14;40256:58;40348:15;40343:2;40335:6;40331:15;40324:40;40245:126;:::o;40377:230::-;40517:34;40513:1;40505:6;40501:14;40494:58;40586:13;40581:2;40573:6;40569:15;40562:38;40483:124;:::o;40613:237::-;40753:34;40749:1;40741:6;40737:14;40730:58;40822:20;40817:2;40809:6;40805:15;40798:45;40719:131;:::o;40856:225::-;40996:34;40992:1;40984:6;40980:14;40973:58;41065:8;41060:2;41052:6;41048:15;41041:33;40962:119;:::o;41087:165::-;41227:17;41223:1;41215:6;41211:14;41204:41;41193:59;:::o;41258:224::-;41398:34;41394:1;41386:6;41382:14;41375:58;41467:7;41462:2;41454:6;41450:15;41443:32;41364:118;:::o;41488:178::-;41628:30;41624:1;41616:6;41612:14;41605:54;41594:72;:::o;41672:223::-;41812:34;41808:1;41800:6;41796:14;41789:58;41881:6;41876:2;41868:6;41864:15;41857:31;41778:117;:::o;41901:175::-;42041:27;42037:1;42029:6;42025:14;42018:51;42007:69;:::o;42082:174::-;42222:26;42218:1;42210:6;42206:14;42199:50;42188:68;:::o;42262:170::-;42402:22;42398:1;42390:6;42386:14;42379:46;42368:64;:::o;42438:180::-;42578:32;42574:1;42566:6;42562:14;42555:56;42544:74;:::o;42624:174::-;42764:26;42760:1;42752:6;42748:14;42741:50;42730:68;:::o;42804:228::-;42944:34;42940:1;42932:6;42928:14;42921:58;43013:11;43008:2;43000:6;42996:15;42989:36;42910:122;:::o;43038:221::-;43178:34;43174:1;43166:6;43162:14;43155:58;43247:4;43242:2;43234:6;43230:15;43223:29;43144:115;:::o;43265:182::-;43405:34;43401:1;43393:6;43389:14;43382:58;43371:76;:::o;43453:182::-;43593:34;43589:1;43581:6;43577:14;43570:58;43559:76;:::o;43641:174::-;43781:26;43777:1;43769:6;43765:14;43758:50;43747:68;:::o;43821:166::-;43961:18;43957:1;43949:6;43945:14;43938:42;43927:60;:::o;43993:220::-;44133:34;44129:1;44121:6;44117:14;44110:58;44202:3;44197:2;44189:6;44185:15;44178:28;44099:114;:::o;44219:172::-;44359:24;44355:1;44347:6;44343:14;44336:48;44325:66;:::o;44397:114::-;44503:8;:::o;44517:248::-;44657:34;44653:1;44645:6;44641:14;44634:58;44726:31;44721:2;44713:6;44709:15;44702:56;44623:142;:::o;44771:231::-;44911:34;44907:1;44899:6;44895:14;44888:58;44980:14;44975:2;44967:6;44963:15;44956:39;44877:125;:::o;45008:240::-;45148:34;45144:1;45136:6;45132:14;45125:58;45217:23;45212:2;45204:6;45200:15;45193:48;45114:134;:::o;45254:169::-;45394:21;45390:1;45382:6;45378:14;45371:45;45360:63;:::o;45429:178::-;45569:30;45565:1;45557:6;45553:14;45546:54;45535:72;:::o;45613:122::-;45686:24;45704:5;45686:24;:::i;:::-;45679:5;45676:35;45666:2;;45725:1;45722;45715:12;45666:2;45656:79;:::o;45741:116::-;45811:21;45826:5;45811:21;:::i;:::-;45804:5;45801:32;45791:2;;45847:1;45844;45837:12;45791:2;45781:76;:::o;45863:120::-;45935:23;45952:5;45935:23;:::i;:::-;45928:5;45925:34;45915:2;;45973:1;45970;45963:12;45915:2;45905:78;:::o;45989:122::-;46062:24;46080:5;46062:24;:::i;:::-;46055:5;46052:35;46042:2;;46101:1;46098;46091:12;46042:2;46032:79;:::o
Swarm Source
ipfs://4d80a2029a05d8c76d3c17e91ee0fec7116aacf2982c8940c9af9e57aca3c591
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.