Token Peepz
Overview CRC721
Total Supply:
3,500 PEPZ
Holders:
206 addresses
Contract:
Balance
6 PEPZ
[ Download CSV Export ]
[ Download CSV Export ]
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Peepz
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity)
/** *Submitted for verification at cronoscan.com on 2023-03-30 */ // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } // File: @openzeppelin/contracts/utils/math/Math.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.8.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 * ==== * * [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://diligence.consensys.net/posts/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.5.11/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/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // 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/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.8.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/extensions/IERC721Enumerable.sol // 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/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.8.2) (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/ERC721Enumerable.sol // 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/security/Pausable.sol // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Counters.sol // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: contracts/peepz.sol pragma solidity ^0.8.0; contract Peepz is ERC721Enumerable, Pausable, Ownable { using Counters for Counters.Counter; Counters.Counter private _mintCounter; mapping(uint256 => bool) public vipClaimTracker; mapping(uint256 => bool) public ufoClaimTracker; struct NFTStatus { uint256 id; bool beenUsed; } address public vip; address public ufo; uint256 public _maxMintable = 4500; uint256 public _mintPrice = 400 ether; uint256 public _wlPrice = 400 ether; //whitelist mapping(address => bool) public whitelist; bool public wlEnabled = false; // Base URI for metadata string public _prefixURI; //Maps for allow token mints mapping(address => bool) public approvedTokens; mapping(address => uint256) public tokenCost; constructor(address _vip, address _ufo) ERC721("Peepz", "PEPZ") { toggleAllMintPause(); vip = _vip; ufo = _ufo; } function mint(uint256 amount) external payable whenNotPaused { uint256 currentMintCount = _mintCounter.current(); require(currentMintCount < _maxMintable, "mint: no NFTs left to mint"); require(currentMintCount + amount <= _maxMintable, "mint: not enough NFTs available to mint that amount"); require(msg.value == amount * _mintPrice, "mint: value is not correct to mint that amount"); for (uint256 i = 0; i < amount; i++) { _mintItem(msg.sender); } } function whitelistMint(uint256 amount) external payable { require(wlEnabled == true, "whitelistMint: whitelist mint is not active."); require(whitelist[msg.sender] == true, "whitelistMint: wallet is not on whitelist"); uint256 currentMintCount = _mintCounter.current(); require(currentMintCount < _maxMintable, "whitelistMint: no NFTs left to mint"); require(currentMintCount + amount <= _maxMintable, "whitelistMint: not enough NFTs available to mint that amount"); require(msg.value == amount * _wlPrice, "whitelistMint: value is not correct to mint that amount"); for (uint256 i = 0; i < amount; i++) { _mintItem(msg.sender); } } function mintWithToken(uint256 amount, address token) external whenNotPaused { uint256 currentMintCount = _mintCounter.current(); require(currentMintCount < _maxMintable, "mint: no NFTs left to mint"); require(currentMintCount + amount <= _maxMintable, "mint: not enough NFTs available to mint that amount"); require(approvedTokens[token] == true, "mintWithToken: Token is not an approved token for minting"); uint256 mintCost = tokenCost[token] * amount; require(IERC20(token).balanceOf(msg.sender) >= mintCost, "mintWithToken: Not enough CRC20 token balacne for mint amount"); require(IERC20(token).allowance(msg.sender, address(this)) >= mintCost, "mintWithToken: insufficant token transfer allowance"); IERC20(token).transferFrom(msg.sender, address(this), mintCost); for (uint256 i = 0; i < amount; i++) { _mintItem(msg.sender); } } function mintWithTokenWL(uint256 amount, address token) external { require(wlEnabled == true, "whitelistMint: whitelist mint is not active."); require(whitelist[msg.sender] == true, "whitelistMint: wallet is not on whitelist"); uint256 currentMintCount = _mintCounter.current(); require(currentMintCount < _maxMintable, "mint: no NFTs left to mint"); require(currentMintCount + amount <= _maxMintable, "mint: not enough NFTs available to mint that amount"); require(approvedTokens[token] == true, "mintWithToken: Token is not an approved token for minting"); uint256 mintCost = tokenCost[token] * amount; require(IERC20(token).balanceOf(msg.sender) >= mintCost, "mintWithToken: Not enough CRC20 token balacne for mint amount"); require(IERC20(token).allowance(msg.sender, address(this)) >= mintCost, "mintWithToken: insufficant token transfer allowance"); IERC20(token).transferFrom(msg.sender, address(this), mintCost); for (uint256 i = 0; i < amount; i++) { _mintItem(msg.sender); } } function vipClaim(uint256[] memory ids) external whenNotPaused { uint256 len = ids.length; uint256 currentMintCount = _mintCounter.current(); require(currentMintCount + ids.length <= _maxMintable, "vipClaim: maximum supply reached"); for (uint256 i = 0; i < len; i++) { uint256 id = ids[i]; require(vipClaimTracker[id] == false, "vipClaim: NFT has already been used in claim"); require(IERC721(vip).ownerOf(id) == msg.sender, "vipClaim: sender is not ID owner"); vipClaimTracker[id] = true; _mintItem(msg.sender); } } function ufoClaim(uint256[] memory ids) external whenNotPaused { uint256 len = ids.length; uint256 currentMintCount = _mintCounter.current(); require(currentMintCount + ids.length <= _maxMintable, "ufoClaim: maximum supply reached"); for (uint256 i = 0; i < len; i++) { uint256 id = ids[i]; require(ufoClaimTracker[id] == false, "ufoClaim: NFT has already been used in claim"); require(IERC721(ufo).ownerOf(id) == msg.sender, "ufoClaim: sender is not ID owner"); ufoClaimTracker[id] = true; _mintItem(msg.sender); } } function _mintItem(address to) internal { _mintCounter.increment(); uint256 id = _mintCounter.current(); _safeMint(to, id); } // Use this function to get a wallets IDs from any collection. Do not use in payable function. Use externally only. // Test to see if this function works. function getIDFromContract(address _contract, address wallet) public view returns (uint256[] memory) { uint256 bal = IERC721Enumerable(_contract).balanceOf(wallet); uint256[] memory ids = new uint256[](bal); for (uint256 i = 0; i < bal; i++) { ids[i] = IERC721Enumerable(_contract).tokenOfOwnerByIndex(wallet, i); } return ids; } function checkVIPs() external view returns (NFTStatus[] memory) { uint256[] memory ids = getIDFromContract(vip, msg.sender); uint256 num = ids.length; NFTStatus[] memory checks = new NFTStatus[](num); for (uint i = 0; i < num; i++) { checks[i] = NFTStatus(ids[i], vipClaimTracker[ids[i]]); } return checks; } function checkUFOs() external view returns (NFTStatus[] memory) { uint256[] memory ids = getIDFromContract(ufo, msg.sender); uint256 num = ids.length; NFTStatus[] memory checks = new NFTStatus[](num); for (uint i = 0; i < num; i++) { checks[i] = NFTStatus(ids[i], ufoClaimTracker[ids[i]]); } return checks; } /////////////////// // URI Functions // /////////////////// function _baseURI() internal view override returns (string memory) { return _prefixURI; } function airDrop(address[] memory addrs) external onlyOwner { uint256 currentMintCount = _mintCounter.current(); require(addrs.length > 0, "airDrop: must specify at least one address"); require(currentMintCount + addrs.length <= _maxMintable, "airDrop: maximum supply reached"); for (uint256 i = 0; i < addrs.length; i++) { _mintItem(addrs[i]); } } function setBaseURI(string memory _uri) public onlyOwner { _prefixURI = _uri; } function burnToken(uint256 tokenId) external virtual { require(_isApprovedOrOwner(msg.sender, tokenId), "burnToken: caller is not owner nor approved"); _burn(tokenId); } ////////////////////// // State management // ////////////////////// function toggleAllMintPause() public onlyOwner { paused() ? _unpause() : _pause(); } function toggleWLMint() external onlyOwner { wlEnabled = !wlEnabled; } function updatePrice(uint256 newPrice) external onlyOwner { require(newPrice > 0, "updatePrice: new price must be greater than 0"); _mintPrice = newPrice; } function updateWLPrice(uint256 newPrice) external onlyOwner { require(newPrice > 0, "updatePrice: new price must be greater than 0"); _wlPrice = newPrice; } function updateTotalSupply(uint256 newSupply) external onlyOwner { require(newSupply > 0, "updateTotalSupply: new supply must be greater than 0"); _maxMintable = newSupply; } function updateWhitelist(address[] calldata addrs, bool state) external onlyOwner { uint256 amount = addrs.length; for (uint256 i = 0; i < amount; i++) { whitelist[addrs[i]] = state; } } function setTokenForMint(address token, bool state) external onlyOwner { approvedTokens[token] = state; } function setTokenPriceForMint(address token, uint256 cost) external onlyOwner { tokenCost[token] = cost; } function withdraw() external onlyOwner { require(address(this).balance > 0, "withdraw: contract balance must be greater than 0"); uint256 balance = address(this).balance; payable(msg.sender).transfer(balance); } function withdrawToken(address _contract, uint256 amount) external onlyOwner { require(IERC20(_contract).balanceOf(address(this)) >= amount, "withdrawToken: contract balance must be greater than or equal to amount"); IERC20(_contract).transfer(msg.sender, amount); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_vip","type":"address"},{"internalType":"address","name":"_ufo","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":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"_maxMintable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_prefixURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_wlPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addrs","type":"address[]"}],"name":"airDrop","outputs":[],"stateMutability":"nonpayable","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":"","type":"address"}],"name":"approvedTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"burnToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"checkUFOs","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bool","name":"beenUsed","type":"bool"}],"internalType":"struct Peepz.NFTStatus[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkVIPs","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bool","name":"beenUsed","type":"bool"}],"internalType":"struct Peepz.NFTStatus[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"},{"internalType":"address","name":"wallet","type":"address"}],"name":"getIDFromContract","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":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"token","type":"address"}],"name":"mintWithToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"token","type":"address"}],"name":"mintWithTokenWL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"string","name":"_uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"state","type":"bool"}],"name":"setTokenForMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"cost","type":"uint256"}],"name":"setTokenPriceForMint","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":[],"name":"toggleAllMintPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleWLMint","outputs":[],"stateMutability":"nonpayable","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":"","type":"address"}],"name":"tokenCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ufo","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"ufoClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ufoClaimTracker","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"updatePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newSupply","type":"uint256"}],"name":"updateTotalSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"updateWLPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addrs","type":"address[]"},{"internalType":"bool","name":"state","type":"bool"}],"name":"updateWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vip","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"vipClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"vipClaimTracker","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wlEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040526111946010556815af1d78b58c40000060118190556012556014805460ff191690553480156200003357600080fd5b50604051620043e0380380620043e08339810160408190526200005691620003ec565b60408051808201825260058152642832b2b83d60d91b6020808301918252835180850190945260048452632822a82d60e11b9084015281519192916200009f9160009162000329565b508051620000b590600190602084019062000329565b5050600a805460ff1916905550620000cd3362000109565b620000d762000163565b600e80546001600160a01b039384166001600160a01b031991821617909155600f805492909316911617905562000460565b600a80546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6200016d6200018e565b600a5460ff16620001845762000182620001f4565b565b6200018262000251565b600a546001600160a01b03610100909104163314620001825760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b620001fe6200028d565b600a805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258620002343390565b6040516001600160a01b03909116815260200160405180910390a1565b6200025b620002d5565b600a805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa3362000234565b600a5460ff1615620001825760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401620001eb565b600a5460ff16620001825760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401620001eb565b828054620003379062000424565b90600052602060002090601f0160209004810192826200035b5760008555620003a6565b82601f106200037657805160ff1916838001178555620003a6565b82800160010185558215620003a6579182015b82811115620003a657825182559160200191906001019062000389565b50620003b4929150620003b8565b5090565b5b80821115620003b45760008155600101620003b9565b80516001600160a01b0381168114620003e757600080fd5b919050565b600080604083850312156200040057600080fd5b6200040b83620003cf565b91506200041b60208401620003cf565b90509250929050565b600181811c908216806200043957607f821691505b6020821081036200045a57634e487b7160e01b600052602260045260246000fd5b50919050565b613f7080620004706000396000f3fe6080604052600436106103345760003560e01c8063715018a6116101ab578063aff177ca116100f7578063e80a355811610095578063f2fde38b1161006f578063f2fde38b146109ad578063f3b249d6146109cd578063f54a0465146109ed578063f61b5e0c14610a0257600080fd5b8063e80a35581461092e578063e853164114610944578063e985e9c51461096457600080fd5b8063c87b56dd116100d1578063c87b56dd146108b4578063d13e6ca2146108d4578063d4d11553146108ee578063e549fe771461090e57600080fd5b8063aff177ca14610847578063b87c5e2c14610867578063b88d4fde1461089457600080fd5b80639014cd92116101645780639b19251a1161013e5780639b19251a146107c45780639e281a98146107f4578063a0712d6814610814578063a22cb4651461082757600080fd5b80639014cd921461076a57806391860f781461079a57806395d89b41146107af57600080fd5b8063715018a6146106bf5780637b47ec1a146106d4578063853bab71146106f4578063868ff4a2146107145780638d6cc56d146107275780638da5cb5b1461074757600080fd5b80633ccfd60b1161028557806361b71e421161022357806366d49bab116101fd57806366d49bab1461062f5780636b69acd61461064f5780636d1ea3fa1461066f57806370a082311461069f57600080fd5b806361b71e42146105d757806361c90f3f146105ed5780636352211e1461060f57600080fd5b80634661c2001161025f5780634661c2001461054f5780634f6ccce71461057f57806355f804b31461059f5780635c975abb146105bf57600080fd5b80633ccfd60b146104ed578063406c3a311461050257806342842e0e1461052f57600080fd5b806310797961116102f257806323b872dd116102cc57806323b872dd14610478578063274a32d3146104985780632f448762146104ad5780632f745c59146104cd57600080fd5b8063107979611461042e57806318160ddd1461044e5780631e1d0b8f1461046357600080fd5b8062b6849f1461033957806301ffc9a71461035b5780630387da421461039057806306fdde03146103b4578063081812fc146103d6578063095ea7b31461040e575b600080fd5b34801561034557600080fd5b506103596103543660046134e2565b610a22565b005b34801561036757600080fd5b5061037b610376366004613597565b610b42565b60405190151581526020015b60405180910390f35b34801561039c57600080fd5b506103a660115481565b604051908152602001610387565b3480156103c057600080fd5b506103c9610b6d565b604051610387919061360c565b3480156103e257600080fd5b506103f66103f136600461361f565b610bff565b6040516001600160a01b039091168152602001610387565b34801561041a57600080fd5b50610359610429366004613638565b610c26565b34801561043a57600080fd5b50600f546103f6906001600160a01b031681565b34801561045a57600080fd5b506008546103a6565b34801561046f57600080fd5b50610359610d36565b34801561048457600080fd5b50610359610493366004613664565b610d52565b3480156104a457600080fd5b50610359610d83565b3480156104b957600080fd5b506103596104c83660046136b3565b610da7565b3480156104d957600080fd5b506103a66104e8366004613638565b610dda565b3480156104f957600080fd5b50610359610e70565b34801561050e57600080fd5b5061052261051d3660046136ec565b610f15565b604051610387919061371a565b34801561053b57600080fd5b5061035961054a366004613664565b611082565b34801561055b57600080fd5b5061037b61056a36600461361f565b600c6020526000908152604090205460ff1681565b34801561058b57600080fd5b506103a661059a36600461361f565b61109d565b3480156105ab57600080fd5b506103596105ba3660046137b6565b611130565b3480156105cb57600080fd5b50600a5460ff1661037b565b3480156105e357600080fd5b506103a660125481565b3480156105f957600080fd5b5061060261114b565b60405161038791906137ff565b34801561061b57600080fd5b506103f661062a36600461361f565b61127b565b34801561063b57600080fd5b5061035961064a36600461361f565b6112db565b34801561065b57600080fd5b5061035961066a366004613850565b611355565b34801561067b57600080fd5b5061037b61068a3660046138d6565b60166020526000908152604090205460ff1681565b3480156106ab57600080fd5b506103a66106ba3660046138d6565b61156b565b3480156106cb57600080fd5b506103596115f1565b3480156106e057600080fd5b506103596106ef36600461361f565b611603565b34801561070057600080fd5b50600e546103f6906001600160a01b031681565b61035961072236600461361f565b611679565b34801561073357600080fd5b5061035961074236600461361f565b611866565b34801561075357600080fd5b50600a5461010090046001600160a01b03166103f6565b34801561077657600080fd5b5061037b61078536600461361f565b600d6020526000908152604090205460ff1681565b3480156107a657600080fd5b506103c9611893565b3480156107bb57600080fd5b506103c9611921565b3480156107d057600080fd5b5061037b6107df3660046138d6565b60136020526000908152604090205460ff1681565b34801561080057600080fd5b5061035961080f366004613638565b611930565b61035961082236600461361f565b611a97565b34801561083357600080fd5b506103596108423660046136b3565b611b90565b34801561085357600080fd5b506103596108623660046138f3565b611b9b565b34801561087357600080fd5b506103a66108823660046138d6565b60176020526000908152604090205481565b3480156108a057600080fd5b506103596108af366004613979565b611c1c565b3480156108c057600080fd5b506103c96108cf36600461361f565b611c4e565b3480156108e057600080fd5b5060145461037b9060ff1681565b3480156108fa57600080fd5b506103596109093660046139f9565b611cb5565b34801561091a57600080fd5b5061035961092936600461361f565b611f81565b34801561093a57600080fd5b506103a660105481565b34801561095057600080fd5b5061035961095f3660046139f9565b611fae565b34801561097057600080fd5b5061037b61097f3660046136ec565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156109b957600080fd5b506103596109c83660046138d6565b612227565b3480156109d957600080fd5b506103596109e8366004613850565b61229d565b3480156109f957600080fd5b506106026124ad565b348015610a0e57600080fd5b50610359610a1d366004613638565b6125d5565b610a2a6125f9565b6000610a35600b5490565b90506000825111610aa05760405162461bcd60e51b815260206004820152602a60248201527f61697244726f703a206d7573742073706563696679206174206c65617374206f6044820152696e65206164647265737360b01b60648201526084015b60405180910390fd5b6010548251610aaf9083613a34565b1115610afd5760405162461bcd60e51b815260206004820152601f60248201527f61697244726f703a206d6178696d756d20737570706c792072656163686564006044820152606401610a97565b60005b8251811015610b3d57610b2b838281518110610b1e57610b1e613a4c565b6020026020010151612659565b80610b3581613a62565b915050610b00565b505050565b60006001600160e01b0319821663780e9d6360e01b1480610b675750610b678261267e565b92915050565b606060008054610b7c90613a7b565b80601f0160208091040260200160405190810160405280929190818152602001828054610ba890613a7b565b8015610bf55780601f10610bca57610100808354040283529160200191610bf5565b820191906000526020600020905b815481529060010190602001808311610bd857829003601f168201915b5050505050905090565b6000610c0a826126ce565b506000908152600460205260409020546001600160a01b031690565b6000610c318261127b565b9050806001600160a01b0316836001600160a01b031603610c9e5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610a97565b336001600160a01b0382161480610cba5750610cba813361097f565b610d2c5760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610a97565b610b3d838361272d565b610d3e6125f9565b6014805460ff19811660ff90911615179055565b610d5c338261279b565b610d785760405162461bcd60e51b8152600401610a9790613ab5565b610b3d83838361281a565b610d8b6125f9565b600a5460ff16610d9f57610d9d61298b565b565b610d9d6129e5565b610daf6125f9565b6001600160a01b03919091166000908152601660205260409020805460ff1916911515919091179055565b6000610de58361156b565b8210610e475760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610a97565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610e786125f9565b60004711610ee25760405162461bcd60e51b815260206004820152603160248201527f77697468647261773a20636f6e74726163742062616c616e6365206d75737420604482015270062652067726561746572207468616e203607c1b6064820152608401610a97565b6040514790339082156108fc029083906000818181858888f19350505050158015610f11573d6000803e3d6000fd5b5050565b6040516370a0823160e01b81526001600160a01b0382811660048301526060916000918516906370a0823190602401602060405180830381865afa158015610f61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f859190613b02565b905060008167ffffffffffffffff811115610fa257610fa2613462565b604051908082528060200260200182016040528015610fcb578160200160208202803683370190505b50905060005b8281101561107957604051632f745c5960e01b81526001600160a01b03868116600483015260248201839052871690632f745c5990604401602060405180830381865afa158015611026573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104a9190613b02565b82828151811061105c5761105c613a4c565b60209081029190910101528061107181613a62565b915050610fd1565b50949350505050565b610b3d83838360405180602001604052806000815250611c1c565b60006110a860085490565b821061110b5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610a97565b6008828154811061111e5761111e613a4c565b90600052602060002001549050919050565b6111386125f9565b8051610f119060159060208401906133c9565b600f54606090600090611167906001600160a01b031633610f15565b805190915060008167ffffffffffffffff81111561118757611187613462565b6040519080825280602002602001820160405280156111cc57816020015b60408051808201909152600080825260208201528152602001906001900390816111a55790505b50905060005b828110156112735760405180604001604052808583815181106111f7576111f7613a4c565b60200260200101518152602001600d600087858151811061121a5761121a613a4c565b6020026020010151815260200190815260200160002060009054906101000a900460ff16151581525082828151811061125557611255613a4c565b6020026020010181905250808061126b90613a62565b9150506111d2565b509392505050565b6000818152600260205260408120546001600160a01b031680610b675760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610a97565b6112e36125f9565b600081116113505760405162461bcd60e51b815260206004820152603460248201527f757064617465546f74616c537570706c793a206e657720737570706c79206d75604482015273073742062652067726561746572207468616e20360641b6064820152608401610a97565b601055565b61135d612a1e565b8051600061136a600b5490565b905060105483518261137c9190613a34565b11156113ca5760405162461bcd60e51b815260206004820181905260248201527f766970436c61696d3a206d6178696d756d20737570706c7920726561636865646044820152606401610a97565b60005b828110156115655760008482815181106113e9576113e9613a4c565b6020908102919091018101516000818152600c90925260409091205490915060ff161561146d5760405162461bcd60e51b815260206004820152602c60248201527f766970436c61696d3a204e46542068617320616c7265616479206265656e207560448201526b73656420696e20636c61696d60a01b6064820152608401610a97565b600e546040516331a9108f60e11b81526004810183905233916001600160a01b031690636352211e90602401602060405180830381865afa1580156114b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114da9190613b1b565b6001600160a01b0316146115305760405162461bcd60e51b815260206004820181905260248201527f766970436c61696d3a2073656e646572206973206e6f74204944206f776e65726044820152606401610a97565b6000818152600c60205260409020805460ff1916600117905561155233612659565b508061155d81613a62565b9150506113cd565b50505050565b60006001600160a01b0382166115d55760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610a97565b506001600160a01b031660009081526003602052604090205490565b6115f96125f9565b610d9d6000612a64565b61160d338261279b565b61166d5760405162461bcd60e51b815260206004820152602b60248201527f6275726e546f6b656e3a2063616c6c6572206973206e6f74206f776e6572206e60448201526a1bdc88185c1c1c9bdd995960aa1b6064820152608401610a97565b61167681612abe565b50565b60145460ff1615156001146116a05760405162461bcd60e51b8152600401610a9790613b38565b3360009081526013602052604090205460ff1615156001146116d45760405162461bcd60e51b8152600401610a9790613b84565b60006116df600b5490565b9050601054811061173e5760405162461bcd60e51b815260206004820152602360248201527f77686974656c6973744d696e743a206e6f204e465473206c65667420746f206d6044820152621a5b9d60ea1b6064820152608401610a97565b60105461174b8383613a34565b11156117bf5760405162461bcd60e51b815260206004820152603c60248201527f77686974656c6973744d696e743a206e6f7420656e6f756768204e465473206160448201527f7661696c61626c6520746f206d696e74207468617420616d6f756e74000000006064820152608401610a97565b6012546117cc9083613bcd565b34146118405760405162461bcd60e51b815260206004820152603760248201527f77686974656c6973744d696e743a2076616c7565206973206e6f7420636f727260448201527f65637420746f206d696e74207468617420616d6f756e740000000000000000006064820152608401610a97565b60005b82811015610b3d5761185433612659565b8061185e81613a62565b915050611843565b61186e6125f9565b6000811161188e5760405162461bcd60e51b8152600401610a9790613bec565b601155565b601580546118a090613a7b565b80601f01602080910402602001604051908101604052809291908181526020018280546118cc90613a7b565b80156119195780601f106118ee57610100808354040283529160200191611919565b820191906000526020600020905b8154815290600101906020018083116118fc57829003601f168201915b505050505081565b606060018054610b7c90613a7b565b6119386125f9565b6040516370a0823160e01b815230600482015281906001600160a01b038416906370a0823190602401602060405180830381865afa15801561197e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119a29190613b02565b1015611a265760405162461bcd60e51b815260206004820152604760248201527f7769746864726177546f6b656e3a20636f6e74726163742062616c616e63652060448201527f6d7573742062652067726561746572207468616e206f7220657175616c20746f60648201526608185b5bdd5b9d60ca1b608482015260a401610a97565b60405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0383169063a9059cbb906044016020604051808303816000875af1158015611a73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b3d9190613c39565b611a9f612a1e565b6000611aaa600b5490565b90506010548110611acd5760405162461bcd60e51b8152600401610a9790613c56565b601054611ada8383613a34565b1115611af85760405162461bcd60e51b8152600401610a9790613c8d565b601154611b059083613bcd565b3414611b6a5760405162461bcd60e51b815260206004820152602e60248201527f6d696e743a2076616c7565206973206e6f7420636f727265637420746f206d6960448201526d1b9d081d1a185d08185b5bdd5b9d60921b6064820152608401610a97565b60005b82811015610b3d57611b7e33612659565b80611b8881613a62565b915050611b6d565b610f11338383612b61565b611ba36125f9565b8160005b81811015611c15578260136000878785818110611bc657611bc6613a4c565b9050602002016020810190611bdb91906138d6565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580611c0d81613a62565b915050611ba7565b5050505050565b611c26338361279b565b611c425760405162461bcd60e51b8152600401610a9790613ab5565b61156584848484612c2f565b6060611c59826126ce565b6000611c63612c62565b90506000815111611c835760405180602001604052806000815250611cae565b80611c8d84612c71565b604051602001611c9e929190613ce0565b6040516020818303038152906040525b9392505050565b60145460ff161515600114611cdc5760405162461bcd60e51b8152600401610a9790613b38565b3360009081526013602052604090205460ff161515600114611d105760405162461bcd60e51b8152600401610a9790613b84565b6000611d1b600b5490565b90506010548110611d3e5760405162461bcd60e51b8152600401610a9790613c56565b601054611d4b8483613a34565b1115611d695760405162461bcd60e51b8152600401610a9790613c8d565b6001600160a01b03821660009081526016602052604090205460ff161515600114611da65760405162461bcd60e51b8152600401610a9790613d0f565b6001600160a01b038216600090815260176020526040812054611dca908590613bcd565b6040516370a0823160e01b815233600482015290915081906001600160a01b038516906370a0823190602401602060405180830381865afa158015611e13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e379190613b02565b1015611e555760405162461bcd60e51b8152600401610a9790613d6c565b604051636eb1769f60e11b815233600482015230602482015281906001600160a01b0385169063dd62ed3e90604401602060405180830381865afa158015611ea1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ec59190613b02565b1015611ee35760405162461bcd60e51b8152600401610a9790613dc9565b6040516323b872dd60e01b8152336004820152306024820152604481018290526001600160a01b038416906323b872dd906064016020604051808303816000875af1158015611f36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f5a9190613c39565b5060005b84811015611c1557611f6f33612659565b80611f7981613a62565b915050611f5e565b611f896125f9565b60008111611fa95760405162461bcd60e51b8152600401610a9790613bec565b601255565b611fb6612a1e565b6000611fc1600b5490565b90506010548110611fe45760405162461bcd60e51b8152600401610a9790613c56565b601054611ff18483613a34565b111561200f5760405162461bcd60e51b8152600401610a9790613c8d565b6001600160a01b03821660009081526016602052604090205460ff16151560011461204c5760405162461bcd60e51b8152600401610a9790613d0f565b6001600160a01b038216600090815260176020526040812054612070908590613bcd565b6040516370a0823160e01b815233600482015290915081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156120b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120dd9190613b02565b10156120fb5760405162461bcd60e51b8152600401610a9790613d6c565b604051636eb1769f60e11b815233600482015230602482015281906001600160a01b0385169063dd62ed3e90604401602060405180830381865afa158015612147573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061216b9190613b02565b10156121895760405162461bcd60e51b8152600401610a9790613dc9565b6040516323b872dd60e01b8152336004820152306024820152604481018290526001600160a01b038416906323b872dd906064016020604051808303816000875af11580156121dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122009190613c39565b5060005b84811015611c155761221533612659565b8061221f81613a62565b915050612204565b61222f6125f9565b6001600160a01b0381166122945760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a97565b61167681612a64565b6122a5612a1e565b805160006122b2600b5490565b90506010548351826122c49190613a34565b11156123125760405162461bcd60e51b815260206004820181905260248201527f75666f436c61696d3a206d6178696d756d20737570706c7920726561636865646044820152606401610a97565b60005b8281101561156557600084828151811061233157612331613a4c565b6020908102919091018101516000818152600d90925260409091205490915060ff16156123b55760405162461bcd60e51b815260206004820152602c60248201527f75666f436c61696d3a204e46542068617320616c7265616479206265656e207560448201526b73656420696e20636c61696d60a01b6064820152608401610a97565b600f546040516331a9108f60e11b81526004810183905233916001600160a01b031690636352211e90602401602060405180830381865afa1580156123fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124229190613b1b565b6001600160a01b0316146124785760405162461bcd60e51b815260206004820181905260248201527f75666f436c61696d3a2073656e646572206973206e6f74204944206f776e65726044820152606401610a97565b6000818152600d60205260409020805460ff1916600117905561249a33612659565b50806124a581613a62565b915050612315565b600e546060906000906124c9906001600160a01b031633610f15565b805190915060008167ffffffffffffffff8111156124e9576124e9613462565b60405190808252806020026020018201604052801561252e57816020015b60408051808201909152600080825260208201528152602001906001900390816125075790505b50905060005b8281101561127357604051806040016040528085838151811061255957612559613a4c565b60200260200101518152602001600c600087858151811061257c5761257c613a4c565b6020026020010151815260200190815260200160002060009054906101000a900460ff1615158152508282815181106125b7576125b7613a4c565b602002602001018190525080806125cd90613a62565b915050612534565b6125dd6125f9565b6001600160a01b03909116600090815260176020526040902055565b600a546001600160a01b03610100909104163314610d9d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a97565b612667600b80546001019055565b6000612672600b5490565b9050610f118282612d04565b60006001600160e01b031982166380ac58cd60e01b14806126af57506001600160e01b03198216635b5e139f60e01b145b80610b6757506301ffc9a760e01b6001600160e01b0319831614610b67565b6000818152600260205260409020546001600160a01b03166116765760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610a97565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906127628261127b565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806127a78361127b565b9050806001600160a01b0316846001600160a01b031614806127ee57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b806128125750836001600160a01b031661280784610bff565b6001600160a01b0316145b949350505050565b826001600160a01b031661282d8261127b565b6001600160a01b0316146128535760405162461bcd60e51b8152600401610a9790613e1c565b6001600160a01b0382166128b55760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610a97565b6128c28383836001612d1e565b826001600160a01b03166128d58261127b565b6001600160a01b0316146128fb5760405162461bcd60e51b8152600401610a9790613e1c565b600081815260046020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260038552838620805460001901905590871680865283862080546001019055868652600290945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b612993612a1e565b600a805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586129c83390565b6040516001600160a01b03909116815260200160405180910390a1565b6129ed612e4b565b600a805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa336129c8565b600a5460ff1615610d9d5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610a97565b600a80546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000612ac98261127b565b9050612ad9816000846001612d1e565b612ae28261127b565b600083815260046020908152604080832080546001600160a01b03199081169091556001600160a01b0385168085526003845282852080546000190190558785526002909352818420805490911690555192935084927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b816001600160a01b0316836001600160a01b031603612bc25760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a97565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612c3a84848461281a565b612c4684848484612e94565b6115655760405162461bcd60e51b8152600401610a9790613e61565b606060158054610b7c90613a7b565b60606000612c7e83612f95565b600101905060008167ffffffffffffffff811115612c9e57612c9e613462565b6040519080825280601f01601f191660200182016040528015612cc8576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084612cd257509392505050565b610f1182826040518060200160405280600081525061306d565b6001811115612d8d5760405162461bcd60e51b815260206004820152603560248201527f455243373231456e756d657261626c653a20636f6e7365637574697665207472604482015274185b9cd9995c9cc81b9bdd081cdd5c1c1bdc9d1959605a1b6064820152608401610a97565b816001600160a01b038516612de957612de481600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612e0c565b836001600160a01b0316856001600160a01b031614612e0c57612e0c85826130a0565b6001600160a01b038416612e2857612e238161313d565b611c15565b846001600160a01b0316846001600160a01b031614611c1557611c1584826131ec565b600a5460ff16610d9d5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610a97565b60006001600160a01b0384163b15612f8a57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612ed8903390899088908890600401613eb3565b6020604051808303816000875af1925050508015612f13575060408051601f3d908101601f19168201909252612f1091810190613ef0565b60015b612f70573d808015612f41576040519150601f19603f3d011682016040523d82523d6000602084013e612f46565b606091505b508051600003612f685760405162461bcd60e51b8152600401610a9790613e61565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612812565b506001949350505050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310612fd45772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310613000576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061301e57662386f26fc10000830492506010015b6305f5e1008310613036576305f5e100830492506008015b612710831061304a57612710830492506004015b6064831061305c576064830492506002015b600a8310610b675760010192915050565b6130778383613230565b6130846000848484612e94565b610b3d5760405162461bcd60e51b8152600401610a9790613e61565b600060016130ad8461156b565b6130b79190613f0d565b60008381526007602052604090205490915080821461310a576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061314f90600190613f0d565b6000838152600960205260408120546008805493945090928490811061317757613177613a4c565b90600052602060002001549050806008838154811061319857613198613a4c565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806131d0576131d0613f24565b6001900381819060005260206000200160009055905550505050565b60006131f78361156b565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166132865760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610a97565b6000818152600260205260409020546001600160a01b0316156132eb5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a97565b6132f9600083836001612d1e565b6000818152600260205260409020546001600160a01b03161561335e5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a97565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546133d590613a7b565b90600052602060002090601f0160209004810192826133f7576000855561343d565b82601f1061341057805160ff191683800117855561343d565b8280016001018555821561343d579182015b8281111561343d578251825591602001919060010190613422565b5061344992915061344d565b5090565b5b80821115613449576000815560010161344e565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156134a1576134a1613462565b604052919050565b600067ffffffffffffffff8211156134c3576134c3613462565b5060051b60200190565b6001600160a01b038116811461167657600080fd5b600060208083850312156134f557600080fd5b823567ffffffffffffffff81111561350c57600080fd5b8301601f8101851361351d57600080fd5b803561353061352b826134a9565b613478565b81815260059190911b8201830190838101908783111561354f57600080fd5b928401925b82841015613576578335613567816134cd565b82529284019290840190613554565b979650505050505050565b6001600160e01b03198116811461167657600080fd5b6000602082840312156135a957600080fd5b8135611cae81613581565b60005b838110156135cf5781810151838201526020016135b7565b838111156115655750506000910152565b600081518084526135f88160208601602086016135b4565b601f01601f19169290920160200192915050565b602081526000611cae60208301846135e0565b60006020828403121561363157600080fd5b5035919050565b6000806040838503121561364b57600080fd5b8235613656816134cd565b946020939093013593505050565b60008060006060848603121561367957600080fd5b8335613684816134cd565b92506020840135613694816134cd565b929592945050506040919091013590565b801515811461167657600080fd5b600080604083850312156136c657600080fd5b82356136d1816134cd565b915060208301356136e1816136a5565b809150509250929050565b600080604083850312156136ff57600080fd5b823561370a816134cd565b915060208301356136e1816134cd565b6020808252825182820181905260009190848201906040850190845b8181101561375257835183529284019291840191600101613736565b50909695505050505050565b600067ffffffffffffffff83111561377857613778613462565b61378b601f8401601f1916602001613478565b905082815283838301111561379f57600080fd5b828260208301376000602084830101529392505050565b6000602082840312156137c857600080fd5b813567ffffffffffffffff8111156137df57600080fd5b8201601f810184136137f057600080fd5b6128128482356020840161375e565b602080825282518282018190526000919060409081850190868401855b8281101561384357815180518552860151151586850152928401929085019060010161381c565b5091979650505050505050565b6000602080838503121561386357600080fd5b823567ffffffffffffffff81111561387a57600080fd5b8301601f8101851361388b57600080fd5b803561389961352b826134a9565b81815260059190911b820183019083810190878311156138b857600080fd5b928401925b82841015613576578335825292840192908401906138bd565b6000602082840312156138e857600080fd5b8135611cae816134cd565b60008060006040848603121561390857600080fd5b833567ffffffffffffffff8082111561392057600080fd5b818601915086601f83011261393457600080fd5b81358181111561394357600080fd5b8760208260051b850101111561395857600080fd5b6020928301955093505084013561396e816136a5565b809150509250925092565b6000806000806080858703121561398f57600080fd5b843561399a816134cd565b935060208501356139aa816134cd565b925060408501359150606085013567ffffffffffffffff8111156139cd57600080fd5b8501601f810187136139de57600080fd5b6139ed8782356020840161375e565b91505092959194509250565b60008060408385031215613a0c57600080fd5b8235915060208301356136e1816134cd565b634e487b7160e01b600052601160045260246000fd5b60008219821115613a4757613a47613a1e565b500190565b634e487b7160e01b600052603260045260246000fd5b600060018201613a7457613a74613a1e565b5060010190565b600181811c90821680613a8f57607f821691505b602082108103613aaf57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b600060208284031215613b1457600080fd5b5051919050565b600060208284031215613b2d57600080fd5b8151611cae816134cd565b6020808252602c908201527f77686974656c6973744d696e743a2077686974656c697374206d696e7420697360408201526b103737ba1030b1ba34bb329760a11b606082015260800190565b60208082526029908201527f77686974656c6973744d696e743a2077616c6c6574206973206e6f74206f6e206040820152681dda1a5d195b1a5cdd60ba1b606082015260800190565b6000816000190483118215151615613be757613be7613a1e565b500290565b6020808252602d908201527f75706461746550726963653a206e6577207072696365206d757374206265206760408201526c0726561746572207468616e203609c1b606082015260800190565b600060208284031215613c4b57600080fd5b8151611cae816136a5565b6020808252601a908201527f6d696e743a206e6f204e465473206c65667420746f206d696e74000000000000604082015260600190565b60208082526033908201527f6d696e743a206e6f7420656e6f756768204e46547320617661696c61626c65206040820152721d1bc81b5a5b9d081d1a185d08185b5bdd5b9d606a1b606082015260800190565b60008351613cf28184602088016135b4565b835190830190613d068183602088016135b4565b01949350505050565b60208082526039908201527f6d696e7457697468546f6b656e3a20546f6b656e206973206e6f7420616e206160408201527f7070726f76656420746f6b656e20666f72206d696e74696e6700000000000000606082015260800190565b6020808252603d908201527f6d696e7457697468546f6b656e3a204e6f7420656e6f7567682043524332302060408201527f746f6b656e2062616c61636e6520666f72206d696e7420616d6f756e74000000606082015260800190565b60208082526033908201527f6d696e7457697468546f6b656e3a20696e737566666963616e7420746f6b656e604082015272207472616e7366657220616c6c6f77616e636560681b606082015260800190565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613ee6908301846135e0565b9695505050505050565b600060208284031215613f0257600080fd5b8151611cae81613581565b600082821015613f1f57613f1f613a1e565b500390565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220034c3e55a58542263216e23d642ba303df53d58d7f2f86c310038914cccfb7d664736f6c634300080d00330000000000000000000000004e6795d725e26e340865140a870c25d1e413a118000000000000000000000000be5f02b6fd5c1e714f0bdd28b6a119827d8b6c61
Deployed Bytecode
0x6080604052600436106103345760003560e01c8063715018a6116101ab578063aff177ca116100f7578063e80a355811610095578063f2fde38b1161006f578063f2fde38b146109ad578063f3b249d6146109cd578063f54a0465146109ed578063f61b5e0c14610a0257600080fd5b8063e80a35581461092e578063e853164114610944578063e985e9c51461096457600080fd5b8063c87b56dd116100d1578063c87b56dd146108b4578063d13e6ca2146108d4578063d4d11553146108ee578063e549fe771461090e57600080fd5b8063aff177ca14610847578063b87c5e2c14610867578063b88d4fde1461089457600080fd5b80639014cd92116101645780639b19251a1161013e5780639b19251a146107c45780639e281a98146107f4578063a0712d6814610814578063a22cb4651461082757600080fd5b80639014cd921461076a57806391860f781461079a57806395d89b41146107af57600080fd5b8063715018a6146106bf5780637b47ec1a146106d4578063853bab71146106f4578063868ff4a2146107145780638d6cc56d146107275780638da5cb5b1461074757600080fd5b80633ccfd60b1161028557806361b71e421161022357806366d49bab116101fd57806366d49bab1461062f5780636b69acd61461064f5780636d1ea3fa1461066f57806370a082311461069f57600080fd5b806361b71e42146105d757806361c90f3f146105ed5780636352211e1461060f57600080fd5b80634661c2001161025f5780634661c2001461054f5780634f6ccce71461057f57806355f804b31461059f5780635c975abb146105bf57600080fd5b80633ccfd60b146104ed578063406c3a311461050257806342842e0e1461052f57600080fd5b806310797961116102f257806323b872dd116102cc57806323b872dd14610478578063274a32d3146104985780632f448762146104ad5780632f745c59146104cd57600080fd5b8063107979611461042e57806318160ddd1461044e5780631e1d0b8f1461046357600080fd5b8062b6849f1461033957806301ffc9a71461035b5780630387da421461039057806306fdde03146103b4578063081812fc146103d6578063095ea7b31461040e575b600080fd5b34801561034557600080fd5b506103596103543660046134e2565b610a22565b005b34801561036757600080fd5b5061037b610376366004613597565b610b42565b60405190151581526020015b60405180910390f35b34801561039c57600080fd5b506103a660115481565b604051908152602001610387565b3480156103c057600080fd5b506103c9610b6d565b604051610387919061360c565b3480156103e257600080fd5b506103f66103f136600461361f565b610bff565b6040516001600160a01b039091168152602001610387565b34801561041a57600080fd5b50610359610429366004613638565b610c26565b34801561043a57600080fd5b50600f546103f6906001600160a01b031681565b34801561045a57600080fd5b506008546103a6565b34801561046f57600080fd5b50610359610d36565b34801561048457600080fd5b50610359610493366004613664565b610d52565b3480156104a457600080fd5b50610359610d83565b3480156104b957600080fd5b506103596104c83660046136b3565b610da7565b3480156104d957600080fd5b506103a66104e8366004613638565b610dda565b3480156104f957600080fd5b50610359610e70565b34801561050e57600080fd5b5061052261051d3660046136ec565b610f15565b604051610387919061371a565b34801561053b57600080fd5b5061035961054a366004613664565b611082565b34801561055b57600080fd5b5061037b61056a36600461361f565b600c6020526000908152604090205460ff1681565b34801561058b57600080fd5b506103a661059a36600461361f565b61109d565b3480156105ab57600080fd5b506103596105ba3660046137b6565b611130565b3480156105cb57600080fd5b50600a5460ff1661037b565b3480156105e357600080fd5b506103a660125481565b3480156105f957600080fd5b5061060261114b565b60405161038791906137ff565b34801561061b57600080fd5b506103f661062a36600461361f565b61127b565b34801561063b57600080fd5b5061035961064a36600461361f565b6112db565b34801561065b57600080fd5b5061035961066a366004613850565b611355565b34801561067b57600080fd5b5061037b61068a3660046138d6565b60166020526000908152604090205460ff1681565b3480156106ab57600080fd5b506103a66106ba3660046138d6565b61156b565b3480156106cb57600080fd5b506103596115f1565b3480156106e057600080fd5b506103596106ef36600461361f565b611603565b34801561070057600080fd5b50600e546103f6906001600160a01b031681565b61035961072236600461361f565b611679565b34801561073357600080fd5b5061035961074236600461361f565b611866565b34801561075357600080fd5b50600a5461010090046001600160a01b03166103f6565b34801561077657600080fd5b5061037b61078536600461361f565b600d6020526000908152604090205460ff1681565b3480156107a657600080fd5b506103c9611893565b3480156107bb57600080fd5b506103c9611921565b3480156107d057600080fd5b5061037b6107df3660046138d6565b60136020526000908152604090205460ff1681565b34801561080057600080fd5b5061035961080f366004613638565b611930565b61035961082236600461361f565b611a97565b34801561083357600080fd5b506103596108423660046136b3565b611b90565b34801561085357600080fd5b506103596108623660046138f3565b611b9b565b34801561087357600080fd5b506103a66108823660046138d6565b60176020526000908152604090205481565b3480156108a057600080fd5b506103596108af366004613979565b611c1c565b3480156108c057600080fd5b506103c96108cf36600461361f565b611c4e565b3480156108e057600080fd5b5060145461037b9060ff1681565b3480156108fa57600080fd5b506103596109093660046139f9565b611cb5565b34801561091a57600080fd5b5061035961092936600461361f565b611f81565b34801561093a57600080fd5b506103a660105481565b34801561095057600080fd5b5061035961095f3660046139f9565b611fae565b34801561097057600080fd5b5061037b61097f3660046136ec565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156109b957600080fd5b506103596109c83660046138d6565b612227565b3480156109d957600080fd5b506103596109e8366004613850565b61229d565b3480156109f957600080fd5b506106026124ad565b348015610a0e57600080fd5b50610359610a1d366004613638565b6125d5565b610a2a6125f9565b6000610a35600b5490565b90506000825111610aa05760405162461bcd60e51b815260206004820152602a60248201527f61697244726f703a206d7573742073706563696679206174206c65617374206f6044820152696e65206164647265737360b01b60648201526084015b60405180910390fd5b6010548251610aaf9083613a34565b1115610afd5760405162461bcd60e51b815260206004820152601f60248201527f61697244726f703a206d6178696d756d20737570706c792072656163686564006044820152606401610a97565b60005b8251811015610b3d57610b2b838281518110610b1e57610b1e613a4c565b6020026020010151612659565b80610b3581613a62565b915050610b00565b505050565b60006001600160e01b0319821663780e9d6360e01b1480610b675750610b678261267e565b92915050565b606060008054610b7c90613a7b565b80601f0160208091040260200160405190810160405280929190818152602001828054610ba890613a7b565b8015610bf55780601f10610bca57610100808354040283529160200191610bf5565b820191906000526020600020905b815481529060010190602001808311610bd857829003601f168201915b5050505050905090565b6000610c0a826126ce565b506000908152600460205260409020546001600160a01b031690565b6000610c318261127b565b9050806001600160a01b0316836001600160a01b031603610c9e5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610a97565b336001600160a01b0382161480610cba5750610cba813361097f565b610d2c5760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610a97565b610b3d838361272d565b610d3e6125f9565b6014805460ff19811660ff90911615179055565b610d5c338261279b565b610d785760405162461bcd60e51b8152600401610a9790613ab5565b610b3d83838361281a565b610d8b6125f9565b600a5460ff16610d9f57610d9d61298b565b565b610d9d6129e5565b610daf6125f9565b6001600160a01b03919091166000908152601660205260409020805460ff1916911515919091179055565b6000610de58361156b565b8210610e475760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610a97565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610e786125f9565b60004711610ee25760405162461bcd60e51b815260206004820152603160248201527f77697468647261773a20636f6e74726163742062616c616e6365206d75737420604482015270062652067726561746572207468616e203607c1b6064820152608401610a97565b6040514790339082156108fc029083906000818181858888f19350505050158015610f11573d6000803e3d6000fd5b5050565b6040516370a0823160e01b81526001600160a01b0382811660048301526060916000918516906370a0823190602401602060405180830381865afa158015610f61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f859190613b02565b905060008167ffffffffffffffff811115610fa257610fa2613462565b604051908082528060200260200182016040528015610fcb578160200160208202803683370190505b50905060005b8281101561107957604051632f745c5960e01b81526001600160a01b03868116600483015260248201839052871690632f745c5990604401602060405180830381865afa158015611026573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104a9190613b02565b82828151811061105c5761105c613a4c565b60209081029190910101528061107181613a62565b915050610fd1565b50949350505050565b610b3d83838360405180602001604052806000815250611c1c565b60006110a860085490565b821061110b5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610a97565b6008828154811061111e5761111e613a4c565b90600052602060002001549050919050565b6111386125f9565b8051610f119060159060208401906133c9565b600f54606090600090611167906001600160a01b031633610f15565b805190915060008167ffffffffffffffff81111561118757611187613462565b6040519080825280602002602001820160405280156111cc57816020015b60408051808201909152600080825260208201528152602001906001900390816111a55790505b50905060005b828110156112735760405180604001604052808583815181106111f7576111f7613a4c565b60200260200101518152602001600d600087858151811061121a5761121a613a4c565b6020026020010151815260200190815260200160002060009054906101000a900460ff16151581525082828151811061125557611255613a4c565b6020026020010181905250808061126b90613a62565b9150506111d2565b509392505050565b6000818152600260205260408120546001600160a01b031680610b675760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610a97565b6112e36125f9565b600081116113505760405162461bcd60e51b815260206004820152603460248201527f757064617465546f74616c537570706c793a206e657720737570706c79206d75604482015273073742062652067726561746572207468616e20360641b6064820152608401610a97565b601055565b61135d612a1e565b8051600061136a600b5490565b905060105483518261137c9190613a34565b11156113ca5760405162461bcd60e51b815260206004820181905260248201527f766970436c61696d3a206d6178696d756d20737570706c7920726561636865646044820152606401610a97565b60005b828110156115655760008482815181106113e9576113e9613a4c565b6020908102919091018101516000818152600c90925260409091205490915060ff161561146d5760405162461bcd60e51b815260206004820152602c60248201527f766970436c61696d3a204e46542068617320616c7265616479206265656e207560448201526b73656420696e20636c61696d60a01b6064820152608401610a97565b600e546040516331a9108f60e11b81526004810183905233916001600160a01b031690636352211e90602401602060405180830381865afa1580156114b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114da9190613b1b565b6001600160a01b0316146115305760405162461bcd60e51b815260206004820181905260248201527f766970436c61696d3a2073656e646572206973206e6f74204944206f776e65726044820152606401610a97565b6000818152600c60205260409020805460ff1916600117905561155233612659565b508061155d81613a62565b9150506113cd565b50505050565b60006001600160a01b0382166115d55760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610a97565b506001600160a01b031660009081526003602052604090205490565b6115f96125f9565b610d9d6000612a64565b61160d338261279b565b61166d5760405162461bcd60e51b815260206004820152602b60248201527f6275726e546f6b656e3a2063616c6c6572206973206e6f74206f776e6572206e60448201526a1bdc88185c1c1c9bdd995960aa1b6064820152608401610a97565b61167681612abe565b50565b60145460ff1615156001146116a05760405162461bcd60e51b8152600401610a9790613b38565b3360009081526013602052604090205460ff1615156001146116d45760405162461bcd60e51b8152600401610a9790613b84565b60006116df600b5490565b9050601054811061173e5760405162461bcd60e51b815260206004820152602360248201527f77686974656c6973744d696e743a206e6f204e465473206c65667420746f206d6044820152621a5b9d60ea1b6064820152608401610a97565b60105461174b8383613a34565b11156117bf5760405162461bcd60e51b815260206004820152603c60248201527f77686974656c6973744d696e743a206e6f7420656e6f756768204e465473206160448201527f7661696c61626c6520746f206d696e74207468617420616d6f756e74000000006064820152608401610a97565b6012546117cc9083613bcd565b34146118405760405162461bcd60e51b815260206004820152603760248201527f77686974656c6973744d696e743a2076616c7565206973206e6f7420636f727260448201527f65637420746f206d696e74207468617420616d6f756e740000000000000000006064820152608401610a97565b60005b82811015610b3d5761185433612659565b8061185e81613a62565b915050611843565b61186e6125f9565b6000811161188e5760405162461bcd60e51b8152600401610a9790613bec565b601155565b601580546118a090613a7b565b80601f01602080910402602001604051908101604052809291908181526020018280546118cc90613a7b565b80156119195780601f106118ee57610100808354040283529160200191611919565b820191906000526020600020905b8154815290600101906020018083116118fc57829003601f168201915b505050505081565b606060018054610b7c90613a7b565b6119386125f9565b6040516370a0823160e01b815230600482015281906001600160a01b038416906370a0823190602401602060405180830381865afa15801561197e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119a29190613b02565b1015611a265760405162461bcd60e51b815260206004820152604760248201527f7769746864726177546f6b656e3a20636f6e74726163742062616c616e63652060448201527f6d7573742062652067726561746572207468616e206f7220657175616c20746f60648201526608185b5bdd5b9d60ca1b608482015260a401610a97565b60405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0383169063a9059cbb906044016020604051808303816000875af1158015611a73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b3d9190613c39565b611a9f612a1e565b6000611aaa600b5490565b90506010548110611acd5760405162461bcd60e51b8152600401610a9790613c56565b601054611ada8383613a34565b1115611af85760405162461bcd60e51b8152600401610a9790613c8d565b601154611b059083613bcd565b3414611b6a5760405162461bcd60e51b815260206004820152602e60248201527f6d696e743a2076616c7565206973206e6f7420636f727265637420746f206d6960448201526d1b9d081d1a185d08185b5bdd5b9d60921b6064820152608401610a97565b60005b82811015610b3d57611b7e33612659565b80611b8881613a62565b915050611b6d565b610f11338383612b61565b611ba36125f9565b8160005b81811015611c15578260136000878785818110611bc657611bc6613a4c565b9050602002016020810190611bdb91906138d6565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580611c0d81613a62565b915050611ba7565b5050505050565b611c26338361279b565b611c425760405162461bcd60e51b8152600401610a9790613ab5565b61156584848484612c2f565b6060611c59826126ce565b6000611c63612c62565b90506000815111611c835760405180602001604052806000815250611cae565b80611c8d84612c71565b604051602001611c9e929190613ce0565b6040516020818303038152906040525b9392505050565b60145460ff161515600114611cdc5760405162461bcd60e51b8152600401610a9790613b38565b3360009081526013602052604090205460ff161515600114611d105760405162461bcd60e51b8152600401610a9790613b84565b6000611d1b600b5490565b90506010548110611d3e5760405162461bcd60e51b8152600401610a9790613c56565b601054611d4b8483613a34565b1115611d695760405162461bcd60e51b8152600401610a9790613c8d565b6001600160a01b03821660009081526016602052604090205460ff161515600114611da65760405162461bcd60e51b8152600401610a9790613d0f565b6001600160a01b038216600090815260176020526040812054611dca908590613bcd565b6040516370a0823160e01b815233600482015290915081906001600160a01b038516906370a0823190602401602060405180830381865afa158015611e13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e379190613b02565b1015611e555760405162461bcd60e51b8152600401610a9790613d6c565b604051636eb1769f60e11b815233600482015230602482015281906001600160a01b0385169063dd62ed3e90604401602060405180830381865afa158015611ea1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ec59190613b02565b1015611ee35760405162461bcd60e51b8152600401610a9790613dc9565b6040516323b872dd60e01b8152336004820152306024820152604481018290526001600160a01b038416906323b872dd906064016020604051808303816000875af1158015611f36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f5a9190613c39565b5060005b84811015611c1557611f6f33612659565b80611f7981613a62565b915050611f5e565b611f896125f9565b60008111611fa95760405162461bcd60e51b8152600401610a9790613bec565b601255565b611fb6612a1e565b6000611fc1600b5490565b90506010548110611fe45760405162461bcd60e51b8152600401610a9790613c56565b601054611ff18483613a34565b111561200f5760405162461bcd60e51b8152600401610a9790613c8d565b6001600160a01b03821660009081526016602052604090205460ff16151560011461204c5760405162461bcd60e51b8152600401610a9790613d0f565b6001600160a01b038216600090815260176020526040812054612070908590613bcd565b6040516370a0823160e01b815233600482015290915081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156120b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120dd9190613b02565b10156120fb5760405162461bcd60e51b8152600401610a9790613d6c565b604051636eb1769f60e11b815233600482015230602482015281906001600160a01b0385169063dd62ed3e90604401602060405180830381865afa158015612147573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061216b9190613b02565b10156121895760405162461bcd60e51b8152600401610a9790613dc9565b6040516323b872dd60e01b8152336004820152306024820152604481018290526001600160a01b038416906323b872dd906064016020604051808303816000875af11580156121dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122009190613c39565b5060005b84811015611c155761221533612659565b8061221f81613a62565b915050612204565b61222f6125f9565b6001600160a01b0381166122945760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a97565b61167681612a64565b6122a5612a1e565b805160006122b2600b5490565b90506010548351826122c49190613a34565b11156123125760405162461bcd60e51b815260206004820181905260248201527f75666f436c61696d3a206d6178696d756d20737570706c7920726561636865646044820152606401610a97565b60005b8281101561156557600084828151811061233157612331613a4c565b6020908102919091018101516000818152600d90925260409091205490915060ff16156123b55760405162461bcd60e51b815260206004820152602c60248201527f75666f436c61696d3a204e46542068617320616c7265616479206265656e207560448201526b73656420696e20636c61696d60a01b6064820152608401610a97565b600f546040516331a9108f60e11b81526004810183905233916001600160a01b031690636352211e90602401602060405180830381865afa1580156123fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124229190613b1b565b6001600160a01b0316146124785760405162461bcd60e51b815260206004820181905260248201527f75666f436c61696d3a2073656e646572206973206e6f74204944206f776e65726044820152606401610a97565b6000818152600d60205260409020805460ff1916600117905561249a33612659565b50806124a581613a62565b915050612315565b600e546060906000906124c9906001600160a01b031633610f15565b805190915060008167ffffffffffffffff8111156124e9576124e9613462565b60405190808252806020026020018201604052801561252e57816020015b60408051808201909152600080825260208201528152602001906001900390816125075790505b50905060005b8281101561127357604051806040016040528085838151811061255957612559613a4c565b60200260200101518152602001600c600087858151811061257c5761257c613a4c565b6020026020010151815260200190815260200160002060009054906101000a900460ff1615158152508282815181106125b7576125b7613a4c565b602002602001018190525080806125cd90613a62565b915050612534565b6125dd6125f9565b6001600160a01b03909116600090815260176020526040902055565b600a546001600160a01b03610100909104163314610d9d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a97565b612667600b80546001019055565b6000612672600b5490565b9050610f118282612d04565b60006001600160e01b031982166380ac58cd60e01b14806126af57506001600160e01b03198216635b5e139f60e01b145b80610b6757506301ffc9a760e01b6001600160e01b0319831614610b67565b6000818152600260205260409020546001600160a01b03166116765760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610a97565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906127628261127b565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806127a78361127b565b9050806001600160a01b0316846001600160a01b031614806127ee57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b806128125750836001600160a01b031661280784610bff565b6001600160a01b0316145b949350505050565b826001600160a01b031661282d8261127b565b6001600160a01b0316146128535760405162461bcd60e51b8152600401610a9790613e1c565b6001600160a01b0382166128b55760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610a97565b6128c28383836001612d1e565b826001600160a01b03166128d58261127b565b6001600160a01b0316146128fb5760405162461bcd60e51b8152600401610a9790613e1c565b600081815260046020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260038552838620805460001901905590871680865283862080546001019055868652600290945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b612993612a1e565b600a805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586129c83390565b6040516001600160a01b03909116815260200160405180910390a1565b6129ed612e4b565b600a805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa336129c8565b600a5460ff1615610d9d5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610a97565b600a80546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000612ac98261127b565b9050612ad9816000846001612d1e565b612ae28261127b565b600083815260046020908152604080832080546001600160a01b03199081169091556001600160a01b0385168085526003845282852080546000190190558785526002909352818420805490911690555192935084927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b816001600160a01b0316836001600160a01b031603612bc25760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a97565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612c3a84848461281a565b612c4684848484612e94565b6115655760405162461bcd60e51b8152600401610a9790613e61565b606060158054610b7c90613a7b565b60606000612c7e83612f95565b600101905060008167ffffffffffffffff811115612c9e57612c9e613462565b6040519080825280601f01601f191660200182016040528015612cc8576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084612cd257509392505050565b610f1182826040518060200160405280600081525061306d565b6001811115612d8d5760405162461bcd60e51b815260206004820152603560248201527f455243373231456e756d657261626c653a20636f6e7365637574697665207472604482015274185b9cd9995c9cc81b9bdd081cdd5c1c1bdc9d1959605a1b6064820152608401610a97565b816001600160a01b038516612de957612de481600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612e0c565b836001600160a01b0316856001600160a01b031614612e0c57612e0c85826130a0565b6001600160a01b038416612e2857612e238161313d565b611c15565b846001600160a01b0316846001600160a01b031614611c1557611c1584826131ec565b600a5460ff16610d9d5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610a97565b60006001600160a01b0384163b15612f8a57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612ed8903390899088908890600401613eb3565b6020604051808303816000875af1925050508015612f13575060408051601f3d908101601f19168201909252612f1091810190613ef0565b60015b612f70573d808015612f41576040519150601f19603f3d011682016040523d82523d6000602084013e612f46565b606091505b508051600003612f685760405162461bcd60e51b8152600401610a9790613e61565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612812565b506001949350505050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310612fd45772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310613000576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061301e57662386f26fc10000830492506010015b6305f5e1008310613036576305f5e100830492506008015b612710831061304a57612710830492506004015b6064831061305c576064830492506002015b600a8310610b675760010192915050565b6130778383613230565b6130846000848484612e94565b610b3d5760405162461bcd60e51b8152600401610a9790613e61565b600060016130ad8461156b565b6130b79190613f0d565b60008381526007602052604090205490915080821461310a576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061314f90600190613f0d565b6000838152600960205260408120546008805493945090928490811061317757613177613a4c565b90600052602060002001549050806008838154811061319857613198613a4c565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806131d0576131d0613f24565b6001900381819060005260206000200160009055905550505050565b60006131f78361156b565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166132865760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610a97565b6000818152600260205260409020546001600160a01b0316156132eb5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a97565b6132f9600083836001612d1e565b6000818152600260205260409020546001600160a01b03161561335e5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a97565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546133d590613a7b565b90600052602060002090601f0160209004810192826133f7576000855561343d565b82601f1061341057805160ff191683800117855561343d565b8280016001018555821561343d579182015b8281111561343d578251825591602001919060010190613422565b5061344992915061344d565b5090565b5b80821115613449576000815560010161344e565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156134a1576134a1613462565b604052919050565b600067ffffffffffffffff8211156134c3576134c3613462565b5060051b60200190565b6001600160a01b038116811461167657600080fd5b600060208083850312156134f557600080fd5b823567ffffffffffffffff81111561350c57600080fd5b8301601f8101851361351d57600080fd5b803561353061352b826134a9565b613478565b81815260059190911b8201830190838101908783111561354f57600080fd5b928401925b82841015613576578335613567816134cd565b82529284019290840190613554565b979650505050505050565b6001600160e01b03198116811461167657600080fd5b6000602082840312156135a957600080fd5b8135611cae81613581565b60005b838110156135cf5781810151838201526020016135b7565b838111156115655750506000910152565b600081518084526135f88160208601602086016135b4565b601f01601f19169290920160200192915050565b602081526000611cae60208301846135e0565b60006020828403121561363157600080fd5b5035919050565b6000806040838503121561364b57600080fd5b8235613656816134cd565b946020939093013593505050565b60008060006060848603121561367957600080fd5b8335613684816134cd565b92506020840135613694816134cd565b929592945050506040919091013590565b801515811461167657600080fd5b600080604083850312156136c657600080fd5b82356136d1816134cd565b915060208301356136e1816136a5565b809150509250929050565b600080604083850312156136ff57600080fd5b823561370a816134cd565b915060208301356136e1816134cd565b6020808252825182820181905260009190848201906040850190845b8181101561375257835183529284019291840191600101613736565b50909695505050505050565b600067ffffffffffffffff83111561377857613778613462565b61378b601f8401601f1916602001613478565b905082815283838301111561379f57600080fd5b828260208301376000602084830101529392505050565b6000602082840312156137c857600080fd5b813567ffffffffffffffff8111156137df57600080fd5b8201601f810184136137f057600080fd5b6128128482356020840161375e565b602080825282518282018190526000919060409081850190868401855b8281101561384357815180518552860151151586850152928401929085019060010161381c565b5091979650505050505050565b6000602080838503121561386357600080fd5b823567ffffffffffffffff81111561387a57600080fd5b8301601f8101851361388b57600080fd5b803561389961352b826134a9565b81815260059190911b820183019083810190878311156138b857600080fd5b928401925b82841015613576578335825292840192908401906138bd565b6000602082840312156138e857600080fd5b8135611cae816134cd565b60008060006040848603121561390857600080fd5b833567ffffffffffffffff8082111561392057600080fd5b818601915086601f83011261393457600080fd5b81358181111561394357600080fd5b8760208260051b850101111561395857600080fd5b6020928301955093505084013561396e816136a5565b809150509250925092565b6000806000806080858703121561398f57600080fd5b843561399a816134cd565b935060208501356139aa816134cd565b925060408501359150606085013567ffffffffffffffff8111156139cd57600080fd5b8501601f810187136139de57600080fd5b6139ed8782356020840161375e565b91505092959194509250565b60008060408385031215613a0c57600080fd5b8235915060208301356136e1816134cd565b634e487b7160e01b600052601160045260246000fd5b60008219821115613a4757613a47613a1e565b500190565b634e487b7160e01b600052603260045260246000fd5b600060018201613a7457613a74613a1e565b5060010190565b600181811c90821680613a8f57607f821691505b602082108103613aaf57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b600060208284031215613b1457600080fd5b5051919050565b600060208284031215613b2d57600080fd5b8151611cae816134cd565b6020808252602c908201527f77686974656c6973744d696e743a2077686974656c697374206d696e7420697360408201526b103737ba1030b1ba34bb329760a11b606082015260800190565b60208082526029908201527f77686974656c6973744d696e743a2077616c6c6574206973206e6f74206f6e206040820152681dda1a5d195b1a5cdd60ba1b606082015260800190565b6000816000190483118215151615613be757613be7613a1e565b500290565b6020808252602d908201527f75706461746550726963653a206e6577207072696365206d757374206265206760408201526c0726561746572207468616e203609c1b606082015260800190565b600060208284031215613c4b57600080fd5b8151611cae816136a5565b6020808252601a908201527f6d696e743a206e6f204e465473206c65667420746f206d696e74000000000000604082015260600190565b60208082526033908201527f6d696e743a206e6f7420656e6f756768204e46547320617661696c61626c65206040820152721d1bc81b5a5b9d081d1a185d08185b5bdd5b9d606a1b606082015260800190565b60008351613cf28184602088016135b4565b835190830190613d068183602088016135b4565b01949350505050565b60208082526039908201527f6d696e7457697468546f6b656e3a20546f6b656e206973206e6f7420616e206160408201527f7070726f76656420746f6b656e20666f72206d696e74696e6700000000000000606082015260800190565b6020808252603d908201527f6d696e7457697468546f6b656e3a204e6f7420656e6f7567682043524332302060408201527f746f6b656e2062616c61636e6520666f72206d696e7420616d6f756e74000000606082015260800190565b60208082526033908201527f6d696e7457697468546f6b656e3a20696e737566666963616e7420746f6b656e604082015272207472616e7366657220616c6c6f77616e636560681b606082015260800190565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613ee6908301846135e0565b9695505050505050565b600060208284031215613f0257600080fd5b8151611cae81613581565b600082821015613f1f57613f1f613a1e565b500390565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220034c3e55a58542263216e23d642ba303df53d58d7f2f86c310038914cccfb7d664736f6c634300080d0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000004e6795d725e26e340865140a870c25d1e413a118000000000000000000000000be5f02b6fd5c1e714f0bdd28b6a119827d8b6c61
-----Decoded View---------------
Arg [0] : _vip (address): 0x4e6795d725e26e340865140a870c25d1e413a118
Arg [1] : _ufo (address): 0xbe5f02b6fd5c1e714f0bdd28b6a119827d8b6c61
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000004e6795d725e26e340865140a870c25d1e413a118
Arg [1] : 000000000000000000000000be5f02b6fd5c1e714f0bdd28b6a119827d8b6c61
Deployed ByteCode Sourcemap
69852:9946:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77166:413;;;;;;;;;;-1:-1:-1;77166:413:0;;;;;:::i;:::-;;:::i;:::-;;57024:224;;;;;;;;;;-1:-1:-1;57024:224:0;;;;;:::i;:::-;;:::i;:::-;;;2272:14:1;;2265:22;2247:41;;2235:2;2220:18;57024:224:0;;;;;;;;70282:37;;;;;;;;;;;;;;;;;;;2445:25:1;;;2433:2;2418:18;70282:37:0;2299:177:1;40731:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;42243:171::-;;;;;;;;;;-1:-1:-1;42243:171:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;3581:32:1;;;3563:51;;3551:2;3536:18;42243:171:0;3417:203:1;41761:416:0;;;;;;;;;;-1:-1:-1;41761:416:0;;;;;:::i;:::-;;:::i;70214:18::-;;;;;;;;;;-1:-1:-1;70214:18:0;;;;-1:-1:-1;;;;;70214:18:0;;;57664:113;;;;;;;;;;-1:-1:-1;57752:10:0;:17;57664:113;;78086:84;;;;;;;;;;;;;:::i;42943:335::-;;;;;;;;;;-1:-1:-1;42943:335:0;;;;;:::i;:::-;;:::i;77980:98::-;;;;;;;;;;;;;:::i;78998:119::-;;;;;;;;;;-1:-1:-1;78998:119:0;;;;;:::i;:::-;;:::i;57332:256::-;;;;;;;;;;-1:-1:-1;57332:256:0;;;;;:::i;:::-;;:::i;79253:244::-;;;;;;;;;;;;;:::i;75802:392::-;;;;;;;;;;-1:-1:-1;75802:392:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;43349:185::-;;;;;;;;;;-1:-1:-1;43349:185:0;;;;;:::i;:::-;;:::i;70001:47::-;;;;;;;;;;-1:-1:-1;70001:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;57854:233;;;;;;;;;;-1:-1:-1;57854:233:0;;;;;:::i;:::-;;:::i;77587:93::-;;;;;;;;;;-1:-1:-1;77587:93:0;;;;;:::i;:::-;;:::i;64632:86::-;;;;;;;;;;-1:-1:-1;64703:7:0;;;;64632:86;;70326:35;;;;;;;;;;;;;;;;76590:380;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;40441:223::-;;;;;;;;;;-1:-1:-1;40441:223:0;;;;;:::i;:::-;;:::i;78553:198::-;;;;;;;;;;-1:-1:-1;78553:198:0;;;;;:::i;:::-;;:::i;74188:632::-;;;;;;;;;;-1:-1:-1;74188:632:0;;;;;:::i;:::-;;:::i;70571:46::-;;;;;;;;;;-1:-1:-1;70571:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;40172:207;;;;;;;;;;-1:-1:-1;40172:207:0;;;;;:::i;:::-;;:::i;67497:103::-;;;;;;;;;;;;;:::i;77688:193::-;;;;;;;;;;-1:-1:-1;77688:193:0;;;;;:::i;:::-;;:::i;70189:18::-;;;;;;;;;;-1:-1:-1;70189:18:0;;;;-1:-1:-1;;;;;70189:18:0;;;71364:725;;;;;;:::i;:::-;;:::i;78178:180::-;;;;;;;;;;-1:-1:-1;78178:180:0;;;;;:::i;:::-;;:::i;66849:87::-;;;;;;;;;;-1:-1:-1;66922:6:0;;;;;-1:-1:-1;;;;;66922:6:0;66849:87;;70055:47;;;;;;;;;;-1:-1:-1;70055:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;70504:24;;;;;;;;;;;;;:::i;40900:104::-;;;;;;;;;;;;;:::i;70387:41::-;;;;;;;;;;-1:-1:-1;70387:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;79505:290;;;;;;;;;;-1:-1:-1;79505:290:0;;;;;:::i;:::-;;:::i;70830:526::-;;;;;;:::i;:::-;;:::i;42486:155::-;;;;;;;;;;-1:-1:-1;42486:155:0;;;;;:::i;:::-;;:::i;78759:231::-;;;;;;;;;;-1:-1:-1;78759:231:0;;;;;:::i;:::-;;:::i;70624:44::-;;;;;;;;;;-1:-1:-1;70624:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;43605:322;;;;;;;;;;-1:-1:-1;43605:322:0;;;;;:::i;:::-;;:::i;41075:281::-;;;;;;;;;;-1:-1:-1;41075:281:0;;;;;:::i;:::-;;:::i;70435:29::-;;;;;;;;;;-1:-1:-1;70435:29:0;;;;;;;;73058:1122;;;;;;;;;;-1:-1:-1;73058:1122:0;;;;;:::i;:::-;;:::i;78366:179::-;;;;;;;;;;-1:-1:-1;78366:179:0;;;;;:::i;:::-;;:::i;70241:34::-;;;;;;;;;;;;;;;;72097:953;;;;;;;;;;-1:-1:-1;72097:953:0;;;;;:::i;:::-;;:::i;42712:164::-;;;;;;;;;;-1:-1:-1;42712:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;42833:25:0;;;42809:4;42833:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;42712:164;67755:201;;;;;;;;;;-1:-1:-1;67755:201:0;;;;;:::i;:::-;;:::i;74828:632::-;;;;;;;;;;-1:-1:-1;74828:632:0;;;;;:::i;:::-;;:::i;76202:380::-;;;;;;;;;;;;;:::i;79125:120::-;;;;;;;;;;-1:-1:-1;79125:120:0;;;;;:::i;:::-;;:::i;77166:413::-;66735:13;:11;:13::i;:::-;77238:24:::1;77265:22;:12;69278:14:::0;;69186:114;77265:22:::1;77238:49;;77321:1;77306:5;:12;:16;77298:71;;;::::0;-1:-1:-1;;;77298:71:0;;10852:2:1;77298:71:0::1;::::0;::::1;10834:21:1::0;10891:2;10871:18;;;10864:30;10930:34;10910:18;;;10903:62;-1:-1:-1;;;10981:18:1;;;10974:40;11031:19;;77298:71:0::1;;;;;;;;;77423:12;::::0;77407;;77388:31:::1;::::0;:16;:31:::1;:::i;:::-;:47;;77380:91;;;::::0;-1:-1:-1;;;77380:91:0;;11528:2:1;77380:91:0::1;::::0;::::1;11510:21:1::0;11567:2;11547:18;;;11540:30;11606:33;11586:18;;;11579:61;11657:18;;77380:91:0::1;11326:355:1::0;77380:91:0::1;77487:9;77482:90;77506:5;:12;77502:1;:16;77482:90;;;77540:19;77550:5;77556:1;77550:8;;;;;;;;:::i;:::-;;;;;;;77540:9;:19::i;:::-;77520:3:::0;::::1;::::0;::::1;:::i;:::-;;;;77482:90;;;;77227:352;77166:413:::0;:::o;57024:224::-;57126:4;-1:-1:-1;;;;;;57150:50:0;;-1:-1:-1;;;57150:50:0;;:90;;;57204:36;57228:11;57204:23;:36::i;:::-;57143:97;57024:224;-1:-1:-1;;57024:224:0:o;40731:100::-;40785:13;40818:5;40811:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40731:100;:::o;42243:171::-;42319:7;42339:23;42354:7;42339:14;:23::i;:::-;-1:-1:-1;42382:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;42382:24:0;;42243:171::o;41761:416::-;41842:13;41858:23;41873:7;41858:14;:23::i;:::-;41842:39;;41906:5;-1:-1:-1;;;;;41900:11:0;:2;-1:-1:-1;;;;;41900:11:0;;41892:57;;;;-1:-1:-1;;;41892:57:0;;12545:2:1;41892:57:0;;;12527:21:1;12584:2;12564:18;;;12557:30;12623:34;12603:18;;;12596:62;-1:-1:-1;;;12674:18:1;;;12667:31;12715:19;;41892:57:0;12343:397:1;41892:57:0;38262:10;-1:-1:-1;;;;;41984:21:0;;;;:62;;-1:-1:-1;42009:37:0;42026:5;38262:10;42712:164;:::i;42009:37::-;41962:173;;;;-1:-1:-1;;;41962:173:0;;12947:2:1;41962:173:0;;;12929:21:1;12986:2;12966:18;;;12959:30;13025:34;13005:18;;;12998:62;13096:31;13076:18;;;13069:59;13145:19;;41962:173:0;12745:425:1;41962:173:0;42148:21;42157:2;42161:7;42148:8;:21::i;78086:84::-;66735:13;:11;:13::i;:::-;78153:9:::1;::::0;;-1:-1:-1;;78140:22:0;::::1;78153:9;::::0;;::::1;78152:10;78140:22;::::0;;78086:84::o;42943:335::-;43138:41;38262:10;43171:7;43138:18;:41::i;:::-;43130:99;;;;-1:-1:-1;;;43130:99:0;;;;;;;:::i;:::-;43242:28;43252:4;43258:2;43262:7;43242:9;:28::i;77980:98::-;66735:13;:11;:13::i;:::-;64703:7;;;;78038:32:::1;;78062:8;:6;:8::i;:::-;77980:98::o:0;78038:32::-:1;78049:10;:8;:10::i;78998:119::-:0;66735:13;:11;:13::i;:::-;-1:-1:-1;;;;;79080:21:0;;;::::1;;::::0;;;:14:::1;:21;::::0;;;;:29;;-1:-1:-1;;79080:29:0::1;::::0;::::1;;::::0;;;::::1;::::0;;78998:119::o;57332:256::-;57429:7;57465:23;57482:5;57465:16;:23::i;:::-;57457:5;:31;57449:87;;;;-1:-1:-1;;;57449:87:0;;13791:2:1;57449:87:0;;;13773:21:1;13830:2;13810:18;;;13803:30;13869:34;13849:18;;;13842:62;-1:-1:-1;;;13920:18:1;;;13913:41;13971:19;;57449:87:0;13589:407:1;57449:87:0;-1:-1:-1;;;;;;57554:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;57332:256::o;79253:244::-;66735:13;:11;:13::i;:::-;79335:1:::1;79311:21;:25;79303:87;;;::::0;-1:-1:-1;;;79303:87:0;;14203:2:1;79303:87:0::1;::::0;::::1;14185:21:1::0;14242:2;14222:18;;;14215:30;14281:34;14261:18;;;14254:62;-1:-1:-1;;;14332:18:1;;;14325:47;14389:19;;79303:87:0::1;14001:413:1::0;79303:87:0::1;79452:37;::::0;79420:21:::1;::::0;79460:10:::1;::::0;79452:37;::::1;;;::::0;79420:21;;79402:15:::1;79452:37:::0;79402:15;79452:37;79420:21;79460:10;79452:37;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;79292:205;79253:244::o:0;75802:392::-;75928:46;;-1:-1:-1;;;75928:46:0;;-1:-1:-1;;;;;3581:32:1;;;75928:46:0;;;3563:51:1;75885:16:0;;75914:11;;75928:38;;;;;3536:18:1;;75928:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;75914:60;;75985:20;76022:3;76008:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;76008:18:0;;75985:41;;76042:9;76037:129;76061:3;76057:1;:7;76037:129;;;76095:59;;-1:-1:-1;;;76095:59:0;;-1:-1:-1;;;;;14800:32:1;;;76095:59:0;;;14782:51:1;14849:18;;;14842:34;;;76095:48:0;;;;;14755:18:1;;76095:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;76086:3;76090:1;76086:6;;;;;;;;:::i;:::-;;;;;;;;;;:68;76066:3;;;;:::i;:::-;;;;76037:129;;;-1:-1:-1;76183:3:0;75802:392;-1:-1:-1;;;;75802:392:0:o;43349:185::-;43487:39;43504:4;43510:2;43514:7;43487:39;;;;;;;;;;;;:16;:39::i;57854:233::-;57929:7;57965:30;57752:10;:17;;57664:113;57965:30;57957:5;:38;57949:95;;;;-1:-1:-1;;;57949:95:0;;15089:2:1;57949:95:0;;;15071:21:1;15128:2;15108:18;;;15101:30;15167:34;15147:18;;;15140:62;-1:-1:-1;;;15218:18:1;;;15211:42;15270:19;;57949:95:0;14887:408:1;57949:95:0;58062:10;58073:5;58062:17;;;;;;;;:::i;:::-;;;;;;;;;58055:24;;57854:233;;;:::o;77587:93::-;66735:13;:11;:13::i;:::-;77655:17;;::::1;::::0;:10:::1;::::0;:17:::1;::::0;::::1;::::0;::::1;:::i;76590:380::-:0;76706:3;;76634:18;;76665:20;;76688:34;;-1:-1:-1;;;;;76706:3:0;76711:10;76688:17;:34::i;:::-;76747:10;;76665:57;;-1:-1:-1;76733:11:0;76747:10;76796:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;76796:20:0;;;;;;;;;;;;;;;;76768:48;;76832:6;76827:112;76848:3;76844:1;:7;76827:112;;;76885:42;;;;;;;;76895:3;76899:1;76895:6;;;;;;;;:::i;:::-;;;;;;;76885:42;;;;76903:15;:23;76919:3;76923:1;76919:6;;;;;;;;:::i;:::-;;;;;;;76903:23;;;;;;;;;;;;;;;;;;;;;76885:42;;;;;76873:6;76880:1;76873:9;;;;;;;;:::i;:::-;;;;;;:54;;;;76853:3;;;;;:::i;:::-;;;;76827:112;;;-1:-1:-1;76956:6:0;76590:380;-1:-1:-1;;;76590:380:0:o;40441:223::-;40513:7;45328:16;;;:7;:16;;;;;;-1:-1:-1;;;;;45328:16:0;;40577:56;;;;-1:-1:-1;;;40577:56:0;;15502:2:1;40577:56:0;;;15484:21:1;15541:2;15521:18;;;15514:30;-1:-1:-1;;;15560:18:1;;;15553:54;15624:18;;40577:56:0;15300:348:1;78553:198:0;66735:13;:11;:13::i;:::-;78649:1:::1;78637:9;:13;78629:78;;;::::0;-1:-1:-1;;;78629:78:0;;15855:2:1;78629:78:0::1;::::0;::::1;15837:21:1::0;15894:2;15874:18;;;15867:30;15933:34;15913:18;;;15906:62;-1:-1:-1;;;15984:18:1;;;15977:50;16044:19;;78629:78:0::1;15653:416:1::0;78629:78:0::1;78719:12;:24:::0;78553:198::o;74188:632::-;64237:19;:17;:19::i;:::-;74276:10;;74262:11:::1;74324:22;:12;69278:14:::0;;69186:114;74324:22:::1;74297:49;;74398:12;;74384:3;:10;74365:16;:29;;;;:::i;:::-;:45;;74357:90;;;::::0;-1:-1:-1;;;74357:90:0;;16276:2:1;74357:90:0::1;::::0;::::1;16258:21:1::0;;;16295:18;;;16288:30;16354:34;16334:18;;;16327:62;16406:18;;74357:90:0::1;16074:356:1::0;74357:90:0::1;74463:9;74458:355;74482:3;74478:1;:7;74458:355;;;74507:10;74520:3;74524:1;74520:6;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;74549:19:::1;::::0;;;:15:::1;:19:::0;;;;;;;;74520:6;;-1:-1:-1;74549:19:0::1;;:28;74541:85;;;::::0;-1:-1:-1;;;74541:85:0;;16637:2:1;74541:85:0::1;::::0;::::1;16619:21:1::0;16676:2;16656:18;;;16649:30;16715:34;16695:18;;;16688:62;-1:-1:-1;;;16766:18:1;;;16759:42;16818:19;;74541:85:0::1;16435:408:1::0;74541:85:0::1;74657:3;::::0;74649:24:::1;::::0;-1:-1:-1;;;74649:24:0;;::::1;::::0;::::1;2445:25:1::0;;;74677:10:0::1;::::0;-1:-1:-1;;;;;74657:3:0::1;::::0;74649:20:::1;::::0;2418:18:1;;74649:24:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;74649:38:0::1;;74641:83;;;::::0;-1:-1:-1;;;74641:83:0;;17306:2:1;74641:83:0::1;::::0;::::1;17288:21:1::0;;;17325:18;;;17318:30;17384:34;17364:18;;;17357:62;17436:18;;74641:83:0::1;17104:356:1::0;74641:83:0::1;74739:19;::::0;;;:15:::1;:19;::::0;;;;:26;;-1:-1:-1;;74739:26:0::1;74761:4;74739:26;::::0;;74780:21:::1;74790:10;74780:9;:21::i;:::-;-1:-1:-1::0;74487:3:0;::::1;::::0;::::1;:::i;:::-;;;;74458:355;;;;74251:569;;74188:632:::0;:::o;40172:207::-;40244:7;-1:-1:-1;;;;;40272:19:0;;40264:73;;;;-1:-1:-1;;;40264:73:0;;17667:2:1;40264:73:0;;;17649:21:1;17706:2;17686:18;;;17679:30;17745:34;17725:18;;;17718:62;-1:-1:-1;;;17796:18:1;;;17789:39;17845:19;;40264:73:0;17465:405:1;40264:73:0;-1:-1:-1;;;;;;40355:16:0;;;;;:9;:16;;;;;;;40172:207::o;67497:103::-;66735:13;:11;:13::i;:::-;67562:30:::1;67589:1;67562:18;:30::i;77688:193::-:0;77760:39;77779:10;77791:7;77760:18;:39::i;:::-;77752:95;;;;-1:-1:-1;;;77752:95:0;;18077:2:1;77752:95:0;;;18059:21:1;18116:2;18096:18;;;18089:30;18155:34;18135:18;;;18128:62;-1:-1:-1;;;18206:18:1;;;18199:41;18257:19;;77752:95:0;17875:407:1;77752:95:0;77859:14;77865:7;77859:5;:14::i;:::-;77688:193;:::o;71364:725::-;71439:9;;;;:17;;:9;:17;71431:74;;;;-1:-1:-1;;;71431:74:0;;;;;;;:::i;:::-;71534:10;71524:21;;;;:9;:21;;;;;;;;:29;;:21;:29;71516:83;;;;-1:-1:-1;;;71516:83:0;;;;;;;:::i;:::-;71610:24;71637:22;:12;69278:14;;69186:114;71637:22;71610:49;;71697:12;;71678:16;:31;71670:79;;;;-1:-1:-1;;;71670:79:0;;19312:2:1;71670:79:0;;;19294:21:1;19351:2;19331:18;;;19324:30;19390:34;19370:18;;;19363:62;-1:-1:-1;;;19441:18:1;;;19434:33;19484:19;;71670:79:0;19110:399:1;71670:79:0;71797:12;;71768:25;71787:6;71768:16;:25;:::i;:::-;:41;;71760:114;;;;-1:-1:-1;;;71760:114:0;;19716:2:1;71760:114:0;;;19698:21:1;19755:2;19735:18;;;19728:30;19794:34;19774:18;;;19767:62;19865:30;19845:18;;;19838:58;19913:19;;71760:114:0;19514:424:1;71760:114:0;71915:8;;71906:17;;:6;:17;:::i;:::-;71893:9;:30;71885:98;;;;-1:-1:-1;;;71885:98:0;;20318:2:1;71885:98:0;;;20300:21:1;20357:2;20337:18;;;20330:30;20396:34;20376:18;;;20369:62;20467:25;20447:18;;;20440:53;20510:19;;71885:98:0;20116:419:1;71885:98:0;72002:9;71997:85;72021:6;72017:1;:10;71997:85;;;72049:21;72059:10;72049:9;:21::i;:::-;72029:3;;;;:::i;:::-;;;;71997:85;;78178:180;66735:13;:11;:13::i;:::-;78266:1:::1;78255:8;:12;78247:70;;;;-1:-1:-1::0;;;78247:70:0::1;;;;;;;:::i;:::-;78328:10;:21:::0;78178:180::o;70504:24::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;40900:104::-;40956:13;40989:7;40982:14;;;;;:::i;79505:290::-;66735:13;:11;:13::i;:::-;79601:42:::1;::::0;-1:-1:-1;;;79601:42:0;;79637:4:::1;79601:42;::::0;::::1;3563:51:1::0;79647:6:0;;-1:-1:-1;;;;;79601:27:0;::::1;::::0;::::1;::::0;3536:18:1;;79601:42:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:52;;79593:136;;;::::0;-1:-1:-1;;;79593:136:0;;21156:2:1;79593:136:0::1;::::0;::::1;21138:21:1::0;21195:2;21175:18;;;21168:30;21234:34;21214:18;;;21207:62;21305:34;21285:18;;;21278:62;-1:-1:-1;;;21356:19:1;;;21349:38;21404:19;;79593:136:0::1;20954:475:1::0;79593:136:0::1;79741:46;::::0;-1:-1:-1;;;79741:46:0;;79768:10:::1;79741:46;::::0;::::1;14782:51:1::0;14849:18;;;14842:34;;;-1:-1:-1;;;;;79741:26:0;::::1;::::0;::::1;::::0;14755:18:1;;79741:46:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;70830:526::-:0;64237:19;:17;:19::i;:::-;70902:24:::1;70929:22;:12;69278:14:::0;;69186:114;70929:22:::1;70902:49;;70989:12;;70970:16;:31;70962:70;;;;-1:-1:-1::0;;;70962:70:0::1;;;;;;;:::i;:::-;71080:12;::::0;71051:25:::1;71070:6:::0;71051:16;:25:::1;:::i;:::-;:41;;71043:105;;;;-1:-1:-1::0;;;71043:105:0::1;;;;;;;:::i;:::-;71189:10;::::0;71180:19:::1;::::0;:6;:19:::1;:::i;:::-;71167:9;:32;71159:91;;;::::0;-1:-1:-1;;;71159:91:0;;22661:2:1;71159:91:0::1;::::0;::::1;22643:21:1::0;22700:2;22680:18;;;22673:30;22739:34;22719:18;;;22712:62;-1:-1:-1;;;22790:18:1;;;22783:44;22844:19;;71159:91:0::1;22459:410:1::0;71159:91:0::1;71269:9;71264:85;71288:6;71284:1;:10;71264:85;;;71316:21;71326:10;71316:9;:21::i;:::-;71296:3:::0;::::1;::::0;::::1;:::i;:::-;;;;71264:85;;42486:155:::0;42581:52;38262:10;42614:8;42624;42581:18;:52::i;78759:231::-;66735:13;:11;:13::i;:::-;78869:5;78852:14:::1;78892:91;78916:6;78912:1;:10;78892:91;;;78966:5;78944:9;:19;78954:5;;78960:1;78954:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;78944:19:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;78944:19:0;:27;;-1:-1:-1;;78944:27:0::1;::::0;::::1;;::::0;;;::::1;::::0;;78924:3;::::1;::::0;::::1;:::i;:::-;;;;78892:91;;;;78841:149;78759:231:::0;;;:::o;43605:322::-;43779:41;38262:10;43812:7;43779:18;:41::i;:::-;43771:99;;;;-1:-1:-1;;;43771:99:0;;;;;;;:::i;:::-;43881:38;43895:4;43901:2;43905:7;43914:4;43881:13;:38::i;41075:281::-;41148:13;41174:23;41189:7;41174:14;:23::i;:::-;41210:21;41234:10;:8;:10::i;:::-;41210:34;;41286:1;41268:7;41262:21;:25;:86;;;;;;;;;;;;;;;;;41314:7;41323:18;:7;:16;:18::i;:::-;41297:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41262:86;41255:93;41075:281;-1:-1:-1;;;41075:281:0:o;73058:1122::-;73142:9;;;;:17;;:9;:17;73134:74;;;;-1:-1:-1;;;73134:74:0;;;;;;;:::i;:::-;73237:10;73227:21;;;;:9;:21;;;;;;;;:29;;:21;:29;73219:83;;;;-1:-1:-1;;;73219:83:0;;;;;;;:::i;:::-;73315:24;73342:22;:12;69278:14;;69186:114;73342:22;73315:49;;73402:12;;73383:16;:31;73375:70;;;;-1:-1:-1;;;73375:70:0;;;;;;;:::i;:::-;73493:12;;73464:25;73483:6;73464:16;:25;:::i;:::-;:41;;73456:105;;;;-1:-1:-1;;;73456:105:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;73582:21:0;;;;;;:14;:21;;;;;;;;:29;;:21;:29;73574:99;;;;-1:-1:-1;;;73574:99:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;73705:16:0;;73686;73705;;;:9;:16;;;;;;:25;;73724:6;;73705:25;:::i;:::-;73749:35;;-1:-1:-1;;;73749:35:0;;73773:10;73749:35;;;3563:51:1;73686:44:0;;-1:-1:-1;73686:44:0;;-1:-1:-1;;;;;73749:23:0;;;;;3536:18:1;;73749:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:47;;73741:121;;;;-1:-1:-1;;;73741:121:0;;;;;;;:::i;:::-;73881:50;;-1:-1:-1;;;73881:50:0;;73905:10;73881:50;;;24417:34:1;73925:4:0;24467:18:1;;;24460:43;73935:8:0;;-1:-1:-1;;;;;73881:23:0;;;;;24352:18:1;;73881:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:62;;73873:126;;;;-1:-1:-1;;;73873:126:0;;;;;;;:::i;:::-;74012:63;;-1:-1:-1;;;74012:63:0;;74039:10;74012:63;;;25174:34:1;74059:4:0;25224:18:1;;;25217:43;25276:18;;;25269:34;;;-1:-1:-1;;;;;74012:26:0;;;;;25109:18:1;;74012:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;74093:9;74088:85;74112:6;74108:1;:10;74088:85;;;74140:21;74150:10;74140:9;:21::i;:::-;74120:3;;;;:::i;:::-;;;;74088:85;;78366:179;66735:13;:11;:13::i;:::-;78456:1:::1;78445:8;:12;78437:70;;;;-1:-1:-1::0;;;78437:70:0::1;;;;;;;:::i;:::-;78518:8;:19:::0;78366:179::o;72097:953::-;64237:19;:17;:19::i;:::-;72185:24:::1;72212:22;:12;69278:14:::0;;69186:114;72212:22:::1;72185:49;;72272:12;;72253:16;:31;72245:70;;;;-1:-1:-1::0;;;72245:70:0::1;;;;;;;:::i;:::-;72363:12;::::0;72334:25:::1;72353:6:::0;72334:16;:25:::1;:::i;:::-;:41;;72326:105;;;;-1:-1:-1::0;;;72326:105:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;72452:21:0;::::1;;::::0;;;:14:::1;:21;::::0;;;;;::::1;;:29;;:21:::0;:29:::1;72444:99;;;;-1:-1:-1::0;;;72444:99:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;72575:16:0;::::1;72556;72575::::0;;;:9:::1;:16;::::0;;;;;:25:::1;::::0;72594:6;;72575:25:::1;:::i;:::-;72619:35;::::0;-1:-1:-1;;;72619:35:0;;72643:10:::1;72619:35;::::0;::::1;3563:51:1::0;72556:44:0;;-1:-1:-1;72556:44:0;;-1:-1:-1;;;;;72619:23:0;::::1;::::0;::::1;::::0;3536:18:1;;72619:35:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:47;;72611:121;;;;-1:-1:-1::0;;;72611:121:0::1;;;;;;;:::i;:::-;72751:50;::::0;-1:-1:-1;;;72751:50:0;;72775:10:::1;72751:50;::::0;::::1;24417:34:1::0;72795:4:0::1;24467:18:1::0;;;24460:43;72805:8:0;;-1:-1:-1;;;;;72751:23:0;::::1;::::0;::::1;::::0;24352:18:1;;72751:50:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:62;;72743:126;;;;-1:-1:-1::0;;;72743:126:0::1;;;;;;;:::i;:::-;72882:63;::::0;-1:-1:-1;;;72882:63:0;;72909:10:::1;72882:63;::::0;::::1;25174:34:1::0;72929:4:0::1;25224:18:1::0;;;25217:43;25276:18;;;25269:34;;;-1:-1:-1;;;;;72882:26:0;::::1;::::0;::::1;::::0;25109:18:1;;72882:63:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;72963:9;72958:85;72982:6;72978:1;:10;72958:85;;;73010:21;73020:10;73010:9;:21::i;:::-;72990:3:::0;::::1;::::0;::::1;:::i;:::-;;;;72958:85;;67755:201:::0;66735:13;:11;:13::i;:::-;-1:-1:-1;;;;;67844:22:0;::::1;67836:73;;;::::0;-1:-1:-1;;;67836:73:0;;25516:2:1;67836:73:0::1;::::0;::::1;25498:21:1::0;25555:2;25535:18;;;25528:30;25594:34;25574:18;;;25567:62;-1:-1:-1;;;25645:18:1;;;25638:36;25691:19;;67836:73:0::1;25314:402:1::0;67836:73:0::1;67920:28;67939:8;67920:18;:28::i;74828:632::-:0;64237:19;:17;:19::i;:::-;74916:10;;74902:11:::1;74964:22;:12;69278:14:::0;;69186:114;74964:22:::1;74937:49;;75038:12;;75024:3;:10;75005:16;:29;;;;:::i;:::-;:45;;74997:90;;;::::0;-1:-1:-1;;;74997:90:0;;25923:2:1;74997:90:0::1;::::0;::::1;25905:21:1::0;;;25942:18;;;25935:30;26001:34;25981:18;;;25974:62;26053:18;;74997:90:0::1;25721:356:1::0;74997:90:0::1;75103:9;75098:355;75122:3;75118:1;:7;75098:355;;;75147:10;75160:3;75164:1;75160:6;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;75189:19:::1;::::0;;;:15:::1;:19:::0;;;;;;;;75160:6;;-1:-1:-1;75189:19:0::1;;:28;75181:85;;;::::0;-1:-1:-1;;;75181:85:0;;26284:2:1;75181:85:0::1;::::0;::::1;26266:21:1::0;26323:2;26303:18;;;26296:30;26362:34;26342:18;;;26335:62;-1:-1:-1;;;26413:18:1;;;26406:42;26465:19;;75181:85:0::1;26082:408:1::0;75181:85:0::1;75297:3;::::0;75289:24:::1;::::0;-1:-1:-1;;;75289:24:0;;::::1;::::0;::::1;2445:25:1::0;;;75317:10:0::1;::::0;-1:-1:-1;;;;;75297:3:0::1;::::0;75289:20:::1;::::0;2418:18:1;;75289:24:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;75289:38:0::1;;75281:83;;;::::0;-1:-1:-1;;;75281:83:0;;26697:2:1;75281:83:0::1;::::0;::::1;26679:21:1::0;;;26716:18;;;26709:30;26775:34;26755:18;;;26748:62;26827:18;;75281:83:0::1;26495:356:1::0;75281:83:0::1;75379:19;::::0;;;:15:::1;:19;::::0;;;;:26;;-1:-1:-1;;75379:26:0::1;75401:4;75379:26;::::0;;75420:21:::1;75430:10;75420:9;:21::i;:::-;-1:-1:-1::0;75127:3:0;::::1;::::0;::::1;:::i;:::-;;;;75098:355;;76202:380:::0;76318:3;;76246:18;;76277:20;;76300:34;;-1:-1:-1;;;;;76318:3:0;76323:10;76300:17;:34::i;:::-;76359:10;;76277:57;;-1:-1:-1;76345:11:0;76359:10;76408:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;76408:20:0;;;;;;;;;;;;;;;;76380:48;;76444:6;76439:112;76460:3;76456:1;:7;76439:112;;;76497:42;;;;;;;;76507:3;76511:1;76507:6;;;;;;;;:::i;:::-;;;;;;;76497:42;;;;76515:15;:23;76531:3;76535:1;76531:6;;;;;;;;:::i;:::-;;;;;;;76515:23;;;;;;;;;;;;;;;;;;;;;76497:42;;;;;76485:6;76492:1;76485:9;;;;;;;;:::i;:::-;;;;;;:54;;;;76465:3;;;;;:::i;:::-;;;;76439:112;;79125:120;66735:13;:11;:13::i;:::-;-1:-1:-1;;;;;79214:16:0;;::::1;;::::0;;;:9:::1;:16;::::0;;;;:23;79125:120::o;67014:132::-;66922:6;;-1:-1:-1;;;;;66922:6:0;;;;;38262:10;67078:23;67070:68;;;;-1:-1:-1;;;67070:68:0;;27058:2:1;67070:68:0;;;27040:21:1;;;27077:18;;;27070:30;27136:34;27116:18;;;27109:62;27188:18;;67070:68:0;26856:356:1;75468:157:0;75519:24;:12;69397:19;;69415:1;69397:19;;;69308:127;75519:24;75554:10;75567:22;:12;69278:14;;69186:114;75567:22;75554:35;;75600:17;75610:2;75614;75600:9;:17::i;39803:305::-;39905:4;-1:-1:-1;;;;;;39942:40:0;;-1:-1:-1;;;39942:40:0;;:105;;-1:-1:-1;;;;;;;39999:48:0;;-1:-1:-1;;;39999:48:0;39942:105;:158;;;-1:-1:-1;;;;;;;;;;30451:40:0;;;40064:36;30342:157;52062:135;45730:4;45328:16;;;:7;:16;;;;;;-1:-1:-1;;;;;45328:16:0;52136:53;;;;-1:-1:-1;;;52136:53:0;;15502:2:1;52136:53:0;;;15484:21:1;15541:2;15521:18;;;15514:30;-1:-1:-1;;;15560:18:1;;;15553:54;15624:18;;52136:53:0;15300:348:1;51341:174:0;51416:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;51416:29:0;-1:-1:-1;;;;;51416:29:0;;;;;;;;:24;;51470:23;51416:24;51470:14;:23::i;:::-;-1:-1:-1;;;;;51461:46:0;;;;;;;;;;;51341:174;;:::o;45960:264::-;46053:4;46070:13;46086:23;46101:7;46086:14;:23::i;:::-;46070:39;;46139:5;-1:-1:-1;;;;;46128:16:0;:7;-1:-1:-1;;;;;46128:16:0;;:52;;;-1:-1:-1;;;;;;42833:25:0;;;42809:4;42833:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;46148:32;46128:87;;;;46208:7;-1:-1:-1;;;;;46184:31:0;:20;46196:7;46184:11;:20::i;:::-;-1:-1:-1;;;;;46184:31:0;;46128:87;46120:96;45960:264;-1:-1:-1;;;;45960:264:0:o;49959:1263::-;50118:4;-1:-1:-1;;;;;50091:31:0;:23;50106:7;50091:14;:23::i;:::-;-1:-1:-1;;;;;50091:31:0;;50083:81;;;;-1:-1:-1;;;50083:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;50183:16:0;;50175:65;;;;-1:-1:-1;;;50175:65:0;;27825:2:1;50175:65:0;;;27807:21:1;27864:2;27844:18;;;27837:30;27903:34;27883:18;;;27876:62;-1:-1:-1;;;27954:18:1;;;27947:34;27998:19;;50175:65:0;27623:400:1;50175:65:0;50253:42;50274:4;50280:2;50284:7;50293:1;50253:20;:42::i;:::-;50425:4;-1:-1:-1;;;;;50398:31:0;:23;50413:7;50398:14;:23::i;:::-;-1:-1:-1;;;;;50398:31:0;;50390:81;;;;-1:-1:-1;;;50390:81:0;;;;;;;:::i;:::-;50543:24;;;;:15;:24;;;;;;;;50536:31;;-1:-1:-1;;;;;;50536:31:0;;;;;;-1:-1:-1;;;;;51019:15:0;;;;;;:9;:15;;;;;:20;;-1:-1:-1;;51019:20:0;;;51054:13;;;;;;;;;:18;;50536:31;51054:18;;;51094:16;;;:7;:16;;;;;;:21;;;;;;;;;;51133:27;;50559:7;;51133:27;;;77482:90:::1;77227:352;77166:413:::0;:::o;65228:118::-;64237:19;:17;:19::i;:::-;65288:7:::1;:14:::0;;-1:-1:-1;;65288:14:0::1;65298:4;65288:14;::::0;;65318:20:::1;65325:12;38262:10:::0;;38182:98;65325:12:::1;65318:20;::::0;-1:-1:-1;;;;;3581:32:1;;;3563:51;;3551:2;3536:18;65318:20:0::1;;;;;;;65228:118::o:0;65487:120::-;64496:16;:14;:16::i;:::-;65546:7:::1;:15:::0;;-1:-1:-1;;65546:15:0::1;::::0;;65577:22:::1;38262:10:::0;65586:12:::1;38182:98:::0;64791:108;64703:7;;;;64861:9;64853:38;;;;-1:-1:-1;;;64853:38:0;;28230:2:1;64853:38:0;;;28212:21:1;28269:2;28249:18;;;28242:30;-1:-1:-1;;;28288:18:1;;;28281:46;28344:18;;64853:38:0;28028:340:1;68116:191:0;68209:6;;;-1:-1:-1;;;;;68226:17:0;;;68209:6;68226:17;;;-1:-1:-1;;;;;;68226:17:0;;;;;;68259:40;;68209:6;;;;;;;;68259:40;;68190:16;;68259:40;68179:128;68116:191;:::o;48839:783::-;48899:13;48915:23;48930:7;48915:14;:23::i;:::-;48899:39;;48951:51;48972:5;48987:1;48991:7;49000:1;48951:20;:51::i;:::-;49115:23;49130:7;49115:14;:23::i;:::-;49186:24;;;;:15;:24;;;;;;;;49179:31;;-1:-1:-1;;;;;;49179:31:0;;;;;;-1:-1:-1;;;;;49431:16:0;;;;;:9;:16;;;;;:21;;-1:-1:-1;;49431:21:0;;;49481:16;;;:7;:16;;;;;;49474:23;;;;;;;49515:36;49107:31;;-1:-1:-1;49202:7:0;;49515:36;;49186:24;;49515:36;79452:37:::1;79292:205;79253:244::o:0;51658:315::-;51813:8;-1:-1:-1;;;;;51804:17:0;:5;-1:-1:-1;;;;;51804:17:0;;51796:55;;;;-1:-1:-1;;;51796:55:0;;28575:2:1;51796:55:0;;;28557:21:1;28614:2;28594:18;;;28587:30;28653:27;28633:18;;;28626:55;28698:18;;51796:55:0;28373:349:1;51796:55:0;-1:-1:-1;;;;;51862:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;51862:46:0;;;;;;;;;;51924:41;;2247::1;;;51924::0;;2220:18:1;51924:41:0;;;;;;;51658:315;;;:::o;44808:313::-;44964:28;44974:4;44980:2;44984:7;44964:9;:28::i;:::-;45011:47;45034:4;45040:2;45044:7;45053:4;45011:22;:47::i;:::-;45003:110;;;;-1:-1:-1;;;45003:110:0;;;;;;;:::i;77055:103::-;77107:13;77140:10;77133:17;;;;;:::i;16184:716::-;16240:13;16291:14;16308:17;16319:5;16308:10;:17::i;:::-;16328:1;16308:21;16291:38;;16344:20;16378:6;16367:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16367:18:0;-1:-1:-1;16344:41:0;-1:-1:-1;16509:28:0;;;16525:2;16509:28;16566:288;-1:-1:-1;;16598:5:0;-1:-1:-1;;;16735:2:0;16724:14;;16719:30;16598:5;16706:44;16796:2;16787:11;;;-1:-1:-1;16817:21:0;16566:288;16817:21;-1:-1:-1;16875:6:0;16184:716;-1:-1:-1;;;16184:716:0:o;46566:110::-;46642:26;46652:2;46656:7;46642:26;;;;;;;;;;;;:9;:26::i;58161:915::-;58428:1;58416:9;:13;58412:222;;;58559:63;;-1:-1:-1;;;58559:63:0;;29480:2:1;58559:63:0;;;29462:21:1;29519:2;29499:18;;;29492:30;29558:34;29538:18;;;29531:62;-1:-1:-1;;;29609:18:1;;;29602:51;29670:19;;58559:63:0;29278:417:1;58412:222:0;58664:12;-1:-1:-1;;;;;58693:18:0;;58689:187;;58728:40;58760:7;59903:10;:17;;59876:24;;;;:15;:24;;;;;:44;;;59931:24;;;;;;;;;;;;59799:164;58728:40;58689:187;;;58798:2;-1:-1:-1;;;;;58790:10:0;:4;-1:-1:-1;;;;;58790:10:0;;58786:90;;58817:47;58850:4;58856:7;58817:32;:47::i;:::-;-1:-1:-1;;;;;58890:16:0;;58886:183;;58923:45;58960:7;58923:36;:45::i;:::-;58886:183;;;58996:4;-1:-1:-1;;;;;58990:10:0;:2;-1:-1:-1;;;;;58990:10:0;;58986:83;;59017:40;59045:2;59049:7;59017:27;:40::i;64976:108::-;64703:7;;;;65035:41;;;;-1:-1:-1;;;65035:41:0;;29902:2:1;65035:41:0;;;29884:21:1;29941:2;29921:18;;;29914:30;-1:-1:-1;;;29960:18:1;;;29953:50;30020:18;;65035:41:0;29700:344:1;52761:853:0;52915:4;-1:-1:-1;;;;;52936:13:0;;19606:19;:23;52932:675;;52972:71;;-1:-1:-1;;;52972:71:0;;-1:-1:-1;;;;;52972:36:0;;;;;:71;;38262:10;;53023:4;;53029:7;;53038:4;;52972:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52972:71:0;;;;;;;;-1:-1:-1;;52972:71:0;;;;;;;;;;;;:::i;:::-;;;52968:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53213:6;:13;53230:1;53213:18;53209:328;;53256:60;;-1:-1:-1;;;53256:60:0;;;;;;;:::i;53209:328::-;53487:6;53481:13;53472:6;53468:2;53464:15;53457:38;52968:584;-1:-1:-1;;;;;;53094:51:0;-1:-1:-1;;;53094:51:0;;-1:-1:-1;53087:58:0;;52932:675;-1:-1:-1;53591:4:0;52761:853;;;;;;:::o;13050:922::-;13103:7;;-1:-1:-1;;;13181:15:0;;13177:102;;-1:-1:-1;;;13217:15:0;;;-1:-1:-1;13261:2:0;13251:12;13177:102;13306:6;13297:5;:15;13293:102;;13342:6;13333:15;;;-1:-1:-1;13377:2:0;13367:12;13293:102;13422:6;13413:5;:15;13409:102;;13458:6;13449:15;;;-1:-1:-1;13493:2:0;13483:12;13409:102;13538:5;13529;:14;13525:99;;13573:5;13564:14;;;-1:-1:-1;13607:1:0;13597:11;13525:99;13651:5;13642;:14;13638:99;;13686:5;13677:14;;;-1:-1:-1;13720:1:0;13710:11;13638:99;13764:5;13755;:14;13751:99;;13799:5;13790:14;;;-1:-1:-1;13833:1:0;13823:11;13751:99;13877:5;13868;:14;13864:66;;13913:1;13903:11;13958:6;13050:922;-1:-1:-1;;13050:922:0:o;46903:319::-;47032:18;47038:2;47042:7;47032:5;:18::i;:::-;47083:53;47114:1;47118:2;47122:7;47131:4;47083:22;:53::i;:::-;47061:153;;;;-1:-1:-1;;;47061:153:0;;;;;;;:::i;60590:988::-;60856:22;60906:1;60881:22;60898:4;60881:16;:22::i;:::-;:26;;;;:::i;:::-;60918:18;60939:26;;;:17;:26;;;;;;60856:51;;-1:-1:-1;61072:28:0;;;61068:328;;-1:-1:-1;;;;;61139:18:0;;61117:19;61139:18;;;:12;:18;;;;;;;;:34;;;;;;;;;61190:30;;;;;;:44;;;61307:30;;:17;:30;;;;;:43;;;61068:328;-1:-1:-1;61492:26:0;;;;:17;:26;;;;;;;;61485:33;;;-1:-1:-1;;;;;61536:18:0;;;;;:12;:18;;;;;:34;;;;;;;61529:41;60590:988::o;61873:1079::-;62151:10;:17;62126:22;;62151:21;;62171:1;;62151:21;:::i;:::-;62183:18;62204:24;;;:15;:24;;;;;;62577:10;:26;;62126:46;;-1:-1:-1;62204:24:0;;62126:46;;62577:26;;;;;;:::i;:::-;;;;;;;;;62555:48;;62641:11;62616:10;62627;62616:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;62721:28;;;:15;:28;;;;;;;:41;;;62893:24;;;;;62886:31;62928:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;61944:1008;;;61873:1079;:::o;59377:221::-;59462:14;59479:20;59496:2;59479:16;:20::i;:::-;-1:-1:-1;;;;;59510:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;59555:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;59377:221:0:o;47558:942::-;-1:-1:-1;;;;;47638:16:0;;47630:61;;;;-1:-1:-1;;;47630:61:0;;31261:2:1;47630:61:0;;;31243:21:1;;;31280:18;;;31273:30;31339:34;31319:18;;;31312:62;31391:18;;47630:61:0;31059:356:1;47630:61:0;45730:4;45328:16;;;:7;:16;;;;;;-1:-1:-1;;;;;45328:16:0;45754:31;47702:58;;;;-1:-1:-1;;;47702:58:0;;31622:2:1;47702:58:0;;;31604:21:1;31661:2;31641:18;;;31634:30;31700;31680:18;;;31673:58;31748:18;;47702:58:0;31420:352:1;47702:58:0;47773:48;47802:1;47806:2;47810:7;47819:1;47773:20;:48::i;:::-;45730:4;45328:16;;;:7;:16;;;;;;-1:-1:-1;;;;;45328:16:0;45754:31;47911:58;;;;-1:-1:-1;;;47911:58:0;;31622:2:1;47911:58:0;;;31604:21:1;31661:2;31641:18;;;31634:30;31700;31680:18;;;31673:58;31748:18;;47911:58:0;31420:352:1;47911:58:0;-1:-1:-1;;;;;48318:13:0;;;;;;:9;:13;;;;;;;;:18;;48335:1;48318:18;;;48360:16;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;48360:21:0;;;;;48399:33;48368:7;;48318:13;;48399:33;;48318:13;;48399:33;79452:37:::1;79292:205;79253:244::o:0;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:127:1;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:275;217:2;211:9;282:2;263:13;;-1:-1:-1;;259:27:1;247:40;;317:18;302:34;;338:22;;;299:62;296:88;;;364:18;;:::i;:::-;400:2;393:22;146:275;;-1:-1:-1;146:275:1:o;426:183::-;486:4;519:18;511:6;508:30;505:56;;;541:18;;:::i;:::-;-1:-1:-1;586:1:1;582:14;598:4;578:25;;426:183::o;614:131::-;-1:-1:-1;;;;;689:31:1;;679:42;;669:70;;735:1;732;725:12;750:966;834:6;865:2;908;896:9;887:7;883:23;879:32;876:52;;;924:1;921;914:12;876:52;964:9;951:23;997:18;989:6;986:30;983:50;;;1029:1;1026;1019:12;983:50;1052:22;;1105:4;1097:13;;1093:27;-1:-1:-1;1083:55:1;;1134:1;1131;1124:12;1083:55;1170:2;1157:16;1193:60;1209:43;1249:2;1209:43;:::i;:::-;1193:60;:::i;:::-;1287:15;;;1369:1;1365:10;;;;1357:19;;1353:28;;;1318:12;;;;1393:19;;;1390:39;;;1425:1;1422;1415:12;1390:39;1449:11;;;;1469:217;1485:6;1480:3;1477:15;1469:217;;;1565:3;1552:17;1582:31;1607:5;1582:31;:::i;:::-;1626:18;;1502:12;;;;1664;;;;1469:217;;;1705:5;750:966;-1:-1:-1;;;;;;;750:966:1:o;1721:131::-;-1:-1:-1;;;;;;1795:32:1;;1785:43;;1775:71;;1842:1;1839;1832:12;1857:245;1915:6;1968:2;1956:9;1947:7;1943:23;1939:32;1936:52;;;1984:1;1981;1974:12;1936:52;2023:9;2010:23;2042:30;2066:5;2042:30;:::i;2481:258::-;2553:1;2563:113;2577:6;2574:1;2571:13;2563:113;;;2653:11;;;2647:18;2634:11;;;2627:39;2599:2;2592:10;2563:113;;;2694:6;2691:1;2688:13;2685:48;;;-1:-1:-1;;2729:1:1;2711:16;;2704:27;2481:258::o;2744:::-;2786:3;2824:5;2818:12;2851:6;2846:3;2839:19;2867:63;2923:6;2916:4;2911:3;2907:14;2900:4;2893:5;2889:16;2867:63;:::i;:::-;2984:2;2963:15;-1:-1:-1;;2959:29:1;2950:39;;;;2991:4;2946:50;;2744:258;-1:-1:-1;;2744:258:1:o;3007:220::-;3156:2;3145:9;3138:21;3119:4;3176:45;3217:2;3206:9;3202:18;3194:6;3176:45;:::i;3232:180::-;3291:6;3344:2;3332:9;3323:7;3319:23;3315:32;3312:52;;;3360:1;3357;3350:12;3312:52;-1:-1:-1;3383:23:1;;3232:180;-1:-1:-1;3232:180:1:o;3625:315::-;3693:6;3701;3754:2;3742:9;3733:7;3729:23;3725:32;3722:52;;;3770:1;3767;3760:12;3722:52;3809:9;3796:23;3828:31;3853:5;3828:31;:::i;:::-;3878:5;3930:2;3915:18;;;;3902:32;;-1:-1:-1;;;3625:315:1:o;3945:456::-;4022:6;4030;4038;4091:2;4079:9;4070:7;4066:23;4062:32;4059:52;;;4107:1;4104;4097:12;4059:52;4146:9;4133:23;4165:31;4190:5;4165:31;:::i;:::-;4215:5;-1:-1:-1;4272:2:1;4257:18;;4244:32;4285:33;4244:32;4285:33;:::i;:::-;3945:456;;4337:7;;-1:-1:-1;;;4391:2:1;4376:18;;;;4363:32;;3945:456::o;4406:118::-;4492:5;4485:13;4478:21;4471:5;4468:32;4458:60;;4514:1;4511;4504:12;4529:382;4594:6;4602;4655:2;4643:9;4634:7;4630:23;4626:32;4623:52;;;4671:1;4668;4661:12;4623:52;4710:9;4697:23;4729:31;4754:5;4729:31;:::i;:::-;4779:5;-1:-1:-1;4836:2:1;4821:18;;4808:32;4849:30;4808:32;4849:30;:::i;:::-;4898:7;4888:17;;;4529:382;;;;;:::o;4916:388::-;4984:6;4992;5045:2;5033:9;5024:7;5020:23;5016:32;5013:52;;;5061:1;5058;5051:12;5013:52;5100:9;5087:23;5119:31;5144:5;5119:31;:::i;:::-;5169:5;-1:-1:-1;5226:2:1;5211:18;;5198:32;5239:33;5198:32;5239:33;:::i;5309:632::-;5480:2;5532:21;;;5602:13;;5505:18;;;5624:22;;;5451:4;;5480:2;5703:15;;;;5677:2;5662:18;;;5451:4;5746:169;5760:6;5757:1;5754:13;5746:169;;;5821:13;;5809:26;;5890:15;;;;5855:12;;;;5782:1;5775:9;5746:169;;;-1:-1:-1;5932:3:1;;5309:632;-1:-1:-1;;;;;;5309:632:1:o;5946:407::-;6011:5;6045:18;6037:6;6034:30;6031:56;;;6067:18;;:::i;:::-;6105:57;6150:2;6129:15;;-1:-1:-1;;6125:29:1;6156:4;6121:40;6105:57;:::i;:::-;6096:66;;6185:6;6178:5;6171:21;6225:3;6216:6;6211:3;6207:16;6204:25;6201:45;;;6242:1;6239;6232:12;6201:45;6291:6;6286:3;6279:4;6272:5;6268:16;6255:43;6345:1;6338:4;6329:6;6322:5;6318:18;6314:29;6307:40;5946:407;;;;;:::o;6358:451::-;6427:6;6480:2;6468:9;6459:7;6455:23;6451:32;6448:52;;;6496:1;6493;6486:12;6448:52;6536:9;6523:23;6569:18;6561:6;6558:30;6555:50;;;6601:1;6598;6591:12;6555:50;6624:22;;6677:4;6669:13;;6665:27;-1:-1:-1;6655:55:1;;6706:1;6703;6696:12;6655:55;6729:74;6795:7;6790:2;6777:16;6772:2;6768;6764:11;6729:74;:::i;6814:808::-;7039:2;7091:21;;;7161:13;;7064:18;;;7183:22;;;7010:4;;7039:2;7224;;7242:18;;;;7283:15;;;7010:4;7326:270;7340:6;7337:1;7334:13;7326:270;;;7399:13;;7437:9;;7425:22;;7501:11;;7495:18;7488:26;7481:34;7467:12;;;7460:56;7536:12;;;;7571:15;;;;7362:1;7355:9;7326:270;;;-1:-1:-1;7613:3:1;;6814:808;-1:-1:-1;;;;;;;6814:808:1:o;7627:891::-;7711:6;7742:2;7785;7773:9;7764:7;7760:23;7756:32;7753:52;;;7801:1;7798;7791:12;7753:52;7841:9;7828:23;7874:18;7866:6;7863:30;7860:50;;;7906:1;7903;7896:12;7860:50;7929:22;;7982:4;7974:13;;7970:27;-1:-1:-1;7960:55:1;;8011:1;8008;8001:12;7960:55;8047:2;8034:16;8070:60;8086:43;8126:2;8086:43;:::i;8070:60::-;8164:15;;;8246:1;8242:10;;;;8234:19;;8230:28;;;8195:12;;;;8270:19;;;8267:39;;;8302:1;8299;8292:12;8267:39;8326:11;;;;8346:142;8362:6;8357:3;8354:15;8346:142;;;8428:17;;8416:30;;8379:12;;;;8466;;;;8346:142;;8523:247;8582:6;8635:2;8623:9;8614:7;8610:23;8606:32;8603:52;;;8651:1;8648;8641:12;8603:52;8690:9;8677:23;8709:31;8734:5;8709:31;:::i;8775:750::-;8867:6;8875;8883;8936:2;8924:9;8915:7;8911:23;8907:32;8904:52;;;8952:1;8949;8942:12;8904:52;8992:9;8979:23;9021:18;9062:2;9054:6;9051:14;9048:34;;;9078:1;9075;9068:12;9048:34;9116:6;9105:9;9101:22;9091:32;;9161:7;9154:4;9150:2;9146:13;9142:27;9132:55;;9183:1;9180;9173:12;9132:55;9223:2;9210:16;9249:2;9241:6;9238:14;9235:34;;;9265:1;9262;9255:12;9235:34;9320:7;9313:4;9303:6;9300:1;9296:14;9292:2;9288:23;9284:34;9281:47;9278:67;;;9341:1;9338;9331:12;9278:67;9372:4;9364:13;;;;-1:-1:-1;9396:6:1;-1:-1:-1;;9437:20:1;;9424:34;9467:28;9424:34;9467:28;:::i;:::-;9514:5;9504:15;;;8775:750;;;;;:::o;9530:795::-;9625:6;9633;9641;9649;9702:3;9690:9;9681:7;9677:23;9673:33;9670:53;;;9719:1;9716;9709:12;9670:53;9758:9;9745:23;9777:31;9802:5;9777:31;:::i;:::-;9827:5;-1:-1:-1;9884:2:1;9869:18;;9856:32;9897:33;9856:32;9897:33;:::i;:::-;9949:7;-1:-1:-1;10003:2:1;9988:18;;9975:32;;-1:-1:-1;10058:2:1;10043:18;;10030:32;10085:18;10074:30;;10071:50;;;10117:1;10114;10107:12;10071:50;10140:22;;10193:4;10185:13;;10181:27;-1:-1:-1;10171:55:1;;10222:1;10219;10212:12;10171:55;10245:74;10311:7;10306:2;10293:16;10288:2;10284;10280:11;10245:74;:::i;:::-;10235:84;;;9530:795;;;;;;;:::o;10330:315::-;10398:6;10406;10459:2;10447:9;10438:7;10434:23;10430:32;10427:52;;;10475:1;10472;10465:12;10427:52;10511:9;10498:23;10488:33;;10571:2;10560:9;10556:18;10543:32;10584:31;10609:5;10584:31;:::i;11061:127::-;11122:10;11117:3;11113:20;11110:1;11103:31;11153:4;11150:1;11143:15;11177:4;11174:1;11167:15;11193:128;11233:3;11264:1;11260:6;11257:1;11254:13;11251:39;;;11270:18;;:::i;:::-;-1:-1:-1;11306:9:1;;11193:128::o;11686:127::-;11747:10;11742:3;11738:20;11735:1;11728:31;11778:4;11775:1;11768:15;11802:4;11799:1;11792:15;11818:135;11857:3;11878:17;;;11875:43;;11898:18;;:::i;:::-;-1:-1:-1;11945:1:1;11934:13;;11818:135::o;11958:380::-;12037:1;12033:12;;;;12080;;;12101:61;;12155:4;12147:6;12143:17;12133:27;;12101:61;12208:2;12200:6;12197:14;12177:18;12174:38;12171:161;;12254:10;12249:3;12245:20;12242:1;12235:31;12289:4;12286:1;12279:15;12317:4;12314:1;12307:15;12171:161;;11958:380;;;:::o;13175:409::-;13377:2;13359:21;;;13416:2;13396:18;;;13389:30;13455:34;13450:2;13435:18;;13428:62;-1:-1:-1;;;13521:2:1;13506:18;;13499:43;13574:3;13559:19;;13175:409::o;14419:184::-;14489:6;14542:2;14530:9;14521:7;14517:23;14513:32;14510:52;;;14558:1;14555;14548:12;14510:52;-1:-1:-1;14581:16:1;;14419:184;-1:-1:-1;14419:184:1:o;16848:251::-;16918:6;16971:2;16959:9;16950:7;16946:23;16942:32;16939:52;;;16987:1;16984;16977:12;16939:52;17019:9;17013:16;17038:31;17063:5;17038:31;:::i;18287:408::-;18489:2;18471:21;;;18528:2;18508:18;;;18501:30;18567:34;18562:2;18547:18;;18540:62;-1:-1:-1;;;18633:2:1;18618:18;;18611:42;18685:3;18670:19;;18287:408::o;18700:405::-;18902:2;18884:21;;;18941:2;18921:18;;;18914:30;18980:34;18975:2;18960:18;;18953:62;-1:-1:-1;;;19046:2:1;19031:18;;19024:39;19095:3;19080:19;;18700:405::o;19943:168::-;19983:7;20049:1;20045;20041:6;20037:14;20034:1;20031:21;20026:1;20019:9;20012:17;20008:45;20005:71;;;20056:18;;:::i;:::-;-1:-1:-1;20096:9:1;;19943:168::o;20540:409::-;20742:2;20724:21;;;20781:2;20761:18;;;20754:30;20820:34;20815:2;20800:18;;20793:62;-1:-1:-1;;;20886:2:1;20871:18;;20864:43;20939:3;20924:19;;20540:409::o;21434:245::-;21501:6;21554:2;21542:9;21533:7;21529:23;21525:32;21522:52;;;21570:1;21567;21560:12;21522:52;21602:9;21596:16;21621:28;21643:5;21621:28;:::i;21684:350::-;21886:2;21868:21;;;21925:2;21905:18;;;21898:30;21964:28;21959:2;21944:18;;21937:56;22025:2;22010:18;;21684:350::o;22039:415::-;22241:2;22223:21;;;22280:2;22260:18;;;22253:30;22319:34;22314:2;22299:18;;22292:62;-1:-1:-1;;;22385:2:1;22370:18;;22363:49;22444:3;22429:19;;22039:415::o;22874:470::-;23053:3;23091:6;23085:13;23107:53;23153:6;23148:3;23141:4;23133:6;23129:17;23107:53;:::i;:::-;23223:13;;23182:16;;;;23245:57;23223:13;23182:16;23279:4;23267:17;;23245:57;:::i;:::-;23318:20;;22874:470;-1:-1:-1;;;;22874:470:1:o;23349:421::-;23551:2;23533:21;;;23590:2;23570:18;;;23563:30;23629:34;23624:2;23609:18;;23602:62;23700:27;23695:2;23680:18;;23673:55;23760:3;23745:19;;23349:421::o;23775:425::-;23977:2;23959:21;;;24016:2;23996:18;;;23989:30;24055:34;24050:2;24035:18;;24028:62;24126:31;24121:2;24106:18;;24099:59;24190:3;24175:19;;23775:425::o;24514:415::-;24716:2;24698:21;;;24755:2;24735:18;;;24728:30;24794:34;24789:2;24774:18;;24767:62;-1:-1:-1;;;24860:2:1;24845:18;;24838:49;24919:3;24904:19;;24514:415::o;27217:401::-;27419:2;27401:21;;;27458:2;27438:18;;;27431:30;27497:34;27492:2;27477:18;;27470:62;-1:-1:-1;;;27563:2:1;27548:18;;27541:35;27608:3;27593:19;;27217:401::o;28727:414::-;28929:2;28911:21;;;28968:2;28948:18;;;28941:30;29007:34;29002:2;28987:18;;28980:62;-1:-1:-1;;;29073:2:1;29058:18;;29051:48;29131:3;29116:19;;28727:414::o;30049:489::-;-1:-1:-1;;;;;30318:15:1;;;30300:34;;30370:15;;30365:2;30350:18;;30343:43;30417:2;30402:18;;30395:34;;;30465:3;30460:2;30445:18;;30438:31;;;30243:4;;30486:46;;30512:19;;30504:6;30486:46;:::i;:::-;30478:54;30049:489;-1:-1:-1;;;;;;30049:489:1:o;30543:249::-;30612:6;30665:2;30653:9;30644:7;30640:23;30636:32;30633:52;;;30681:1;30678;30671:12;30633:52;30713:9;30707:16;30732:30;30756:5;30732:30;:::i;30797:125::-;30837:4;30865:1;30862;30859:8;30856:34;;;30870:18;;:::i;:::-;-1:-1:-1;30907:9:1;;30797:125::o;30927:127::-;30988:10;30983:3;30979:20;30976:1;30969:31;31019:4;31016:1;31009:15;31043:4;31040:1;31033:15
Swarm Source
ipfs://034c3e55a58542263216e23d642ba303df53d58d7f2f86c310038914cccfb7d6