Overview
ETH Balance
0.005 ETH
Eth Value
$16.28 (@ $3,256.71/ETH)More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 52 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Public Mint | 17302512 | 435 days ago | IN | 0 ETH | 0.00167614 | ||||
Public Mint | 17235314 | 444 days ago | IN | 0.005 ETH | 0.01193331 | ||||
Set Public Mint | 17212114 | 447 days ago | IN | 0 ETH | 0.00335722 | ||||
Claim By Ids | 17211404 | 447 days ago | IN | 0 ETH | 0.04842663 | ||||
Claim By Ids | 17178898 | 452 days ago | IN | 0 ETH | 0.06553174 | ||||
Claim By Ids | 17157899 | 455 days ago | IN | 0 ETH | 0.0186375 | ||||
Claim By Ids | 17156733 | 455 days ago | IN | 0 ETH | 0.00368898 | ||||
Claim By Ids | 17148940 | 456 days ago | IN | 0 ETH | 0.01104204 | ||||
Claim By Ids | 17145662 | 457 days ago | IN | 0 ETH | 0.00266085 | ||||
Claim By Ids | 17145661 | 457 days ago | IN | 0 ETH | 0.00772537 | ||||
Claim By Ids | 17145647 | 457 days ago | IN | 0 ETH | 0.00713043 | ||||
Claim By Ids | 17145517 | 457 days ago | IN | 0 ETH | 0.00736085 | ||||
Claim By Ids | 17143257 | 457 days ago | IN | 0 ETH | 0.00621199 | ||||
Claim By Ids | 17143231 | 457 days ago | IN | 0 ETH | 0.01163548 | ||||
Claim By Ids | 17142882 | 457 days ago | IN | 0 ETH | 0.00756732 | ||||
Claim By Ids | 17142879 | 457 days ago | IN | 0 ETH | 0.00722465 | ||||
Claim By Ids | 17142862 | 457 days ago | IN | 0 ETH | 0.01214064 | ||||
Claim By Ids | 17142856 | 457 days ago | IN | 0 ETH | 0.00894332 | ||||
Claim By Ids | 17141391 | 457 days ago | IN | 0 ETH | 0.04188785 | ||||
Claim By Ids | 17140865 | 457 days ago | IN | 0 ETH | 0.0074221 | ||||
Claim By Ids | 17138959 | 458 days ago | IN | 0 ETH | 0.02553036 | ||||
Claim By Ids | 17122863 | 460 days ago | IN | 0 ETH | 0.01493548 | ||||
Claim By Ids | 17121104 | 460 days ago | IN | 0 ETH | 0.00977138 | ||||
Set Approval For... | 17120396 | 460 days ago | IN | 0 ETH | 0.00150604 | ||||
Claim By Ids | 17120228 | 460 days ago | IN | 0 ETH | 0.04310679 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
TheRebirthClubFb
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-04-21 */ // SPDX-License-Identifier: MIT // 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/security/ReentrancyGuard.sol // OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/utils/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/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @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/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: contracts/FullBody.sol pragma solidity ^0.8.7; error NotOwnerOfToken(); contract TheRebirthClubFb is ERC721Enumerable, Ownable, ReentrancyGuard { uint256 public constant MAX_SUPPLY = 5000; uint256 public MINT_PRICE = 0.005 ether; uint256 public UTIL_PRICE = 1000 ether; uint256 public UTIL_PUBLIC_PRICE = 1500 ether; string private baseURI; uint256 public startTokenIdMinted = 1; bool public isPublicMintOpen; address public utilAddress; address public collectionAddress; address deadAddress = 0x000000000000000000000000000000000000dEaD; event claimedTokens(uint256[] claimed); constructor(address _collectionAddress, address _util, string memory _baseuri) ERC721("TRC: Full Body", "TRCFB") { collectionAddress = _collectionAddress; utilAddress = _util; setBaseURI(_baseuri); isPublicMintOpen = false; } function safeMint(address to, uint256[] memory tokenIds) internal { require(tokenIds.length > 0, "need more"); for (uint256 index = 0; index < tokenIds.length; index++) { _safeMint(to, tokenIds[index]); } } function publicMint(uint256 amount, bool paymentType) public payable nonReentrant { uint256 newSupply = totalSupply() + amount; require(isPublicMintOpen, "not open"); require(amount > 0, "cannot be zero."); require(amount <= 10, "cannot mint more"); require(newSupply < MAX_SUPPLY, "max supply"); uint256[] memory tokens = new uint256[](amount); for (uint256 index = 0; index < amount; index++) { for (uint256 i = startTokenIdMinted; i < MAX_SUPPLY; i++) { if (!_exists(i)) { tokens[index] = i; startTokenIdMinted = i + 1; break; } } } payment(amount, paymentType); safeMint(msg.sender, tokens); } function payment(uint256 amount, bool paymentType) internal { if (paymentType) { require(msg.value >= (amount * MINT_PRICE), "insuf balance."); } else { IERC20(utilAddress).transferFrom(msg.sender, deadAddress, amount * UTIL_PUBLIC_PRICE); } } function claimByIds(uint256[] calldata ids) external { require(!isPublicMintOpen, "you cannot claim anymore"); uint256 length = ids.length; for (uint256 i; i < length; i++) { uint256 currentId = ids[i]; if(IERC721Enumerable(collectionAddress).ownerOf(currentId) != msg.sender) revert NotOwnerOfToken(); } emit claimedTokens(ids); IERC20(utilAddress).transferFrom(msg.sender, deadAddress, length * UTIL_PRICE); safeMint(msg.sender, ids); } function _baseURI() internal view virtual override returns (string memory) { return baseURI; } function setBaseURI(string memory _newBaseURI) public onlyOwner { baseURI = _newBaseURI; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token."); tokenId = 5000 + tokenId; string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, Strings.toString(tokenId))) : ""; } function setPublicMint(bool _bool) external onlyOwner { isPublicMintOpen = _bool; } function setPrices(uint256 mintPrice, uint256 utilPrice, uint256 utilPublicPrice) public onlyOwner { MINT_PRICE = mintPrice; UTIL_PRICE = utilPrice; UTIL_PUBLIC_PRICE = utilPublicPrice; } function setAddress(address _collection, address _util) public onlyOwner { collectionAddress = _collection; utilAddress = _util; } function withdraw() external onlyOwner nonReentrant { payable(msg.sender).transfer(address(this).balance); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_collectionAddress","type":"address"},{"internalType":"address","name":"_util","type":"address"},{"internalType":"string","name":"_baseuri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"NotOwnerOfToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[]","name":"claimed","type":"uint256[]"}],"name":"claimedTokens","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UTIL_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UTIL_PUBLIC_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"claimByIds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"collectionAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicMintOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"paymentType","type":"bool"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_collection","type":"address"},{"internalType":"address","name":"_util","type":"address"}],"name":"setAddress","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":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintPrice","type":"uint256"},{"internalType":"uint256","name":"utilPrice","type":"uint256"},{"internalType":"uint256","name":"utilPublicPrice","type":"uint256"}],"name":"setPrices","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_bool","type":"bool"}],"name":"setPublicMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTokenIdMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"utilAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526611c37937e08000600c55683635c9adc5dea00000600d55685150ae84a8cdf00000600e55600160105561dead601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200007e57600080fd5b50604051620050ab380380620050ab8339818101604052810190620000a491906200051d565b6040518060400160405280600e81526020017f5452433a2046756c6c20426f64790000000000000000000000000000000000008152506040518060400160405280600581526020017f5452434642000000000000000000000000000000000000000000000000000000815250816000908051906020019062000128929190620003d8565b50806001908051906020019062000141929190620003d8565b50505062000164620001586200022360201b60201c565b6200022b60201b60201c565b6001600b8190555082601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081601160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620001ff81620002f160201b60201c565b6000601160006101000a81548160ff021916908315150217905550505050620007ed565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620003016200031d60201b60201c565b80600f908051906020019062000319929190620003d8565b5050565b6200032d6200022360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000353620003ae60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620003ac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003a390620005bf565b60405180910390fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620003e690620006bb565b90600052602060002090601f0160209004810192826200040a576000855562000456565b82601f106200042557805160ff191683800117855562000456565b8280016001018555821562000456579182015b828111156200045557825182559160200191906001019062000438565b5b50905062000465919062000469565b5090565b5b80821115620004845760008160009055506001016200046a565b5090565b60006200049f62000499846200060a565b620005e1565b905082815260208101848484011115620004be57620004bd6200078a565b5b620004cb84828562000685565b509392505050565b600081519050620004e481620007d3565b92915050565b600082601f83011262000502576200050162000785565b5b81516200051484826020860162000488565b91505092915050565b60008060006060848603121562000539576200053862000794565b5b60006200054986828701620004d3565b93505060206200055c86828701620004d3565b925050604084015167ffffffffffffffff81111562000580576200057f6200078f565b5b6200058e86828701620004ea565b9150509250925092565b6000620005a760208362000640565b9150620005b482620007aa565b602082019050919050565b60006020820190508181036000830152620005da8162000598565b9050919050565b6000620005ed62000600565b9050620005fb8282620006f1565b919050565b6000604051905090565b600067ffffffffffffffff82111562000628576200062762000756565b5b620006338262000799565b9050602081019050919050565b600082825260208201905092915050565b60006200065e8262000665565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60005b83811015620006a557808201518184015260208101905062000688565b83811115620006b5576000848401525b50505050565b60006002820490506001821680620006d457607f821691505b60208210811415620006eb57620006ea62000727565b5b50919050565b620006fc8262000799565b810181811067ffffffffffffffff821117156200071e576200071d62000756565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b620007de8162000651565b8114620007ea57600080fd5b50565b6148ae80620007fd6000396000f3fe6080604052600436106101f95760003560e01c80636352211e1161010d578063a243d3b6116100a0578063c002d23d1161006f578063c002d23d146106fe578063c87b56dd14610729578063e985e9c514610766578063f2fde38b146107a3578063fae9806a146107cc576101f9565b8063a243d3b614610665578063a4435dfd14610681578063a88fe42d146106ac578063b88d4fde146106d5576101f9565b80638da5cb5b116100dc5780638da5cb5b146105bb57806395d89b41146105e65780639604ad4614610611578063a22cb4651461063c576101f9565b80636352211e146104ff5780636aa003711461053c57806370a0823114610567578063715018a6146105a4576101f9565b80632f745c59116101905780633b67cf1a1161015f5780633b67cf1a146104305780633ccfd60b1461045957806342842e0e146104705780634f6ccce71461049957806355f804b3146104d6576101f9565b80632f745c591461037457806332682559146103b157806332cb6b0c146103dc5780633b58524d14610407576101f9565b80630e2d56cf116101cc5780630e2d56cf146102cc57806318160ddd146102f55780631ec93f911461032057806323b872dd1461034b576101f9565b806301ffc9a7146101fe57806306fdde031461023b578063081812fc14610266578063095ea7b3146102a3575b600080fd5b34801561020a57600080fd5b506102256004803603810190610220919061338c565b6107f7565b6040516102329190613a6c565b60405180910390f35b34801561024757600080fd5b50610250610871565b60405161025d9190613a87565b60405180910390f35b34801561027257600080fd5b5061028d6004803603810190610288919061342f565b610903565b60405161029a91906139aa565b60405180910390f35b3480156102af57600080fd5b506102ca60048036038101906102c591906132a5565b610949565b005b3480156102d857600080fd5b506102f360048036038101906102ee9190613332565b610a61565b005b34801561030157600080fd5b5061030a610a86565b6040516103179190613dc9565b60405180910390f35b34801561032c57600080fd5b50610335610a93565b6040516103429190613dc9565b60405180910390f35b34801561035757600080fd5b50610372600480360381019061036d919061318f565b610a99565b005b34801561038057600080fd5b5061039b600480360381019061039691906132a5565b610af9565b6040516103a89190613dc9565b60405180910390f35b3480156103bd57600080fd5b506103c6610b9e565b6040516103d39190613dc9565b60405180910390f35b3480156103e857600080fd5b506103f1610ba4565b6040516103fe9190613dc9565b60405180910390f35b34801561041357600080fd5b5061042e6004803603810190610429919061314f565b610baa565b005b34801561043c57600080fd5b50610457600480360381019061045291906132e5565b610c38565b005b34801561046557600080fd5b5061046e610f47565b005b34801561047c57600080fd5b506104976004803603810190610492919061318f565b610fa8565b005b3480156104a557600080fd5b506104c060048036038101906104bb919061342f565b610fc8565b6040516104cd9190613dc9565b60405180910390f35b3480156104e257600080fd5b506104fd60048036038101906104f891906133e6565b611039565b005b34801561050b57600080fd5b506105266004803603810190610521919061342f565b61105b565b60405161053391906139aa565b60405180910390f35b34801561054857600080fd5b506105516110e2565b60405161055e91906139aa565b60405180910390f35b34801561057357600080fd5b5061058e600480360381019061058991906130f5565b611108565b60405161059b9190613dc9565b60405180910390f35b3480156105b057600080fd5b506105b96111c0565b005b3480156105c757600080fd5b506105d06111d4565b6040516105dd91906139aa565b60405180910390f35b3480156105f257600080fd5b506105fb6111fe565b6040516106089190613a87565b60405180910390f35b34801561061d57600080fd5b50610626611290565b60405161063391906139aa565b60405180910390f35b34801561064857600080fd5b50610663600480360381019061065e9190613265565b6112b6565b005b61067f600480360381019061067a919061345c565b6112cc565b005b34801561068d57600080fd5b506106966114fe565b6040516106a39190613a6c565b60405180910390f35b3480156106b857600080fd5b506106d360048036038101906106ce919061349c565b611511565b005b3480156106e157600080fd5b506106fc60048036038101906106f791906131e2565b611533565b005b34801561070a57600080fd5b50610713611595565b6040516107209190613dc9565b60405180910390f35b34801561073557600080fd5b50610750600480360381019061074b919061342f565b61159b565b60405161075d9190613a87565b60405180910390f35b34801561077257600080fd5b5061078d6004803603810190610788919061314f565b611652565b60405161079a9190613a6c565b60405180910390f35b3480156107af57600080fd5b506107ca60048036038101906107c591906130f5565b6116e6565b005b3480156107d857600080fd5b506107e161176a565b6040516107ee9190613dc9565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061086a575061086982611770565b5b9050919050565b60606000805461088090614059565b80601f01602080910402602001604051908101604052809291908181526020018280546108ac90614059565b80156108f95780601f106108ce576101008083540402835291602001916108f9565b820191906000526020600020905b8154815290600101906020018083116108dc57829003601f168201915b5050505050905090565b600061090e82611852565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109548261105b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109bc90613ce9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109e461189d565b73ffffffffffffffffffffffffffffffffffffffff161480610a135750610a1281610a0d61189d565b611652565b5b610a52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4990613d29565b60405180910390fd5b610a5c83836118a5565b505050565b610a6961195e565b80601160006101000a81548160ff02191690831515021790555050565b6000600880549050905090565b600e5481565b610aaa610aa461189d565b826119dc565b610ae9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae090613aa9565b60405180910390fd5b610af4838383611a71565b505050565b6000610b0483611108565b8210610b45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3c90613ac9565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600d5481565b61138881565b610bb261195e565b81601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b601160009054906101000a900460ff1615610c88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7f90613c09565b60405180910390fd5b600082829050905060005b81811015610ddc576000848483818110610cb057610caf6141c1565b5b9050602002013590503373ffffffffffffffffffffffffffffffffffffffff16601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401610d2b9190613dc9565b60206040518083038186803b158015610d4357600080fd5b505afa158015610d57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d7b9190613122565b73ffffffffffffffffffffffffffffffffffffffff1614610dc8576040517f4c084f1400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b508080610dd4906140bc565b915050610c93565b507fed38d8732856e4b58bfd8edce96464b7f141ccf88afd262c682aea5ec205aebe8383604051610e0e929190613a48565b60405180910390a1601160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600d5485610e869190613f15565b6040518463ffffffff1660e01b8152600401610ea4939291906139c5565b602060405180830381600087803b158015610ebe57600080fd5b505af1158015610ed2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ef6919061335f565b50610f4233848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050611d6b565b505050565b610f4f61195e565b610f57611df7565b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610f9d573d6000803e3d6000fd5b50610fa6611e47565b565b610fc383838360405180602001604052806000815250611533565b505050565b6000610fd2610a86565b8210611013576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100a90613d49565b60405180910390fd5b60088281548110611027576110266141c1565b5b90600052602060002001549050919050565b61104161195e565b80600f9080519060200190611057929190612e89565b5050565b60008061106783611e51565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d090613cc9565b60405180910390fd5b80915050919050565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611179576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117090613c29565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6111c861195e565b6111d26000611e8e565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461120d90614059565b80601f016020809104026020016040519081016040528092919081815260200182805461123990614059565b80156112865780601f1061125b57610100808354040283529160200191611286565b820191906000526020600020905b81548152906001019060200180831161126957829003601f168201915b5050505050905090565b601160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6112c86112c161189d565b8383611f54565b5050565b6112d4611df7565b6000826112df610a86565b6112e99190613ebf565b9050601160009054906101000a900460ff1661133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133190613be9565b60405180910390fd5b6000831161137d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137490613ca9565b60405180910390fd5b600a8311156113c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b890613c89565b60405180910390fd5b6113888110611405576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fc90613b89565b60405180910390fd5b60008367ffffffffffffffff811115611421576114206141f0565b5b60405190808252806020026020018201604052801561144f5781602001602082028036833780820191505090505b50905060005b848110156114db57600060105490505b6113888110156114c757611478816120c1565b6114b457808383815181106114905761148f6141c1565b5b6020026020010181815250506001816114a99190613ebf565b6010819055506114c7565b80806114bf906140bc565b915050611465565b5080806114d3906140bc565b915050611455565b506114e68484612102565b6114f03382611d6b565b50506114fa611e47565b5050565b601160009054906101000a900460ff1681565b61151961195e565b82600c8190555081600d8190555080600e81905550505050565b61154461153e61189d565b836119dc565b611583576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157a90613aa9565b60405180910390fd5b61158f84848484612243565b50505050565b600c5481565b60606115a6826120c1565b6115e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115dc90613da9565b60405180910390fd5b816113886115f39190613ebf565b915060006115ff61229f565b9050600081511161161f576040518060200160405280600081525061164a565b8061162984612331565b60405160200161163a929190613986565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6116ee61195e565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561175e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175590613b09565b60405180910390fd5b61176781611e8e565b50565b60105481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061183b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061184b575061184a82612409565b5b9050919050565b61185b816120c1565b61189a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189190613cc9565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166119188361105b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61196661189d565b73ffffffffffffffffffffffffffffffffffffffff166119846111d4565b73ffffffffffffffffffffffffffffffffffffffff16146119da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d190613c69565b60405180910390fd5b565b6000806119e88361105b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611a2a5750611a298185611652565b5b80611a6857508373ffffffffffffffffffffffffffffffffffffffff16611a5084610903565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611a918261105b565b73ffffffffffffffffffffffffffffffffffffffff1614611ae7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ade90613b29565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4e90613ba9565b60405180910390fd5b611b648383836001612473565b8273ffffffffffffffffffffffffffffffffffffffff16611b848261105b565b73ffffffffffffffffffffffffffffffffffffffff1614611bda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd190613b29565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611d6683838360016125d3565b505050565b6000815111611daf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da690613b69565b60405180910390fd5b60005b8151811015611df257611ddf83838381518110611dd257611dd16141c1565b5b60200260200101516125d9565b8080611dea906140bc565b915050611db2565b505050565b6002600b541415611e3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3490613d89565b60405180910390fd5b6002600b81905550565b6001600b81905550565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611fc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fba90613bc9565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516120b49190613a6c565b60405180910390a3505050565b60008073ffffffffffffffffffffffffffffffffffffffff166120e383611e51565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b801561215d57600c54826121169190613f15565b341015612158576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214f90613d09565b60405180910390fd5b61223f565b601160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600e54866121cd9190613f15565b6040518463ffffffff1660e01b81526004016121eb939291906139c5565b602060405180830381600087803b15801561220557600080fd5b505af1158015612219573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061223d919061335f565b505b5050565b61224e848484611a71565b61225a848484846125f7565b612299576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229090613ae9565b60405180910390fd5b50505050565b6060600f80546122ae90614059565b80601f01602080910402602001604051908101604052809291908181526020018280546122da90614059565b80156123275780601f106122fc57610100808354040283529160200191612327565b820191906000526020600020905b81548152906001019060200180831161230a57829003601f168201915b5050505050905090565b6060600060016123408461278e565b01905060008167ffffffffffffffff81111561235f5761235e6141f0565b5b6040519080825280601f01601f1916602001820160405280156123915781602001600182028036833780820191505090505b509050600082602001820190505b6001156123fe578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816123e8576123e7614134565b5b04945060008514156123f9576123fe565b61239f565b819350505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61247f848484846128e1565b60018111156124c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ba90613d69565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561250b57612506816128e7565b61254a565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614612549576125488582612930565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561258d5761258881612a9d565b6125cc565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146125cb576125ca8482612b6e565b5b5b5050505050565b50505050565b6125f3828260405180602001604052806000815250612bed565b5050565b60006126188473ffffffffffffffffffffffffffffffffffffffff16612c48565b15612781578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261264161189d565b8786866040518563ffffffff1660e01b815260040161266394939291906139fc565b602060405180830381600087803b15801561267d57600080fd5b505af19250505080156126ae57506040513d601f19601f820116820180604052508101906126ab91906133b9565b60015b612731573d80600081146126de576040519150601f19603f3d011682016040523d82523d6000602084013e6126e3565b606091505b50600081511415612729576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272090613ae9565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612786565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106127ec577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816127e2576127e1614134565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612829576d04ee2d6d415b85acef8100000000838161281f5761281e614134565b5b0492506020810190505b662386f26fc10000831061285857662386f26fc10000838161284e5761284d614134565b5b0492506010810190505b6305f5e1008310612881576305f5e100838161287757612876614134565b5b0492506008810190505b61271083106128a657612710838161289c5761289b614134565b5b0492506004810190505b606483106128c957606483816128bf576128be614134565b5b0492506002810190505b600a83106128d8576001810190505b80915050919050565b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161293d84611108565b6129479190613f6f565b9050600060076000848152602001908152602001600020549050818114612a2c576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612ab19190613f6f565b9050600060096000848152602001908152602001600020549050600060088381548110612ae157612ae06141c1565b5b906000526020600020015490508060088381548110612b0357612b026141c1565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612b5257612b51614192565b5b6001900381819060005260206000200160009055905550505050565b6000612b7983611108565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b612bf78383612c6b565b612c0460008484846125f7565b612c43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3a90613ae9565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612cdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cd290613c49565b60405180910390fd5b612ce4816120c1565b15612d24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d1b90613b49565b60405180910390fd5b612d32600083836001612473565b612d3b816120c1565b15612d7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7290613b49565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612e856000838360016125d3565b5050565b828054612e9590614059565b90600052602060002090601f016020900481019282612eb75760008555612efe565b82601f10612ed057805160ff1916838001178555612efe565b82800160010185558215612efe579182015b82811115612efd578251825591602001919060010190612ee2565b5b509050612f0b9190612f0f565b5090565b5b80821115612f28576000816000905550600101612f10565b5090565b6000612f3f612f3a84613e09565b613de4565b905082815260208101848484011115612f5b57612f5a61422e565b5b612f66848285614017565b509392505050565b6000612f81612f7c84613e3a565b613de4565b905082815260208101848484011115612f9d57612f9c61422e565b5b612fa8848285614017565b509392505050565b600081359050612fbf8161481c565b92915050565b600081519050612fd48161481c565b92915050565b60008083601f840112612ff057612fef614224565b5b8235905067ffffffffffffffff81111561300d5761300c61421f565b5b60208301915083602082028301111561302957613028614229565b5b9250929050565b60008135905061303f81614833565b92915050565b60008151905061305481614833565b92915050565b6000813590506130698161484a565b92915050565b60008151905061307e8161484a565b92915050565b600082601f83011261309957613098614224565b5b81356130a9848260208601612f2c565b91505092915050565b600082601f8301126130c7576130c6614224565b5b81356130d7848260208601612f6e565b91505092915050565b6000813590506130ef81614861565b92915050565b60006020828403121561310b5761310a61423d565b5b600061311984828501612fb0565b91505092915050565b6000602082840312156131385761313761423d565b5b600061314684828501612fc5565b91505092915050565b600080604083850312156131665761316561423d565b5b600061317485828601612fb0565b925050602061318585828601612fb0565b9150509250929050565b6000806000606084860312156131a8576131a761423d565b5b60006131b686828701612fb0565b93505060206131c786828701612fb0565b92505060406131d8868287016130e0565b9150509250925092565b600080600080608085870312156131fc576131fb61423d565b5b600061320a87828801612fb0565b945050602061321b87828801612fb0565b935050604061322c878288016130e0565b925050606085013567ffffffffffffffff81111561324d5761324c614233565b5b61325987828801613084565b91505092959194509250565b6000806040838503121561327c5761327b61423d565b5b600061328a85828601612fb0565b925050602061329b85828601613030565b9150509250929050565b600080604083850312156132bc576132bb61423d565b5b60006132ca85828601612fb0565b92505060206132db858286016130e0565b9150509250929050565b600080602083850312156132fc576132fb61423d565b5b600083013567ffffffffffffffff81111561331a57613319614233565b5b61332685828601612fda565b92509250509250929050565b6000602082840312156133485761334761423d565b5b600061335684828501613030565b91505092915050565b6000602082840312156133755761337461423d565b5b600061338384828501613045565b91505092915050565b6000602082840312156133a2576133a161423d565b5b60006133b08482850161305a565b91505092915050565b6000602082840312156133cf576133ce61423d565b5b60006133dd8482850161306f565b91505092915050565b6000602082840312156133fc576133fb61423d565b5b600082013567ffffffffffffffff81111561341a57613419614233565b5b613426848285016130b2565b91505092915050565b6000602082840312156134455761344461423d565b5b6000613453848285016130e0565b91505092915050565b600080604083850312156134735761347261423d565b5b6000613481858286016130e0565b925050602061349285828601613030565b9150509250929050565b6000806000606084860312156134b5576134b461423d565b5b60006134c3868287016130e0565b93505060206134d4868287016130e0565b92505060406134e5868287016130e0565b9150509250925092565b6134f881613fa3565b82525050565b600061350a8385613e81565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561353d5761353c614238565b5b60208302925061354e838584614017565b82840190509392505050565b61356381613fb5565b82525050565b600061357482613e6b565b61357e8185613e92565b935061358e818560208601614026565b61359781614242565b840191505092915050565b60006135ad82613e76565b6135b78185613ea3565b93506135c7818560208601614026565b6135d081614242565b840191505092915050565b60006135e682613e76565b6135f08185613eb4565b9350613600818560208601614026565b80840191505092915050565b6000613619602d83613ea3565b915061362482614253565b604082019050919050565b600061363c602b83613ea3565b9150613647826142a2565b604082019050919050565b600061365f603283613ea3565b915061366a826142f1565b604082019050919050565b6000613682602683613ea3565b915061368d82614340565b604082019050919050565b60006136a5602583613ea3565b91506136b08261438f565b604082019050919050565b60006136c8601c83613ea3565b91506136d3826143de565b602082019050919050565b60006136eb600983613ea3565b91506136f682614407565b602082019050919050565b600061370e600a83613ea3565b915061371982614430565b602082019050919050565b6000613731602483613ea3565b915061373c82614459565b604082019050919050565b6000613754601983613ea3565b915061375f826144a8565b602082019050919050565b6000613777600883613ea3565b9150613782826144d1565b602082019050919050565b600061379a601883613ea3565b91506137a5826144fa565b602082019050919050565b60006137bd602983613ea3565b91506137c882614523565b604082019050919050565b60006137e0602083613ea3565b91506137eb82614572565b602082019050919050565b6000613803602083613ea3565b915061380e8261459b565b602082019050919050565b6000613826601083613ea3565b9150613831826145c4565b602082019050919050565b6000613849600f83613ea3565b9150613854826145ed565b602082019050919050565b600061386c601883613ea3565b915061387782614616565b602082019050919050565b600061388f602183613ea3565b915061389a8261463f565b604082019050919050565b60006138b2600e83613ea3565b91506138bd8261468e565b602082019050919050565b60006138d5603d83613ea3565b91506138e0826146b7565b604082019050919050565b60006138f8602c83613ea3565b915061390382614706565b604082019050919050565b600061391b603583613ea3565b915061392682614755565b604082019050919050565b600061393e601f83613ea3565b9150613949826147a4565b602082019050919050565b6000613961603083613ea3565b915061396c826147cd565b604082019050919050565b6139808161400d565b82525050565b600061399282856135db565b915061399e82846135db565b91508190509392505050565b60006020820190506139bf60008301846134ef565b92915050565b60006060820190506139da60008301866134ef565b6139e760208301856134ef565b6139f46040830184613977565b949350505050565b6000608082019050613a1160008301876134ef565b613a1e60208301866134ef565b613a2b6040830185613977565b8181036060830152613a3d8184613569565b905095945050505050565b60006020820190508181036000830152613a638184866134fe565b90509392505050565b6000602082019050613a81600083018461355a565b92915050565b60006020820190508181036000830152613aa181846135a2565b905092915050565b60006020820190508181036000830152613ac28161360c565b9050919050565b60006020820190508181036000830152613ae28161362f565b9050919050565b60006020820190508181036000830152613b0281613652565b9050919050565b60006020820190508181036000830152613b2281613675565b9050919050565b60006020820190508181036000830152613b4281613698565b9050919050565b60006020820190508181036000830152613b62816136bb565b9050919050565b60006020820190508181036000830152613b82816136de565b9050919050565b60006020820190508181036000830152613ba281613701565b9050919050565b60006020820190508181036000830152613bc281613724565b9050919050565b60006020820190508181036000830152613be281613747565b9050919050565b60006020820190508181036000830152613c028161376a565b9050919050565b60006020820190508181036000830152613c228161378d565b9050919050565b60006020820190508181036000830152613c42816137b0565b9050919050565b60006020820190508181036000830152613c62816137d3565b9050919050565b60006020820190508181036000830152613c82816137f6565b9050919050565b60006020820190508181036000830152613ca281613819565b9050919050565b60006020820190508181036000830152613cc28161383c565b9050919050565b60006020820190508181036000830152613ce28161385f565b9050919050565b60006020820190508181036000830152613d0281613882565b9050919050565b60006020820190508181036000830152613d22816138a5565b9050919050565b60006020820190508181036000830152613d42816138c8565b9050919050565b60006020820190508181036000830152613d62816138eb565b9050919050565b60006020820190508181036000830152613d828161390e565b9050919050565b60006020820190508181036000830152613da281613931565b9050919050565b60006020820190508181036000830152613dc281613954565b9050919050565b6000602082019050613dde6000830184613977565b92915050565b6000613dee613dff565b9050613dfa828261408b565b919050565b6000604051905090565b600067ffffffffffffffff821115613e2457613e236141f0565b5b613e2d82614242565b9050602081019050919050565b600067ffffffffffffffff821115613e5557613e546141f0565b5b613e5e82614242565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613eca8261400d565b9150613ed58361400d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613f0a57613f09614105565b5b828201905092915050565b6000613f208261400d565b9150613f2b8361400d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613f6457613f63614105565b5b828202905092915050565b6000613f7a8261400d565b9150613f858361400d565b925082821015613f9857613f97614105565b5b828203905092915050565b6000613fae82613fed565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614044578082015181840152602081019050614029565b83811115614053576000848401525b50505050565b6000600282049050600182168061407157607f821691505b6020821081141561408557614084614163565b5b50919050565b61409482614242565b810181811067ffffffffffffffff821117156140b3576140b26141f0565b5b80604052505050565b60006140c78261400d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156140fa576140f9614105565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f6e656564206d6f72650000000000000000000000000000000000000000000000600082015250565b7f6d617820737570706c7900000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f6e6f74206f70656e000000000000000000000000000000000000000000000000600082015250565b7f796f752063616e6e6f7420636c61696d20616e796d6f72650000000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f63616e6e6f74206d696e74206d6f726500000000000000000000000000000000600082015250565b7f63616e6e6f74206265207a65726f2e0000000000000000000000000000000000600082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f696e7375662062616c616e63652e000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e2e00000000000000000000000000000000602082015250565b61482581613fa3565b811461483057600080fd5b50565b61483c81613fb5565b811461484757600080fd5b50565b61485381613fc1565b811461485e57600080fd5b50565b61486a8161400d565b811461487557600080fd5b5056fea2646970667358221220560b1a33e082559e72bf9c54f5c4b87fc3d4cb1a7192a91b6a112a1bfd2a451464736f6c63430008070033000000000000000000000000b1b0de0b760d4454585e4e4f16db87bc294d7db90000000000000000000000000644def359b95c0a640196b28d88e5e0de8e4c6600000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d65664339456e69337a4c327945666b6e5a48475968444e597252354b51447643486b79436b4738315258504e2f00000000000000000000
Deployed Bytecode
0x6080604052600436106101f95760003560e01c80636352211e1161010d578063a243d3b6116100a0578063c002d23d1161006f578063c002d23d146106fe578063c87b56dd14610729578063e985e9c514610766578063f2fde38b146107a3578063fae9806a146107cc576101f9565b8063a243d3b614610665578063a4435dfd14610681578063a88fe42d146106ac578063b88d4fde146106d5576101f9565b80638da5cb5b116100dc5780638da5cb5b146105bb57806395d89b41146105e65780639604ad4614610611578063a22cb4651461063c576101f9565b80636352211e146104ff5780636aa003711461053c57806370a0823114610567578063715018a6146105a4576101f9565b80632f745c59116101905780633b67cf1a1161015f5780633b67cf1a146104305780633ccfd60b1461045957806342842e0e146104705780634f6ccce71461049957806355f804b3146104d6576101f9565b80632f745c591461037457806332682559146103b157806332cb6b0c146103dc5780633b58524d14610407576101f9565b80630e2d56cf116101cc5780630e2d56cf146102cc57806318160ddd146102f55780631ec93f911461032057806323b872dd1461034b576101f9565b806301ffc9a7146101fe57806306fdde031461023b578063081812fc14610266578063095ea7b3146102a3575b600080fd5b34801561020a57600080fd5b506102256004803603810190610220919061338c565b6107f7565b6040516102329190613a6c565b60405180910390f35b34801561024757600080fd5b50610250610871565b60405161025d9190613a87565b60405180910390f35b34801561027257600080fd5b5061028d6004803603810190610288919061342f565b610903565b60405161029a91906139aa565b60405180910390f35b3480156102af57600080fd5b506102ca60048036038101906102c591906132a5565b610949565b005b3480156102d857600080fd5b506102f360048036038101906102ee9190613332565b610a61565b005b34801561030157600080fd5b5061030a610a86565b6040516103179190613dc9565b60405180910390f35b34801561032c57600080fd5b50610335610a93565b6040516103429190613dc9565b60405180910390f35b34801561035757600080fd5b50610372600480360381019061036d919061318f565b610a99565b005b34801561038057600080fd5b5061039b600480360381019061039691906132a5565b610af9565b6040516103a89190613dc9565b60405180910390f35b3480156103bd57600080fd5b506103c6610b9e565b6040516103d39190613dc9565b60405180910390f35b3480156103e857600080fd5b506103f1610ba4565b6040516103fe9190613dc9565b60405180910390f35b34801561041357600080fd5b5061042e6004803603810190610429919061314f565b610baa565b005b34801561043c57600080fd5b50610457600480360381019061045291906132e5565b610c38565b005b34801561046557600080fd5b5061046e610f47565b005b34801561047c57600080fd5b506104976004803603810190610492919061318f565b610fa8565b005b3480156104a557600080fd5b506104c060048036038101906104bb919061342f565b610fc8565b6040516104cd9190613dc9565b60405180910390f35b3480156104e257600080fd5b506104fd60048036038101906104f891906133e6565b611039565b005b34801561050b57600080fd5b506105266004803603810190610521919061342f565b61105b565b60405161053391906139aa565b60405180910390f35b34801561054857600080fd5b506105516110e2565b60405161055e91906139aa565b60405180910390f35b34801561057357600080fd5b5061058e600480360381019061058991906130f5565b611108565b60405161059b9190613dc9565b60405180910390f35b3480156105b057600080fd5b506105b96111c0565b005b3480156105c757600080fd5b506105d06111d4565b6040516105dd91906139aa565b60405180910390f35b3480156105f257600080fd5b506105fb6111fe565b6040516106089190613a87565b60405180910390f35b34801561061d57600080fd5b50610626611290565b60405161063391906139aa565b60405180910390f35b34801561064857600080fd5b50610663600480360381019061065e9190613265565b6112b6565b005b61067f600480360381019061067a919061345c565b6112cc565b005b34801561068d57600080fd5b506106966114fe565b6040516106a39190613a6c565b60405180910390f35b3480156106b857600080fd5b506106d360048036038101906106ce919061349c565b611511565b005b3480156106e157600080fd5b506106fc60048036038101906106f791906131e2565b611533565b005b34801561070a57600080fd5b50610713611595565b6040516107209190613dc9565b60405180910390f35b34801561073557600080fd5b50610750600480360381019061074b919061342f565b61159b565b60405161075d9190613a87565b60405180910390f35b34801561077257600080fd5b5061078d6004803603810190610788919061314f565b611652565b60405161079a9190613a6c565b60405180910390f35b3480156107af57600080fd5b506107ca60048036038101906107c591906130f5565b6116e6565b005b3480156107d857600080fd5b506107e161176a565b6040516107ee9190613dc9565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061086a575061086982611770565b5b9050919050565b60606000805461088090614059565b80601f01602080910402602001604051908101604052809291908181526020018280546108ac90614059565b80156108f95780601f106108ce576101008083540402835291602001916108f9565b820191906000526020600020905b8154815290600101906020018083116108dc57829003601f168201915b5050505050905090565b600061090e82611852565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109548261105b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109bc90613ce9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109e461189d565b73ffffffffffffffffffffffffffffffffffffffff161480610a135750610a1281610a0d61189d565b611652565b5b610a52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4990613d29565b60405180910390fd5b610a5c83836118a5565b505050565b610a6961195e565b80601160006101000a81548160ff02191690831515021790555050565b6000600880549050905090565b600e5481565b610aaa610aa461189d565b826119dc565b610ae9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae090613aa9565b60405180910390fd5b610af4838383611a71565b505050565b6000610b0483611108565b8210610b45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3c90613ac9565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600d5481565b61138881565b610bb261195e565b81601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b601160009054906101000a900460ff1615610c88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7f90613c09565b60405180910390fd5b600082829050905060005b81811015610ddc576000848483818110610cb057610caf6141c1565b5b9050602002013590503373ffffffffffffffffffffffffffffffffffffffff16601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401610d2b9190613dc9565b60206040518083038186803b158015610d4357600080fd5b505afa158015610d57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d7b9190613122565b73ffffffffffffffffffffffffffffffffffffffff1614610dc8576040517f4c084f1400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b508080610dd4906140bc565b915050610c93565b507fed38d8732856e4b58bfd8edce96464b7f141ccf88afd262c682aea5ec205aebe8383604051610e0e929190613a48565b60405180910390a1601160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600d5485610e869190613f15565b6040518463ffffffff1660e01b8152600401610ea4939291906139c5565b602060405180830381600087803b158015610ebe57600080fd5b505af1158015610ed2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ef6919061335f565b50610f4233848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050611d6b565b505050565b610f4f61195e565b610f57611df7565b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610f9d573d6000803e3d6000fd5b50610fa6611e47565b565b610fc383838360405180602001604052806000815250611533565b505050565b6000610fd2610a86565b8210611013576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100a90613d49565b60405180910390fd5b60088281548110611027576110266141c1565b5b90600052602060002001549050919050565b61104161195e565b80600f9080519060200190611057929190612e89565b5050565b60008061106783611e51565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d090613cc9565b60405180910390fd5b80915050919050565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611179576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117090613c29565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6111c861195e565b6111d26000611e8e565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461120d90614059565b80601f016020809104026020016040519081016040528092919081815260200182805461123990614059565b80156112865780601f1061125b57610100808354040283529160200191611286565b820191906000526020600020905b81548152906001019060200180831161126957829003601f168201915b5050505050905090565b601160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6112c86112c161189d565b8383611f54565b5050565b6112d4611df7565b6000826112df610a86565b6112e99190613ebf565b9050601160009054906101000a900460ff1661133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133190613be9565b60405180910390fd5b6000831161137d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137490613ca9565b60405180910390fd5b600a8311156113c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b890613c89565b60405180910390fd5b6113888110611405576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fc90613b89565b60405180910390fd5b60008367ffffffffffffffff811115611421576114206141f0565b5b60405190808252806020026020018201604052801561144f5781602001602082028036833780820191505090505b50905060005b848110156114db57600060105490505b6113888110156114c757611478816120c1565b6114b457808383815181106114905761148f6141c1565b5b6020026020010181815250506001816114a99190613ebf565b6010819055506114c7565b80806114bf906140bc565b915050611465565b5080806114d3906140bc565b915050611455565b506114e68484612102565b6114f03382611d6b565b50506114fa611e47565b5050565b601160009054906101000a900460ff1681565b61151961195e565b82600c8190555081600d8190555080600e81905550505050565b61154461153e61189d565b836119dc565b611583576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157a90613aa9565b60405180910390fd5b61158f84848484612243565b50505050565b600c5481565b60606115a6826120c1565b6115e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115dc90613da9565b60405180910390fd5b816113886115f39190613ebf565b915060006115ff61229f565b9050600081511161161f576040518060200160405280600081525061164a565b8061162984612331565b60405160200161163a929190613986565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6116ee61195e565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561175e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175590613b09565b60405180910390fd5b61176781611e8e565b50565b60105481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061183b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061184b575061184a82612409565b5b9050919050565b61185b816120c1565b61189a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189190613cc9565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166119188361105b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61196661189d565b73ffffffffffffffffffffffffffffffffffffffff166119846111d4565b73ffffffffffffffffffffffffffffffffffffffff16146119da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d190613c69565b60405180910390fd5b565b6000806119e88361105b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611a2a5750611a298185611652565b5b80611a6857508373ffffffffffffffffffffffffffffffffffffffff16611a5084610903565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611a918261105b565b73ffffffffffffffffffffffffffffffffffffffff1614611ae7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ade90613b29565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4e90613ba9565b60405180910390fd5b611b648383836001612473565b8273ffffffffffffffffffffffffffffffffffffffff16611b848261105b565b73ffffffffffffffffffffffffffffffffffffffff1614611bda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd190613b29565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611d6683838360016125d3565b505050565b6000815111611daf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da690613b69565b60405180910390fd5b60005b8151811015611df257611ddf83838381518110611dd257611dd16141c1565b5b60200260200101516125d9565b8080611dea906140bc565b915050611db2565b505050565b6002600b541415611e3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3490613d89565b60405180910390fd5b6002600b81905550565b6001600b81905550565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611fc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fba90613bc9565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516120b49190613a6c565b60405180910390a3505050565b60008073ffffffffffffffffffffffffffffffffffffffff166120e383611e51565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b801561215d57600c54826121169190613f15565b341015612158576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214f90613d09565b60405180910390fd5b61223f565b601160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600e54866121cd9190613f15565b6040518463ffffffff1660e01b81526004016121eb939291906139c5565b602060405180830381600087803b15801561220557600080fd5b505af1158015612219573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061223d919061335f565b505b5050565b61224e848484611a71565b61225a848484846125f7565b612299576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229090613ae9565b60405180910390fd5b50505050565b6060600f80546122ae90614059565b80601f01602080910402602001604051908101604052809291908181526020018280546122da90614059565b80156123275780601f106122fc57610100808354040283529160200191612327565b820191906000526020600020905b81548152906001019060200180831161230a57829003601f168201915b5050505050905090565b6060600060016123408461278e565b01905060008167ffffffffffffffff81111561235f5761235e6141f0565b5b6040519080825280601f01601f1916602001820160405280156123915781602001600182028036833780820191505090505b509050600082602001820190505b6001156123fe578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816123e8576123e7614134565b5b04945060008514156123f9576123fe565b61239f565b819350505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61247f848484846128e1565b60018111156124c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ba90613d69565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561250b57612506816128e7565b61254a565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614612549576125488582612930565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561258d5761258881612a9d565b6125cc565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146125cb576125ca8482612b6e565b5b5b5050505050565b50505050565b6125f3828260405180602001604052806000815250612bed565b5050565b60006126188473ffffffffffffffffffffffffffffffffffffffff16612c48565b15612781578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261264161189d565b8786866040518563ffffffff1660e01b815260040161266394939291906139fc565b602060405180830381600087803b15801561267d57600080fd5b505af19250505080156126ae57506040513d601f19601f820116820180604052508101906126ab91906133b9565b60015b612731573d80600081146126de576040519150601f19603f3d011682016040523d82523d6000602084013e6126e3565b606091505b50600081511415612729576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272090613ae9565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612786565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106127ec577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816127e2576127e1614134565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612829576d04ee2d6d415b85acef8100000000838161281f5761281e614134565b5b0492506020810190505b662386f26fc10000831061285857662386f26fc10000838161284e5761284d614134565b5b0492506010810190505b6305f5e1008310612881576305f5e100838161287757612876614134565b5b0492506008810190505b61271083106128a657612710838161289c5761289b614134565b5b0492506004810190505b606483106128c957606483816128bf576128be614134565b5b0492506002810190505b600a83106128d8576001810190505b80915050919050565b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161293d84611108565b6129479190613f6f565b9050600060076000848152602001908152602001600020549050818114612a2c576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612ab19190613f6f565b9050600060096000848152602001908152602001600020549050600060088381548110612ae157612ae06141c1565b5b906000526020600020015490508060088381548110612b0357612b026141c1565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612b5257612b51614192565b5b6001900381819060005260206000200160009055905550505050565b6000612b7983611108565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b612bf78383612c6b565b612c0460008484846125f7565b612c43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3a90613ae9565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612cdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cd290613c49565b60405180910390fd5b612ce4816120c1565b15612d24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d1b90613b49565b60405180910390fd5b612d32600083836001612473565b612d3b816120c1565b15612d7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7290613b49565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612e856000838360016125d3565b5050565b828054612e9590614059565b90600052602060002090601f016020900481019282612eb75760008555612efe565b82601f10612ed057805160ff1916838001178555612efe565b82800160010185558215612efe579182015b82811115612efd578251825591602001919060010190612ee2565b5b509050612f0b9190612f0f565b5090565b5b80821115612f28576000816000905550600101612f10565b5090565b6000612f3f612f3a84613e09565b613de4565b905082815260208101848484011115612f5b57612f5a61422e565b5b612f66848285614017565b509392505050565b6000612f81612f7c84613e3a565b613de4565b905082815260208101848484011115612f9d57612f9c61422e565b5b612fa8848285614017565b509392505050565b600081359050612fbf8161481c565b92915050565b600081519050612fd48161481c565b92915050565b60008083601f840112612ff057612fef614224565b5b8235905067ffffffffffffffff81111561300d5761300c61421f565b5b60208301915083602082028301111561302957613028614229565b5b9250929050565b60008135905061303f81614833565b92915050565b60008151905061305481614833565b92915050565b6000813590506130698161484a565b92915050565b60008151905061307e8161484a565b92915050565b600082601f83011261309957613098614224565b5b81356130a9848260208601612f2c565b91505092915050565b600082601f8301126130c7576130c6614224565b5b81356130d7848260208601612f6e565b91505092915050565b6000813590506130ef81614861565b92915050565b60006020828403121561310b5761310a61423d565b5b600061311984828501612fb0565b91505092915050565b6000602082840312156131385761313761423d565b5b600061314684828501612fc5565b91505092915050565b600080604083850312156131665761316561423d565b5b600061317485828601612fb0565b925050602061318585828601612fb0565b9150509250929050565b6000806000606084860312156131a8576131a761423d565b5b60006131b686828701612fb0565b93505060206131c786828701612fb0565b92505060406131d8868287016130e0565b9150509250925092565b600080600080608085870312156131fc576131fb61423d565b5b600061320a87828801612fb0565b945050602061321b87828801612fb0565b935050604061322c878288016130e0565b925050606085013567ffffffffffffffff81111561324d5761324c614233565b5b61325987828801613084565b91505092959194509250565b6000806040838503121561327c5761327b61423d565b5b600061328a85828601612fb0565b925050602061329b85828601613030565b9150509250929050565b600080604083850312156132bc576132bb61423d565b5b60006132ca85828601612fb0565b92505060206132db858286016130e0565b9150509250929050565b600080602083850312156132fc576132fb61423d565b5b600083013567ffffffffffffffff81111561331a57613319614233565b5b61332685828601612fda565b92509250509250929050565b6000602082840312156133485761334761423d565b5b600061335684828501613030565b91505092915050565b6000602082840312156133755761337461423d565b5b600061338384828501613045565b91505092915050565b6000602082840312156133a2576133a161423d565b5b60006133b08482850161305a565b91505092915050565b6000602082840312156133cf576133ce61423d565b5b60006133dd8482850161306f565b91505092915050565b6000602082840312156133fc576133fb61423d565b5b600082013567ffffffffffffffff81111561341a57613419614233565b5b613426848285016130b2565b91505092915050565b6000602082840312156134455761344461423d565b5b6000613453848285016130e0565b91505092915050565b600080604083850312156134735761347261423d565b5b6000613481858286016130e0565b925050602061349285828601613030565b9150509250929050565b6000806000606084860312156134b5576134b461423d565b5b60006134c3868287016130e0565b93505060206134d4868287016130e0565b92505060406134e5868287016130e0565b9150509250925092565b6134f881613fa3565b82525050565b600061350a8385613e81565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561353d5761353c614238565b5b60208302925061354e838584614017565b82840190509392505050565b61356381613fb5565b82525050565b600061357482613e6b565b61357e8185613e92565b935061358e818560208601614026565b61359781614242565b840191505092915050565b60006135ad82613e76565b6135b78185613ea3565b93506135c7818560208601614026565b6135d081614242565b840191505092915050565b60006135e682613e76565b6135f08185613eb4565b9350613600818560208601614026565b80840191505092915050565b6000613619602d83613ea3565b915061362482614253565b604082019050919050565b600061363c602b83613ea3565b9150613647826142a2565b604082019050919050565b600061365f603283613ea3565b915061366a826142f1565b604082019050919050565b6000613682602683613ea3565b915061368d82614340565b604082019050919050565b60006136a5602583613ea3565b91506136b08261438f565b604082019050919050565b60006136c8601c83613ea3565b91506136d3826143de565b602082019050919050565b60006136eb600983613ea3565b91506136f682614407565b602082019050919050565b600061370e600a83613ea3565b915061371982614430565b602082019050919050565b6000613731602483613ea3565b915061373c82614459565b604082019050919050565b6000613754601983613ea3565b915061375f826144a8565b602082019050919050565b6000613777600883613ea3565b9150613782826144d1565b602082019050919050565b600061379a601883613ea3565b91506137a5826144fa565b602082019050919050565b60006137bd602983613ea3565b91506137c882614523565b604082019050919050565b60006137e0602083613ea3565b91506137eb82614572565b602082019050919050565b6000613803602083613ea3565b915061380e8261459b565b602082019050919050565b6000613826601083613ea3565b9150613831826145c4565b602082019050919050565b6000613849600f83613ea3565b9150613854826145ed565b602082019050919050565b600061386c601883613ea3565b915061387782614616565b602082019050919050565b600061388f602183613ea3565b915061389a8261463f565b604082019050919050565b60006138b2600e83613ea3565b91506138bd8261468e565b602082019050919050565b60006138d5603d83613ea3565b91506138e0826146b7565b604082019050919050565b60006138f8602c83613ea3565b915061390382614706565b604082019050919050565b600061391b603583613ea3565b915061392682614755565b604082019050919050565b600061393e601f83613ea3565b9150613949826147a4565b602082019050919050565b6000613961603083613ea3565b915061396c826147cd565b604082019050919050565b6139808161400d565b82525050565b600061399282856135db565b915061399e82846135db565b91508190509392505050565b60006020820190506139bf60008301846134ef565b92915050565b60006060820190506139da60008301866134ef565b6139e760208301856134ef565b6139f46040830184613977565b949350505050565b6000608082019050613a1160008301876134ef565b613a1e60208301866134ef565b613a2b6040830185613977565b8181036060830152613a3d8184613569565b905095945050505050565b60006020820190508181036000830152613a638184866134fe565b90509392505050565b6000602082019050613a81600083018461355a565b92915050565b60006020820190508181036000830152613aa181846135a2565b905092915050565b60006020820190508181036000830152613ac28161360c565b9050919050565b60006020820190508181036000830152613ae28161362f565b9050919050565b60006020820190508181036000830152613b0281613652565b9050919050565b60006020820190508181036000830152613b2281613675565b9050919050565b60006020820190508181036000830152613b4281613698565b9050919050565b60006020820190508181036000830152613b62816136bb565b9050919050565b60006020820190508181036000830152613b82816136de565b9050919050565b60006020820190508181036000830152613ba281613701565b9050919050565b60006020820190508181036000830152613bc281613724565b9050919050565b60006020820190508181036000830152613be281613747565b9050919050565b60006020820190508181036000830152613c028161376a565b9050919050565b60006020820190508181036000830152613c228161378d565b9050919050565b60006020820190508181036000830152613c42816137b0565b9050919050565b60006020820190508181036000830152613c62816137d3565b9050919050565b60006020820190508181036000830152613c82816137f6565b9050919050565b60006020820190508181036000830152613ca281613819565b9050919050565b60006020820190508181036000830152613cc28161383c565b9050919050565b60006020820190508181036000830152613ce28161385f565b9050919050565b60006020820190508181036000830152613d0281613882565b9050919050565b60006020820190508181036000830152613d22816138a5565b9050919050565b60006020820190508181036000830152613d42816138c8565b9050919050565b60006020820190508181036000830152613d62816138eb565b9050919050565b60006020820190508181036000830152613d828161390e565b9050919050565b60006020820190508181036000830152613da281613931565b9050919050565b60006020820190508181036000830152613dc281613954565b9050919050565b6000602082019050613dde6000830184613977565b92915050565b6000613dee613dff565b9050613dfa828261408b565b919050565b6000604051905090565b600067ffffffffffffffff821115613e2457613e236141f0565b5b613e2d82614242565b9050602081019050919050565b600067ffffffffffffffff821115613e5557613e546141f0565b5b613e5e82614242565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613eca8261400d565b9150613ed58361400d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613f0a57613f09614105565b5b828201905092915050565b6000613f208261400d565b9150613f2b8361400d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613f6457613f63614105565b5b828202905092915050565b6000613f7a8261400d565b9150613f858361400d565b925082821015613f9857613f97614105565b5b828203905092915050565b6000613fae82613fed565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614044578082015181840152602081019050614029565b83811115614053576000848401525b50505050565b6000600282049050600182168061407157607f821691505b6020821081141561408557614084614163565b5b50919050565b61409482614242565b810181811067ffffffffffffffff821117156140b3576140b26141f0565b5b80604052505050565b60006140c78261400d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156140fa576140f9614105565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f6e656564206d6f72650000000000000000000000000000000000000000000000600082015250565b7f6d617820737570706c7900000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f6e6f74206f70656e000000000000000000000000000000000000000000000000600082015250565b7f796f752063616e6e6f7420636c61696d20616e796d6f72650000000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f63616e6e6f74206d696e74206d6f726500000000000000000000000000000000600082015250565b7f63616e6e6f74206265207a65726f2e0000000000000000000000000000000000600082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f696e7375662062616c616e63652e000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e2e00000000000000000000000000000000602082015250565b61482581613fa3565b811461483057600080fd5b50565b61483c81613fb5565b811461484757600080fd5b50565b61485381613fc1565b811461485e57600080fd5b50565b61486a8161400d565b811461487557600080fd5b5056fea2646970667358221220560b1a33e082559e72bf9c54f5c4b87fc3d4cb1a7192a91b6a112a1bfd2a451464736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000b1b0de0b760d4454585e4e4f16db87bc294d7db90000000000000000000000000644def359b95c0a640196b28d88e5e0de8e4c6600000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d65664339456e69337a4c327945666b6e5a48475968444e597252354b51447643486b79436b4738315258504e2f00000000000000000000
-----Decoded View---------------
Arg [0] : _collectionAddress (address): 0xb1b0de0b760d4454585E4e4f16DB87Bc294d7DB9
Arg [1] : _util (address): 0x0644def359B95c0a640196B28D88e5E0DE8e4C66
Arg [2] : _baseuri (string): ipfs://QmefC9Eni3zL2yEfknZHGYhDNYrR5KQDvCHkyCkG81RXPN/
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 000000000000000000000000b1b0de0b760d4454585e4e4f16db87bc294d7db9
Arg [1] : 0000000000000000000000000644def359b95c0a640196b28d88e5e0de8e4c66
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [4] : 697066733a2f2f516d65664339456e69337a4c327945666b6e5a48475968444e
Arg [5] : 597252354b51447643486b79436b4738315258504e2f00000000000000000000
Deployed Bytecode Sourcemap
68740:4026:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62703:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46410:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47922:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47440:416;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72148:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63343:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68958:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48622:335;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63011:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68913:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68819:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72480:153;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70994:547;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72641:122;;;;;;;;;;;;;:::i;:::-;;49028:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63533:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71651:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46120:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69165:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45851:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23833:103;;;;;;;;;;;;;:::i;:::-;;23185:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46579:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69132:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48165:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69857:820;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69091:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72253:219;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49284:322;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68867:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71751:389;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48391:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24091:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69047:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62703:224;62805:4;62844:35;62829:50;;;:11;:50;;;;:90;;;;62883:36;62907:11;62883:23;:36::i;:::-;62829:90;62822:97;;62703:224;;;:::o;46410:100::-;46464:13;46497:5;46490:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46410:100;:::o;47922:171::-;47998:7;48018:23;48033:7;48018:14;:23::i;:::-;48061:15;:24;48077:7;48061:24;;;;;;;;;;;;;;;;;;;;;48054:31;;47922:171;;;:::o;47440:416::-;47521:13;47537:23;47552:7;47537:14;:23::i;:::-;47521:39;;47585:5;47579:11;;:2;:11;;;;47571:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;47679:5;47663:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;47688:37;47705:5;47712:12;:10;:12::i;:::-;47688:16;:37::i;:::-;47663:62;47641:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;47827:21;47836:2;47840:7;47827:8;:21::i;:::-;47510:346;47440:416;;:::o;72148:97::-;23071:13;:11;:13::i;:::-;72232:5:::1;72213:16;;:24;;;;;;;;;;;;;;;;;;72148:97:::0;:::o;63343:113::-;63404:7;63431:10;:17;;;;63424:24;;63343:113;:::o;68958:45::-;;;;:::o;48622:335::-;48817:41;48836:12;:10;:12::i;:::-;48850:7;48817:18;:41::i;:::-;48809:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;48921:28;48931:4;48937:2;48941:7;48921:9;:28::i;:::-;48622:335;;;:::o;63011:256::-;63108:7;63144:23;63161:5;63144:16;:23::i;:::-;63136:5;:31;63128:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;63233:12;:19;63246:5;63233:19;;;;;;;;;;;;;;;:26;63253:5;63233:26;;;;;;;;;;;;63226:33;;63011:256;;;;:::o;68913:38::-;;;;:::o;68819:41::-;68856:4;68819:41;:::o;72480:153::-;23071:13;:11;:13::i;:::-;72584:11:::1;72564:17;;:31;;;;;;;;;;;;;;;;;;72620:5;72606:11;;:19;;;;;;;;;;;;;;;;;;72480:153:::0;;:::o;70994:547::-;71067:16;;;;;;;;;;;71066:17;71058:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;71123:14;71140:3;;:10;;71123:27;;71169:9;71164:199;71184:6;71180:1;:10;71164:199;;;71212:17;71232:3;;71236:1;71232:6;;;;;;;:::i;:::-;;;;;;;;71212:26;;71315:10;71256:69;;71274:17;;;;;;;;;;;71256:44;;;71301:9;71256:55;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:69;;;71253:98;;71334:17;;;;;;;;;;;;;;71253:98;71197:166;71192:3;;;;;:::i;:::-;;;;71164:199;;;;71388:18;71402:3;;71388:18;;;;;;;:::i;:::-;;;;;;;;71426:11;;;;;;;;;;;71419:32;;;71452:10;71464:11;;;;;;;;;;;71486:10;;71477:6;:19;;;;:::i;:::-;71419:78;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;71508:25;71517:10;71529:3;;71508:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:8;:25::i;:::-;71047:494;70994:547;;:::o;72641:122::-;23071:13;:11;:13::i;:::-;5257:21:::1;:19;:21::i;:::-;72712:10:::2;72704:28;;:51;72733:21;72704:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;5301:20:::1;:18;:20::i;:::-;72641:122::o:0;49028:185::-;49166:39;49183:4;49189:2;49193:7;49166:39;;;;;;;;;;;;:16;:39::i;:::-;49028:185;;;:::o;63533:233::-;63608:7;63644:30;:28;:30::i;:::-;63636:5;:38;63628:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;63741:10;63752:5;63741:17;;;;;;;;:::i;:::-;;;;;;;;;;63734:24;;63533:233;;;:::o;71651:95::-;23071:13;:11;:13::i;:::-;71730:11:::1;71720:7;:21;;;;;;;;;;;;:::i;:::-;;71651:95:::0;:::o;46120:223::-;46192:7;46212:13;46228:17;46237:7;46228:8;:17::i;:::-;46212:33;;46281:1;46264:19;;:5;:19;;;;46256:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;46330:5;46323:12;;;46120:223;;;:::o;69165:32::-;;;;;;;;;;;;;:::o;45851:207::-;45923:7;45968:1;45951:19;;:5;:19;;;;45943:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;46034:9;:16;46044:5;46034:16;;;;;;;;;;;;;;;;46027:23;;45851:207;;;:::o;23833:103::-;23071:13;:11;:13::i;:::-;23898:30:::1;23925:1;23898:18;:30::i;:::-;23833:103::o:0;23185:87::-;23231:7;23258:6;;;;;;;;;;;23251:13;;23185:87;:::o;46579:104::-;46635:13;46668:7;46661:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46579:104;:::o;69132:26::-;;;;;;;;;;;;;:::o;48165:155::-;48260:52;48279:12;:10;:12::i;:::-;48293:8;48303;48260:18;:52::i;:::-;48165:155;;:::o;69857:820::-;5257:21;:19;:21::i;:::-;69950:17:::1;69986:6;69970:13;:11;:13::i;:::-;:22;;;;:::i;:::-;69950:42;;70011:16;;;;;;;;;;;70003:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;70068:1;70059:6;:10;70051:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;70118:2;70108:6;:12;;70100:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;68856:4;70160:9;:22;70152:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;70210:23;70250:6;70236:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70210:47;;70273:13;70268:321;70300:6;70292:5;:14;70268:321;;;70337:9;70349:18;;70337:30;;70332:246;68856:4;70369:1;:14;70332:246;;;70414:10;70422:1;70414:7;:10::i;:::-;70409:154;;70465:1;70449:6;70456:5;70449:13;;;;;;;;:::i;:::-;;;;;;;:17;;;::::0;::::1;70514:1;70510;:5;;;;:::i;:::-;70489:18;:26;;;;70538:5;;70409:154;70385:3;;;;;:::i;:::-;;;;70332:246;;;;70308:7;;;;;:::i;:::-;;;;70268:321;;;;70601:28;70609:6;70617:11;70601:7;:28::i;:::-;70640;70649:10;70661:6;70640:8;:28::i;:::-;69939:738;;5301:20:::0;:18;:20::i;:::-;69857:820;;:::o;69091:28::-;;;;;;;;;;;;;:::o;72253:219::-;23071:13;:11;:13::i;:::-;72376:9:::1;72363:10;:22;;;;72409:9;72396:10;:22;;;;72449:15;72429:17;:35;;;;72253:219:::0;;;:::o;49284:322::-;49458:41;49477:12;:10;:12::i;:::-;49491:7;49458:18;:41::i;:::-;49450:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;49560:38;49574:4;49580:2;49584:7;49593:4;49560:13;:38::i;:::-;49284:322;;;;:::o;68867:39::-;;;;:::o;71751:389::-;71824:13;71852:16;71860:7;71852;:16::i;:::-;71844:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;71949:7;71942:4;:14;;;;:::i;:::-;71932:24;;71961:28;71992:10;:8;:10::i;:::-;71961:41;;72049:1;72024:14;72018:28;:32;:117;;;;;;;;;;;;;;;;;72082:14;72098:25;72115:7;72098:16;:25::i;:::-;72065:59;;;;;;;;;:::i;:::-;;;;;;;;;;;;;72018:117;72007:128;;;71751:389;;;:::o;48391:164::-;48488:4;48512:18;:25;48531:5;48512:25;;;;;;;;;;;;;;;:35;48538:8;48512:35;;;;;;;;;;;;;;;;;;;;;;;;;48505:42;;48391:164;;;;:::o;24091:201::-;23071:13;:11;:13::i;:::-;24200:1:::1;24180:22;;:8;:22;;;;24172:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24256:28;24275:8;24256:18;:28::i;:::-;24091:201:::0;:::o;69047:37::-;;;;:::o;45482:305::-;45584:4;45636:25;45621:40;;;:11;:40;;;;:105;;;;45693:33;45678:48;;;:11;:48;;;;45621:105;:158;;;;45743:36;45767:11;45743:23;:36::i;:::-;45621:158;45601:178;;45482:305;;;:::o;57741:135::-;57823:16;57831:7;57823;:16::i;:::-;57815:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;57741:135;:::o;21736:98::-;21789:7;21816:10;21809:17;;21736:98;:::o;57020:174::-;57122:2;57095:15;:24;57111:7;57095:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;57178:7;57174:2;57140:46;;57149:23;57164:7;57149:14;:23::i;:::-;57140:46;;;;;;;;;;;;57020:174;;:::o;23350:132::-;23425:12;:10;:12::i;:::-;23414:23;;:7;:5;:7::i;:::-;:23;;;23406:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;23350:132::o;51639:264::-;51732:4;51749:13;51765:23;51780:7;51765:14;:23::i;:::-;51749:39;;51818:5;51807:16;;:7;:16;;;:52;;;;51827:32;51844:5;51851:7;51827:16;:32::i;:::-;51807:52;:87;;;;51887:7;51863:31;;:20;51875:7;51863:11;:20::i;:::-;:31;;;51807:87;51799:96;;;51639:264;;;;:::o;55638:1263::-;55797:4;55770:31;;:23;55785:7;55770:14;:23::i;:::-;:31;;;55762:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;55876:1;55862:16;;:2;:16;;;;55854:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;55932:42;55953:4;55959:2;55963:7;55972:1;55932:20;:42::i;:::-;56104:4;56077:31;;:23;56092:7;56077:14;:23::i;:::-;:31;;;56069:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;56222:15;:24;56238:7;56222:24;;;;;;;;;;;;56215:31;;;;;;;;;;;56717:1;56698:9;:15;56708:4;56698:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;56750:1;56733:9;:13;56743:2;56733:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;56792:2;56773:7;:16;56781:7;56773:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;56831:7;56827:2;56812:27;;56821:4;56812:27;;;;;;;;;;;;56852:41;56872:4;56878:2;56882:7;56891:1;56852:19;:41::i;:::-;55638:1263;;;:::o;69598:251::-;69701:1;69683:8;:15;:19;69675:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;69732:13;69727:115;69759:8;:15;69751:5;:23;69727:115;;;69800:30;69810:2;69814:8;69823:5;69814:15;;;;;;;;:::i;:::-;;;;;;;;69800:9;:30::i;:::-;69776:7;;;;;:::i;:::-;;;;69727:115;;;;69598:251;;:::o;5337:293::-;4739:1;5471:7;;:19;;5463:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;4739:1;5604:7;:18;;;;5337:293::o;5638:213::-;4695:1;5821:7;:22;;;;5638:213::o;50914:117::-;50980:7;51007;:16;51015:7;51007:16;;;;;;;;;;;;;;;;;;;;;51000:23;;50914:117;;;:::o;24452:191::-;24526:16;24545:6;;;;;;;;;;;24526:25;;24571:8;24562:6;;:17;;;;;;;;;;;;;;;;;;24626:8;24595:40;;24616:8;24595:40;;;;;;;;;;;;24515:128;24452:191;:::o;57337:315::-;57492:8;57483:17;;:5;:17;;;;57475:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;57579:8;57541:18;:25;57560:5;57541:25;;;;;;;;;;;;;;;:35;57567:8;57541:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;57625:8;57603:41;;57618:5;57603:41;;;57635:8;57603:41;;;;;;:::i;:::-;;;;;;;;57337:315;;;:::o;51344:128::-;51409:4;51462:1;51433:31;;:17;51442:7;51433:8;:17::i;:::-;:31;;;;51426:38;;51344:128;;;:::o;70685:301::-;70760:11;70756:223;;;70819:10;;70810:6;:19;;;;:::i;:::-;70796:9;:34;;70788:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;70756:223;;;70889:11;;;;;;;;;;;70882:32;;;70915:10;70927:11;;;;;;;;;;;70949:17;;70940:6;:26;;;;:::i;:::-;70882:85;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;70756:223;70685:301;;:::o;50487:313::-;50643:28;50653:4;50659:2;50663:7;50643:9;:28::i;:::-;50690:47;50713:4;50719:2;50723:7;50732:4;50690:22;:47::i;:::-;50682:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;50487:313;;;;:::o;71547:99::-;71607:13;71634:7;71627:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71547:99;:::o;19163:716::-;19219:13;19270:14;19307:1;19287:17;19298:5;19287:10;:17::i;:::-;:21;19270:38;;19323:20;19357:6;19346:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19323:41;;19379:11;19508:6;19504:2;19500:15;19492:6;19488:28;19481:35;;19545:288;19552:4;19545:288;;;19577:5;;;;;;;;19719:8;19714:2;19707:5;19703:14;19698:30;19693:3;19685:44;19775:2;19766:11;;;;;;:::i;:::-;;;;;19809:1;19800:5;:10;19796:21;;;19812:5;;19796:21;19545:288;;;19854:6;19847:13;;;;;19163:716;;;:::o;36914:157::-;36999:4;37038:25;37023:40;;;:11;:40;;;;37016:47;;36914:157;;;:::o;63840:915::-;64017:61;64044:4;64050:2;64054:12;64068:9;64017:26;:61::i;:::-;64107:1;64095:9;:13;64091:222;;;64238:63;;;;;;;;;;:::i;:::-;;;;;;;;64091:222;64325:15;64343:12;64325:30;;64388:1;64372:18;;:4;:18;;;64368:187;;;64407:40;64439:7;64407:31;:40::i;:::-;64368:187;;;64477:2;64469:10;;:4;:10;;;64465:90;;64496:47;64529:4;64535:7;64496:32;:47::i;:::-;64465:90;64368:187;64583:1;64569:16;;:2;:16;;;64565:183;;;64602:45;64639:7;64602:36;:45::i;:::-;64565:183;;;64675:4;64669:10;;:2;:10;;;64665:83;;64696:40;64724:2;64728:7;64696:27;:40::i;:::-;64665:83;64565:183;64006:749;63840:915;;;;:::o;60906:158::-;;;;;:::o;52245:110::-;52321:26;52331:2;52335:7;52321:26;;;;;;;;;;;;:9;:26::i;:::-;52245:110;;:::o;58440:853::-;58594:4;58615:15;:2;:13;;;:15::i;:::-;58611:675;;;58667:2;58651:36;;;58688:12;:10;:12::i;:::-;58702:4;58708:7;58717:4;58651:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;58647:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58909:1;58892:6;:13;:18;58888:328;;;58935:60;;;;;;;;;;:::i;:::-;;;;;;;;58888:328;59166:6;59160:13;59151:6;59147:2;59143:15;59136:38;58647:584;58783:41;;;58773:51;;;:6;:51;;;;58766:58;;;;;58611:675;59270:4;59263:11;;58440:853;;;;;;;:::o;16029:922::-;16082:7;16102:14;16119:1;16102:18;;16169:6;16160:5;:15;16156:102;;16205:6;16196:15;;;;;;:::i;:::-;;;;;16240:2;16230:12;;;;16156:102;16285:6;16276:5;:15;16272:102;;16321:6;16312:15;;;;;;:::i;:::-;;;;;16356:2;16346:12;;;;16272:102;16401:6;16392:5;:15;16388:102;;16437:6;16428:15;;;;;;:::i;:::-;;;;;16472:2;16462:12;;;;16388:102;16517:5;16508;:14;16504:99;;16552:5;16543:14;;;;;;:::i;:::-;;;;;16586:1;16576:11;;;;16504:99;16630:5;16621;:14;16617:99;;16665:5;16656:14;;;;;;:::i;:::-;;;;;16699:1;16689:11;;;;16617:99;16743:5;16734;:14;16730:99;;16778:5;16769:14;;;;;;:::i;:::-;;;;;16812:1;16802:11;;;;16730:99;16856:5;16847;:14;16843:66;;16892:1;16882:11;;;;16843:66;16937:6;16930:13;;;16029:922;;;:::o;60025:159::-;;;;;:::o;65478:164::-;65582:10;:17;;;;65555:15;:24;65571:7;65555:24;;;;;;;;;;;:44;;;;65610:10;65626:7;65610:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65478:164;:::o;66269:988::-;66535:22;66585:1;66560:22;66577:4;66560:16;:22::i;:::-;:26;;;;:::i;:::-;66535:51;;66597:18;66618:17;:26;66636:7;66618:26;;;;;;;;;;;;66597:47;;66765:14;66751:10;:28;66747:328;;66796:19;66818:12;:18;66831:4;66818:18;;;;;;;;;;;;;;;:34;66837:14;66818:34;;;;;;;;;;;;66796:56;;66902:11;66869:12;:18;66882:4;66869:18;;;;;;;;;;;;;;;:30;66888:10;66869:30;;;;;;;;;;;:44;;;;67019:10;66986:17;:30;67004:11;66986:30;;;;;;;;;;;:43;;;;66781:294;66747:328;67171:17;:26;67189:7;67171:26;;;;;;;;;;;67164:33;;;67215:12;:18;67228:4;67215:18;;;;;;;;;;;;;;;:34;67234:14;67215:34;;;;;;;;;;;67208:41;;;66350:907;;66269:988;;:::o;67552:1079::-;67805:22;67850:1;67830:10;:17;;;;:21;;;;:::i;:::-;67805:46;;67862:18;67883:15;:24;67899:7;67883:24;;;;;;;;;;;;67862:45;;68234:19;68256:10;68267:14;68256:26;;;;;;;;:::i;:::-;;;;;;;;;;68234:48;;68320:11;68295:10;68306;68295:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;68431:10;68400:15;:28;68416:11;68400:28;;;;;;;;;;;:41;;;;68572:15;:24;68588:7;68572:24;;;;;;;;;;;68565:31;;;68607:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;67623:1008;;;67552:1079;:::o;65056:221::-;65141:14;65158:20;65175:2;65158:16;:20::i;:::-;65141:37;;65216:7;65189:12;:16;65202:2;65189:16;;;;;;;;;;;;;;;:24;65206:6;65189:24;;;;;;;;;;;:34;;;;65263:6;65234:17;:26;65252:7;65234:26;;;;;;;;;;;:35;;;;65130:147;65056:221;;:::o;52582:319::-;52711:18;52717:2;52721:7;52711:5;:18::i;:::-;52762:53;52793:1;52797:2;52801:7;52810:4;52762:22;:53::i;:::-;52740:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;52582:319;;;:::o;25883:326::-;25943:4;26200:1;26178:7;:19;;;:23;26171:30;;25883:326;;;:::o;53237:942::-;53331:1;53317:16;;:2;:16;;;;53309:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;53390:16;53398:7;53390;:16::i;:::-;53389:17;53381:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;53452:48;53481:1;53485:2;53489:7;53498:1;53452:20;:48::i;:::-;53599:16;53607:7;53599;:16::i;:::-;53598:17;53590:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;54014:1;53997:9;:13;54007:2;53997:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;54058:2;54039:7;:16;54047:7;54039:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;54103:7;54099:2;54078:33;;54095:1;54078:33;;;;;;;;;;;;54124:47;54152:1;54156:2;54160:7;54169:1;54124:19;:47::i;:::-;53237:942;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:143::-;1043:5;1074:6;1068:13;1059:22;;1090:33;1117:5;1090:33;:::i;:::-;986:143;;;;:::o;1152:568::-;1225:8;1235:6;1285:3;1278:4;1270:6;1266:17;1262:27;1252:122;;1293:79;;:::i;:::-;1252:122;1406:6;1393:20;1383:30;;1436:18;1428:6;1425:30;1422:117;;;1458:79;;:::i;:::-;1422:117;1572:4;1564:6;1560:17;1548:29;;1626:3;1618:4;1610:6;1606:17;1596:8;1592:32;1589:41;1586:128;;;1633:79;;:::i;:::-;1586:128;1152:568;;;;;:::o;1726:133::-;1769:5;1807:6;1794:20;1785:29;;1823:30;1847:5;1823:30;:::i;:::-;1726:133;;;;:::o;1865:137::-;1919:5;1950:6;1944:13;1935:22;;1966:30;1990:5;1966:30;:::i;:::-;1865:137;;;;:::o;2008:::-;2053:5;2091:6;2078:20;2069:29;;2107:32;2133:5;2107:32;:::i;:::-;2008:137;;;;:::o;2151:141::-;2207:5;2238:6;2232:13;2223:22;;2254:32;2280:5;2254:32;:::i;:::-;2151:141;;;;:::o;2311:338::-;2366:5;2415:3;2408:4;2400:6;2396:17;2392:27;2382:122;;2423:79;;:::i;:::-;2382:122;2540:6;2527:20;2565:78;2639:3;2631:6;2624:4;2616:6;2612:17;2565:78;:::i;:::-;2556:87;;2372:277;2311:338;;;;:::o;2669:340::-;2725:5;2774:3;2767:4;2759:6;2755:17;2751:27;2741:122;;2782:79;;:::i;:::-;2741:122;2899:6;2886:20;2924:79;2999:3;2991:6;2984:4;2976:6;2972:17;2924:79;:::i;:::-;2915:88;;2731:278;2669:340;;;;:::o;3015:139::-;3061:5;3099:6;3086:20;3077:29;;3115:33;3142:5;3115:33;:::i;:::-;3015:139;;;;:::o;3160:329::-;3219:6;3268:2;3256:9;3247:7;3243:23;3239:32;3236:119;;;3274:79;;:::i;:::-;3236:119;3394:1;3419:53;3464:7;3455:6;3444:9;3440:22;3419:53;:::i;:::-;3409:63;;3365:117;3160:329;;;;:::o;3495:351::-;3565:6;3614:2;3602:9;3593:7;3589:23;3585:32;3582:119;;;3620:79;;:::i;:::-;3582:119;3740:1;3765:64;3821:7;3812:6;3801:9;3797:22;3765:64;:::i;:::-;3755:74;;3711:128;3495:351;;;;:::o;3852:474::-;3920:6;3928;3977:2;3965:9;3956:7;3952:23;3948:32;3945:119;;;3983:79;;:::i;:::-;3945:119;4103:1;4128:53;4173:7;4164:6;4153:9;4149:22;4128:53;:::i;:::-;4118:63;;4074:117;4230:2;4256:53;4301:7;4292:6;4281:9;4277:22;4256:53;:::i;:::-;4246:63;;4201:118;3852:474;;;;;:::o;4332:619::-;4409:6;4417;4425;4474:2;4462:9;4453:7;4449:23;4445:32;4442:119;;;4480:79;;:::i;:::-;4442:119;4600:1;4625:53;4670:7;4661:6;4650:9;4646:22;4625:53;:::i;:::-;4615:63;;4571:117;4727:2;4753:53;4798:7;4789:6;4778:9;4774:22;4753:53;:::i;:::-;4743:63;;4698:118;4855:2;4881:53;4926:7;4917:6;4906:9;4902:22;4881:53;:::i;:::-;4871:63;;4826:118;4332:619;;;;;:::o;4957:943::-;5052:6;5060;5068;5076;5125:3;5113:9;5104:7;5100:23;5096:33;5093:120;;;5132:79;;:::i;:::-;5093:120;5252:1;5277:53;5322:7;5313:6;5302:9;5298:22;5277:53;:::i;:::-;5267:63;;5223:117;5379:2;5405:53;5450:7;5441:6;5430:9;5426:22;5405:53;:::i;:::-;5395:63;;5350:118;5507:2;5533:53;5578:7;5569:6;5558:9;5554:22;5533:53;:::i;:::-;5523:63;;5478:118;5663:2;5652:9;5648:18;5635:32;5694:18;5686:6;5683:30;5680:117;;;5716:79;;:::i;:::-;5680:117;5821:62;5875:7;5866:6;5855:9;5851:22;5821:62;:::i;:::-;5811:72;;5606:287;4957:943;;;;;;;:::o;5906:468::-;5971:6;5979;6028:2;6016:9;6007:7;6003:23;5999:32;5996:119;;;6034:79;;:::i;:::-;5996:119;6154:1;6179:53;6224:7;6215:6;6204:9;6200:22;6179:53;:::i;:::-;6169:63;;6125:117;6281:2;6307:50;6349:7;6340:6;6329:9;6325:22;6307:50;:::i;:::-;6297:60;;6252:115;5906:468;;;;;:::o;6380:474::-;6448:6;6456;6505:2;6493:9;6484:7;6480:23;6476:32;6473:119;;;6511:79;;:::i;:::-;6473:119;6631:1;6656:53;6701:7;6692:6;6681:9;6677:22;6656:53;:::i;:::-;6646:63;;6602:117;6758:2;6784:53;6829:7;6820:6;6809:9;6805:22;6784:53;:::i;:::-;6774:63;;6729:118;6380:474;;;;;:::o;6860:559::-;6946:6;6954;7003:2;6991:9;6982:7;6978:23;6974:32;6971:119;;;7009:79;;:::i;:::-;6971:119;7157:1;7146:9;7142:17;7129:31;7187:18;7179:6;7176:30;7173:117;;;7209:79;;:::i;:::-;7173:117;7322:80;7394:7;7385:6;7374:9;7370:22;7322:80;:::i;:::-;7304:98;;;;7100:312;6860:559;;;;;:::o;7425:323::-;7481:6;7530:2;7518:9;7509:7;7505:23;7501:32;7498:119;;;7536:79;;:::i;:::-;7498:119;7656:1;7681:50;7723:7;7714:6;7703:9;7699:22;7681:50;:::i;:::-;7671:60;;7627:114;7425:323;;;;:::o;7754:345::-;7821:6;7870:2;7858:9;7849:7;7845:23;7841:32;7838:119;;;7876:79;;:::i;:::-;7838:119;7996:1;8021:61;8074:7;8065:6;8054:9;8050:22;8021:61;:::i;:::-;8011:71;;7967:125;7754:345;;;;:::o;8105:327::-;8163:6;8212:2;8200:9;8191:7;8187:23;8183:32;8180:119;;;8218:79;;:::i;:::-;8180:119;8338:1;8363:52;8407:7;8398:6;8387:9;8383:22;8363:52;:::i;:::-;8353:62;;8309:116;8105:327;;;;:::o;8438:349::-;8507:6;8556:2;8544:9;8535:7;8531:23;8527:32;8524:119;;;8562:79;;:::i;:::-;8524:119;8682:1;8707:63;8762:7;8753:6;8742:9;8738:22;8707:63;:::i;:::-;8697:73;;8653:127;8438:349;;;;:::o;8793:509::-;8862:6;8911:2;8899:9;8890:7;8886:23;8882:32;8879:119;;;8917:79;;:::i;:::-;8879:119;9065:1;9054:9;9050:17;9037:31;9095:18;9087:6;9084:30;9081:117;;;9117:79;;:::i;:::-;9081:117;9222:63;9277:7;9268:6;9257:9;9253:22;9222:63;:::i;:::-;9212:73;;9008:287;8793:509;;;;:::o;9308:329::-;9367:6;9416:2;9404:9;9395:7;9391:23;9387:32;9384:119;;;9422:79;;:::i;:::-;9384:119;9542:1;9567:53;9612:7;9603:6;9592:9;9588:22;9567:53;:::i;:::-;9557:63;;9513:117;9308:329;;;;:::o;9643:468::-;9708:6;9716;9765:2;9753:9;9744:7;9740:23;9736:32;9733:119;;;9771:79;;:::i;:::-;9733:119;9891:1;9916:53;9961:7;9952:6;9941:9;9937:22;9916:53;:::i;:::-;9906:63;;9862:117;10018:2;10044:50;10086:7;10077:6;10066:9;10062:22;10044:50;:::i;:::-;10034:60;;9989:115;9643:468;;;;;:::o;10117:619::-;10194:6;10202;10210;10259:2;10247:9;10238:7;10234:23;10230:32;10227:119;;;10265:79;;:::i;:::-;10227:119;10385:1;10410:53;10455:7;10446:6;10435:9;10431:22;10410:53;:::i;:::-;10400:63;;10356:117;10512:2;10538:53;10583:7;10574:6;10563:9;10559:22;10538:53;:::i;:::-;10528:63;;10483:118;10640:2;10666:53;10711:7;10702:6;10691:9;10687:22;10666:53;:::i;:::-;10656:63;;10611:118;10117:619;;;;;:::o;10742:118::-;10829:24;10847:5;10829:24;:::i;:::-;10824:3;10817:37;10742:118;;:::o;10896:537::-;11024:3;11045:86;11124:6;11119:3;11045:86;:::i;:::-;11038:93;;11155:66;11147:6;11144:78;11141:165;;;11225:79;;:::i;:::-;11141:165;11337:4;11329:6;11325:17;11315:27;;11352:43;11388:6;11383:3;11376:5;11352:43;:::i;:::-;11420:6;11415:3;11411:16;11404:23;;10896:537;;;;;:::o;11439:109::-;11520:21;11535:5;11520:21;:::i;:::-;11515:3;11508:34;11439:109;;:::o;11554:360::-;11640:3;11668:38;11700:5;11668:38;:::i;:::-;11722:70;11785:6;11780:3;11722:70;:::i;:::-;11715:77;;11801:52;11846:6;11841:3;11834:4;11827:5;11823:16;11801:52;:::i;:::-;11878:29;11900:6;11878:29;:::i;:::-;11873:3;11869:39;11862:46;;11644:270;11554:360;;;;:::o;11920:364::-;12008:3;12036:39;12069:5;12036:39;:::i;:::-;12091:71;12155:6;12150:3;12091:71;:::i;:::-;12084:78;;12171:52;12216:6;12211:3;12204:4;12197:5;12193:16;12171:52;:::i;:::-;12248:29;12270:6;12248:29;:::i;:::-;12243:3;12239:39;12232:46;;12012:272;11920:364;;;;:::o;12290:377::-;12396:3;12424:39;12457:5;12424:39;:::i;:::-;12479:89;12561:6;12556:3;12479:89;:::i;:::-;12472:96;;12577:52;12622:6;12617:3;12610:4;12603:5;12599:16;12577:52;:::i;:::-;12654:6;12649:3;12645:16;12638:23;;12400:267;12290:377;;;;:::o;12673:366::-;12815:3;12836:67;12900:2;12895:3;12836:67;:::i;:::-;12829:74;;12912:93;13001:3;12912:93;:::i;:::-;13030:2;13025:3;13021:12;13014:19;;12673:366;;;:::o;13045:::-;13187:3;13208:67;13272:2;13267:3;13208:67;:::i;:::-;13201:74;;13284:93;13373:3;13284:93;:::i;:::-;13402:2;13397:3;13393:12;13386:19;;13045:366;;;:::o;13417:::-;13559:3;13580:67;13644:2;13639:3;13580:67;:::i;:::-;13573:74;;13656:93;13745:3;13656:93;:::i;:::-;13774:2;13769:3;13765:12;13758:19;;13417:366;;;:::o;13789:::-;13931:3;13952:67;14016:2;14011:3;13952:67;:::i;:::-;13945:74;;14028:93;14117:3;14028:93;:::i;:::-;14146:2;14141:3;14137:12;14130:19;;13789:366;;;:::o;14161:::-;14303:3;14324:67;14388:2;14383:3;14324:67;:::i;:::-;14317:74;;14400:93;14489:3;14400:93;:::i;:::-;14518:2;14513:3;14509:12;14502:19;;14161:366;;;:::o;14533:::-;14675:3;14696:67;14760:2;14755:3;14696:67;:::i;:::-;14689:74;;14772:93;14861:3;14772:93;:::i;:::-;14890:2;14885:3;14881:12;14874:19;;14533:366;;;:::o;14905:365::-;15047:3;15068:66;15132:1;15127:3;15068:66;:::i;:::-;15061:73;;15143:93;15232:3;15143:93;:::i;:::-;15261:2;15256:3;15252:12;15245:19;;14905:365;;;:::o;15276:366::-;15418:3;15439:67;15503:2;15498:3;15439:67;:::i;:::-;15432:74;;15515:93;15604:3;15515:93;:::i;:::-;15633:2;15628:3;15624:12;15617:19;;15276:366;;;:::o;15648:::-;15790:3;15811:67;15875:2;15870:3;15811:67;:::i;:::-;15804:74;;15887:93;15976:3;15887:93;:::i;:::-;16005:2;16000:3;15996:12;15989:19;;15648:366;;;:::o;16020:::-;16162:3;16183:67;16247:2;16242:3;16183:67;:::i;:::-;16176:74;;16259:93;16348:3;16259:93;:::i;:::-;16377:2;16372:3;16368:12;16361:19;;16020:366;;;:::o;16392:365::-;16534:3;16555:66;16619:1;16614:3;16555:66;:::i;:::-;16548:73;;16630:93;16719:3;16630:93;:::i;:::-;16748:2;16743:3;16739:12;16732:19;;16392:365;;;:::o;16763:366::-;16905:3;16926:67;16990:2;16985:3;16926:67;:::i;:::-;16919:74;;17002:93;17091:3;17002:93;:::i;:::-;17120:2;17115:3;17111:12;17104:19;;16763:366;;;:::o;17135:::-;17277:3;17298:67;17362:2;17357:3;17298:67;:::i;:::-;17291:74;;17374:93;17463:3;17374:93;:::i;:::-;17492:2;17487:3;17483:12;17476:19;;17135:366;;;:::o;17507:::-;17649:3;17670:67;17734:2;17729:3;17670:67;:::i;:::-;17663:74;;17746:93;17835:3;17746:93;:::i;:::-;17864:2;17859:3;17855:12;17848:19;;17507:366;;;:::o;17879:::-;18021:3;18042:67;18106:2;18101:3;18042:67;:::i;:::-;18035:74;;18118:93;18207:3;18118:93;:::i;:::-;18236:2;18231:3;18227:12;18220:19;;17879:366;;;:::o;18251:::-;18393:3;18414:67;18478:2;18473:3;18414:67;:::i;:::-;18407:74;;18490:93;18579:3;18490:93;:::i;:::-;18608:2;18603:3;18599:12;18592:19;;18251:366;;;:::o;18623:::-;18765:3;18786:67;18850:2;18845:3;18786:67;:::i;:::-;18779:74;;18862:93;18951:3;18862:93;:::i;:::-;18980:2;18975:3;18971:12;18964:19;;18623:366;;;:::o;18995:::-;19137:3;19158:67;19222:2;19217:3;19158:67;:::i;:::-;19151:74;;19234:93;19323:3;19234:93;:::i;:::-;19352:2;19347:3;19343:12;19336:19;;18995:366;;;:::o;19367:::-;19509:3;19530:67;19594:2;19589:3;19530:67;:::i;:::-;19523:74;;19606:93;19695:3;19606:93;:::i;:::-;19724:2;19719:3;19715:12;19708:19;;19367:366;;;:::o;19739:::-;19881:3;19902:67;19966:2;19961:3;19902:67;:::i;:::-;19895:74;;19978:93;20067:3;19978:93;:::i;:::-;20096:2;20091:3;20087:12;20080:19;;19739:366;;;:::o;20111:::-;20253:3;20274:67;20338:2;20333:3;20274:67;:::i;:::-;20267:74;;20350:93;20439:3;20350:93;:::i;:::-;20468:2;20463:3;20459:12;20452:19;;20111:366;;;:::o;20483:::-;20625:3;20646:67;20710:2;20705:3;20646:67;:::i;:::-;20639:74;;20722:93;20811:3;20722:93;:::i;:::-;20840:2;20835:3;20831:12;20824:19;;20483:366;;;:::o;20855:::-;20997:3;21018:67;21082:2;21077:3;21018:67;:::i;:::-;21011:74;;21094:93;21183:3;21094:93;:::i;:::-;21212:2;21207:3;21203:12;21196:19;;20855:366;;;:::o;21227:::-;21369:3;21390:67;21454:2;21449:3;21390:67;:::i;:::-;21383:74;;21466:93;21555:3;21466:93;:::i;:::-;21584:2;21579:3;21575:12;21568:19;;21227:366;;;:::o;21599:::-;21741:3;21762:67;21826:2;21821:3;21762:67;:::i;:::-;21755:74;;21838:93;21927:3;21838:93;:::i;:::-;21956:2;21951:3;21947:12;21940:19;;21599:366;;;:::o;21971:118::-;22058:24;22076:5;22058:24;:::i;:::-;22053:3;22046:37;21971:118;;:::o;22095:435::-;22275:3;22297:95;22388:3;22379:6;22297:95;:::i;:::-;22290:102;;22409:95;22500:3;22491:6;22409:95;:::i;:::-;22402:102;;22521:3;22514:10;;22095:435;;;;;:::o;22536:222::-;22629:4;22667:2;22656:9;22652:18;22644:26;;22680:71;22748:1;22737:9;22733:17;22724:6;22680:71;:::i;:::-;22536:222;;;;:::o;22764:442::-;22913:4;22951:2;22940:9;22936:18;22928:26;;22964:71;23032:1;23021:9;23017:17;23008:6;22964:71;:::i;:::-;23045:72;23113:2;23102:9;23098:18;23089:6;23045:72;:::i;:::-;23127;23195:2;23184:9;23180:18;23171:6;23127:72;:::i;:::-;22764:442;;;;;;:::o;23212:640::-;23407:4;23445:3;23434:9;23430:19;23422:27;;23459:71;23527:1;23516:9;23512:17;23503:6;23459:71;:::i;:::-;23540:72;23608:2;23597:9;23593:18;23584:6;23540:72;:::i;:::-;23622;23690:2;23679:9;23675:18;23666:6;23622:72;:::i;:::-;23741:9;23735:4;23731:20;23726:2;23715:9;23711:18;23704:48;23769:76;23840:4;23831:6;23769:76;:::i;:::-;23761:84;;23212:640;;;;;;;:::o;23858:393::-;24011:4;24049:2;24038:9;24034:18;24026:26;;24098:9;24092:4;24088:20;24084:1;24073:9;24069:17;24062:47;24126:118;24239:4;24230:6;24222;24126:118;:::i;:::-;24118:126;;23858:393;;;;;:::o;24257:210::-;24344:4;24382:2;24371:9;24367:18;24359:26;;24395:65;24457:1;24446:9;24442:17;24433:6;24395:65;:::i;:::-;24257:210;;;;:::o;24473:313::-;24586:4;24624:2;24613:9;24609:18;24601:26;;24673:9;24667:4;24663:20;24659:1;24648:9;24644:17;24637:47;24701:78;24774:4;24765:6;24701:78;:::i;:::-;24693:86;;24473:313;;;;:::o;24792:419::-;24958:4;24996:2;24985:9;24981:18;24973:26;;25045:9;25039:4;25035:20;25031:1;25020:9;25016:17;25009:47;25073:131;25199:4;25073:131;:::i;:::-;25065:139;;24792:419;;;:::o;25217:::-;25383:4;25421:2;25410:9;25406:18;25398:26;;25470:9;25464:4;25460:20;25456:1;25445:9;25441:17;25434:47;25498:131;25624:4;25498:131;:::i;:::-;25490:139;;25217:419;;;:::o;25642:::-;25808:4;25846:2;25835:9;25831:18;25823:26;;25895:9;25889:4;25885:20;25881:1;25870:9;25866:17;25859:47;25923:131;26049:4;25923:131;:::i;:::-;25915:139;;25642:419;;;:::o;26067:::-;26233:4;26271:2;26260:9;26256:18;26248:26;;26320:9;26314:4;26310:20;26306:1;26295:9;26291:17;26284:47;26348:131;26474:4;26348:131;:::i;:::-;26340:139;;26067:419;;;:::o;26492:::-;26658:4;26696:2;26685:9;26681:18;26673:26;;26745:9;26739:4;26735:20;26731:1;26720:9;26716:17;26709:47;26773:131;26899:4;26773:131;:::i;:::-;26765:139;;26492:419;;;:::o;26917:::-;27083:4;27121:2;27110:9;27106:18;27098:26;;27170:9;27164:4;27160:20;27156:1;27145:9;27141:17;27134:47;27198:131;27324:4;27198:131;:::i;:::-;27190:139;;26917:419;;;:::o;27342:::-;27508:4;27546:2;27535:9;27531:18;27523:26;;27595:9;27589:4;27585:20;27581:1;27570:9;27566:17;27559:47;27623:131;27749:4;27623:131;:::i;:::-;27615:139;;27342:419;;;:::o;27767:::-;27933:4;27971:2;27960:9;27956:18;27948:26;;28020:9;28014:4;28010:20;28006:1;27995:9;27991:17;27984:47;28048:131;28174:4;28048:131;:::i;:::-;28040:139;;27767:419;;;:::o;28192:::-;28358:4;28396:2;28385:9;28381:18;28373:26;;28445:9;28439:4;28435:20;28431:1;28420:9;28416:17;28409:47;28473:131;28599:4;28473:131;:::i;:::-;28465:139;;28192:419;;;:::o;28617:::-;28783:4;28821:2;28810:9;28806:18;28798:26;;28870:9;28864:4;28860:20;28856:1;28845:9;28841:17;28834:47;28898:131;29024:4;28898:131;:::i;:::-;28890:139;;28617:419;;;:::o;29042:::-;29208:4;29246:2;29235:9;29231:18;29223:26;;29295:9;29289:4;29285:20;29281:1;29270:9;29266:17;29259:47;29323:131;29449:4;29323:131;:::i;:::-;29315:139;;29042:419;;;:::o;29467:::-;29633:4;29671:2;29660:9;29656:18;29648:26;;29720:9;29714:4;29710:20;29706:1;29695:9;29691:17;29684:47;29748:131;29874:4;29748:131;:::i;:::-;29740:139;;29467:419;;;:::o;29892:::-;30058:4;30096:2;30085:9;30081:18;30073:26;;30145:9;30139:4;30135:20;30131:1;30120:9;30116:17;30109:47;30173:131;30299:4;30173:131;:::i;:::-;30165:139;;29892:419;;;:::o;30317:::-;30483:4;30521:2;30510:9;30506:18;30498:26;;30570:9;30564:4;30560:20;30556:1;30545:9;30541:17;30534:47;30598:131;30724:4;30598:131;:::i;:::-;30590:139;;30317:419;;;:::o;30742:::-;30908:4;30946:2;30935:9;30931:18;30923:26;;30995:9;30989:4;30985:20;30981:1;30970:9;30966:17;30959:47;31023:131;31149:4;31023:131;:::i;:::-;31015:139;;30742:419;;;:::o;31167:::-;31333:4;31371:2;31360:9;31356:18;31348:26;;31420:9;31414:4;31410:20;31406:1;31395:9;31391:17;31384:47;31448:131;31574:4;31448:131;:::i;:::-;31440:139;;31167:419;;;:::o;31592:::-;31758:4;31796:2;31785:9;31781:18;31773:26;;31845:9;31839:4;31835:20;31831:1;31820:9;31816:17;31809:47;31873:131;31999:4;31873:131;:::i;:::-;31865:139;;31592:419;;;:::o;32017:::-;32183:4;32221:2;32210:9;32206:18;32198:26;;32270:9;32264:4;32260:20;32256:1;32245:9;32241:17;32234:47;32298:131;32424:4;32298:131;:::i;:::-;32290:139;;32017:419;;;:::o;32442:::-;32608:4;32646:2;32635:9;32631:18;32623:26;;32695:9;32689:4;32685:20;32681:1;32670:9;32666:17;32659:47;32723:131;32849:4;32723:131;:::i;:::-;32715:139;;32442:419;;;:::o;32867:::-;33033:4;33071:2;33060:9;33056:18;33048:26;;33120:9;33114:4;33110:20;33106:1;33095:9;33091:17;33084:47;33148:131;33274:4;33148:131;:::i;:::-;33140:139;;32867:419;;;:::o;33292:::-;33458:4;33496:2;33485:9;33481:18;33473:26;;33545:9;33539:4;33535:20;33531:1;33520:9;33516:17;33509:47;33573:131;33699:4;33573:131;:::i;:::-;33565:139;;33292:419;;;:::o;33717:::-;33883:4;33921:2;33910:9;33906:18;33898:26;;33970:9;33964:4;33960:20;33956:1;33945:9;33941:17;33934:47;33998:131;34124:4;33998:131;:::i;:::-;33990:139;;33717:419;;;:::o;34142:::-;34308:4;34346:2;34335:9;34331:18;34323:26;;34395:9;34389:4;34385:20;34381:1;34370:9;34366:17;34359:47;34423:131;34549:4;34423:131;:::i;:::-;34415:139;;34142:419;;;:::o;34567:::-;34733:4;34771:2;34760:9;34756:18;34748:26;;34820:9;34814:4;34810:20;34806:1;34795:9;34791:17;34784:47;34848:131;34974:4;34848:131;:::i;:::-;34840:139;;34567:419;;;:::o;34992:::-;35158:4;35196:2;35185:9;35181:18;35173:26;;35245:9;35239:4;35235:20;35231:1;35220:9;35216:17;35209:47;35273:131;35399:4;35273:131;:::i;:::-;35265:139;;34992:419;;;:::o;35417:222::-;35510:4;35548:2;35537:9;35533:18;35525:26;;35561:71;35629:1;35618:9;35614:17;35605:6;35561:71;:::i;:::-;35417:222;;;;:::o;35645:129::-;35679:6;35706:20;;:::i;:::-;35696:30;;35735:33;35763:4;35755:6;35735:33;:::i;:::-;35645:129;;;:::o;35780:75::-;35813:6;35846:2;35840:9;35830:19;;35780:75;:::o;35861:307::-;35922:4;36012:18;36004:6;36001:30;35998:56;;;36034:18;;:::i;:::-;35998:56;36072:29;36094:6;36072:29;:::i;:::-;36064:37;;36156:4;36150;36146:15;36138:23;;35861:307;;;:::o;36174:308::-;36236:4;36326:18;36318:6;36315:30;36312:56;;;36348:18;;:::i;:::-;36312:56;36386:29;36408:6;36386:29;:::i;:::-;36378:37;;36470:4;36464;36460:15;36452:23;;36174:308;;;:::o;36488:98::-;36539:6;36573:5;36567:12;36557:22;;36488:98;;;:::o;36592:99::-;36644:6;36678:5;36672:12;36662:22;;36592:99;;;:::o;36697:184::-;36796:11;36830:6;36825:3;36818:19;36870:4;36865:3;36861:14;36846:29;;36697:184;;;;:::o;36887:168::-;36970:11;37004:6;36999:3;36992:19;37044:4;37039:3;37035:14;37020:29;;36887:168;;;;:::o;37061:169::-;37145:11;37179:6;37174:3;37167:19;37219:4;37214:3;37210:14;37195:29;;37061:169;;;;:::o;37236:148::-;37338:11;37375:3;37360:18;;37236:148;;;;:::o;37390:305::-;37430:3;37449:20;37467:1;37449:20;:::i;:::-;37444:25;;37483:20;37501:1;37483:20;:::i;:::-;37478:25;;37637:1;37569:66;37565:74;37562:1;37559:81;37556:107;;;37643:18;;:::i;:::-;37556:107;37687:1;37684;37680:9;37673:16;;37390:305;;;;:::o;37701:348::-;37741:7;37764:20;37782:1;37764:20;:::i;:::-;37759:25;;37798:20;37816:1;37798:20;:::i;:::-;37793:25;;37986:1;37918:66;37914:74;37911:1;37908:81;37903:1;37896:9;37889:17;37885:105;37882:131;;;37993:18;;:::i;:::-;37882:131;38041:1;38038;38034:9;38023:20;;37701:348;;;;:::o;38055:191::-;38095:4;38115:20;38133:1;38115:20;:::i;:::-;38110:25;;38149:20;38167:1;38149:20;:::i;:::-;38144:25;;38188:1;38185;38182:8;38179:34;;;38193:18;;:::i;:::-;38179:34;38238:1;38235;38231:9;38223:17;;38055:191;;;;:::o;38252:96::-;38289:7;38318:24;38336:5;38318:24;:::i;:::-;38307:35;;38252:96;;;:::o;38354:90::-;38388:7;38431:5;38424:13;38417:21;38406:32;;38354:90;;;:::o;38450:149::-;38486:7;38526:66;38519:5;38515:78;38504:89;;38450:149;;;:::o;38605:126::-;38642:7;38682:42;38675:5;38671:54;38660:65;;38605:126;;;:::o;38737:77::-;38774:7;38803:5;38792:16;;38737:77;;;:::o;38820:154::-;38904:6;38899:3;38894;38881:30;38966:1;38957:6;38952:3;38948:16;38941:27;38820:154;;;:::o;38980:307::-;39048:1;39058:113;39072:6;39069:1;39066:13;39058:113;;;39157:1;39152:3;39148:11;39142:18;39138:1;39133:3;39129:11;39122:39;39094:2;39091:1;39087:10;39082:15;;39058:113;;;39189:6;39186:1;39183:13;39180:101;;;39269:1;39260:6;39255:3;39251:16;39244:27;39180:101;39029:258;38980:307;;;:::o;39293:320::-;39337:6;39374:1;39368:4;39364:12;39354:22;;39421:1;39415:4;39411:12;39442:18;39432:81;;39498:4;39490:6;39486:17;39476:27;;39432:81;39560:2;39552:6;39549:14;39529:18;39526:38;39523:84;;;39579:18;;:::i;:::-;39523:84;39344:269;39293:320;;;:::o;39619:281::-;39702:27;39724:4;39702:27;:::i;:::-;39694:6;39690:40;39832:6;39820:10;39817:22;39796:18;39784:10;39781:34;39778:62;39775:88;;;39843:18;;:::i;:::-;39775:88;39883:10;39879:2;39872:22;39662:238;39619:281;;:::o;39906:233::-;39945:3;39968:24;39986:5;39968:24;:::i;:::-;39959:33;;40014:66;40007:5;40004:77;40001:103;;;40084:18;;:::i;:::-;40001:103;40131:1;40124:5;40120:13;40113:20;;39906:233;;;:::o;40145:180::-;40193:77;40190:1;40183:88;40290:4;40287:1;40280:15;40314:4;40311:1;40304:15;40331:180;40379:77;40376:1;40369:88;40476:4;40473:1;40466:15;40500:4;40497:1;40490:15;40517:180;40565:77;40562:1;40555:88;40662:4;40659:1;40652:15;40686:4;40683:1;40676:15;40703:180;40751:77;40748:1;40741:88;40848:4;40845:1;40838:15;40872:4;40869:1;40862:15;40889:180;40937:77;40934:1;40927:88;41034:4;41031:1;41024:15;41058:4;41055:1;41048:15;41075:180;41123:77;41120:1;41113:88;41220:4;41217:1;41210:15;41244:4;41241:1;41234:15;41261:117;41370:1;41367;41360:12;41384:117;41493:1;41490;41483:12;41507:117;41616:1;41613;41606:12;41630:117;41739:1;41736;41729:12;41753:117;41862:1;41859;41852:12;41876:117;41985:1;41982;41975:12;41999:117;42108:1;42105;42098:12;42122:102;42163:6;42214:2;42210:7;42205:2;42198:5;42194:14;42190:28;42180:38;;42122:102;;;:::o;42230:232::-;42370:34;42366:1;42358:6;42354:14;42347:58;42439:15;42434:2;42426:6;42422:15;42415:40;42230:232;:::o;42468:230::-;42608:34;42604:1;42596:6;42592:14;42585:58;42677:13;42672:2;42664:6;42660:15;42653:38;42468:230;:::o;42704:237::-;42844:34;42840:1;42832:6;42828:14;42821:58;42913:20;42908:2;42900:6;42896:15;42889:45;42704:237;:::o;42947:225::-;43087:34;43083:1;43075:6;43071:14;43064:58;43156:8;43151:2;43143:6;43139:15;43132:33;42947:225;:::o;43178:224::-;43318:34;43314:1;43306:6;43302:14;43295:58;43387:7;43382:2;43374:6;43370:15;43363:32;43178:224;:::o;43408:178::-;43548:30;43544:1;43536:6;43532:14;43525:54;43408:178;:::o;43592:159::-;43732:11;43728:1;43720:6;43716:14;43709:35;43592:159;:::o;43757:160::-;43897:12;43893:1;43885:6;43881:14;43874:36;43757:160;:::o;43923:223::-;44063:34;44059:1;44051:6;44047:14;44040:58;44132:6;44127:2;44119:6;44115:15;44108:31;43923:223;:::o;44152:175::-;44292:27;44288:1;44280:6;44276:14;44269:51;44152:175;:::o;44333:158::-;44473:10;44469:1;44461:6;44457:14;44450:34;44333:158;:::o;44497:174::-;44637:26;44633:1;44625:6;44621:14;44614:50;44497:174;:::o;44677:228::-;44817:34;44813:1;44805:6;44801:14;44794:58;44886:11;44881:2;44873:6;44869:15;44862:36;44677:228;:::o;44911:182::-;45051:34;45047:1;45039:6;45035:14;45028:58;44911:182;:::o;45099:::-;45239:34;45235:1;45227:6;45223:14;45216:58;45099:182;:::o;45287:166::-;45427:18;45423:1;45415:6;45411:14;45404:42;45287:166;:::o;45459:165::-;45599:17;45595:1;45587:6;45583:14;45576:41;45459:165;:::o;45630:174::-;45770:26;45766:1;45758:6;45754:14;45747:50;45630:174;:::o;45810:220::-;45950:34;45946:1;45938:6;45934:14;45927:58;46019:3;46014:2;46006:6;46002:15;45995:28;45810:220;:::o;46036:164::-;46176:16;46172:1;46164:6;46160:14;46153:40;46036:164;:::o;46206:248::-;46346:34;46342:1;46334:6;46330:14;46323:58;46415:31;46410:2;46402:6;46398:15;46391:56;46206:248;:::o;46460:231::-;46600:34;46596:1;46588:6;46584:14;46577:58;46669:14;46664:2;46656:6;46652:15;46645:39;46460:231;:::o;46697:240::-;46837:34;46833:1;46825:6;46821:14;46814:58;46906:23;46901:2;46893:6;46889:15;46882:48;46697:240;:::o;46943:181::-;47083:33;47079:1;47071:6;47067:14;47060:57;46943:181;:::o;47130:235::-;47270:34;47266:1;47258:6;47254:14;47247:58;47339:18;47334:2;47326:6;47322:15;47315:43;47130:235;:::o;47371:122::-;47444:24;47462:5;47444:24;:::i;:::-;47437:5;47434:35;47424:63;;47483:1;47480;47473:12;47424:63;47371:122;:::o;47499:116::-;47569:21;47584:5;47569:21;:::i;:::-;47562:5;47559:32;47549:60;;47605:1;47602;47595:12;47549:60;47499:116;:::o;47621:120::-;47693:23;47710:5;47693:23;:::i;:::-;47686:5;47683:34;47673:62;;47731:1;47728;47721:12;47673:62;47621:120;:::o;47747:122::-;47820:24;47838:5;47820:24;:::i;:::-;47813:5;47810:35;47800:63;;47859:1;47856;47849:12;47800:63;47747:122;:::o
Swarm Source
ipfs://560b1a33e082559e72bf9c54f5c4b87fc3d4cb1a7192a91b6a112a1bfd2a4514
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | Ether (ETH) | 100.00% | $3,257.77 | 0.005 | $16.29 |
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.