Token BingoNFT
Overview CRC721
Total Supply:
45 BNFT
Holders:
6 addresses
Contract:
Balance
20 BNFT
[ Download CSV Export ]
[ Download CSV Export ]
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
BingoNFT
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at cronoscan.com on 2023-01-15 */ // 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/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.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _ownerOf(tokenId); require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner or approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _safeTransfer(from, to, tokenId, data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist */ function _ownerOf(uint256 tokenId) internal view virtual returns (address) { return _owners[tokenId]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _ownerOf(tokenId) != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId, 1); // Check that tokenId was not minted by `_beforeTokenTransfer` hook require(!_exists(tokenId), "ERC721: token already minted"); unchecked { // Will not overflow unless all 2**256 token ids are minted to the same owner. // Given that tokens are minted one by one, it is impossible in practice that // this ever happens. Might change if we allow batch minting. // The ERC fails to describe this case. _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId, 1); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * This is an internal function that does not check if the sender is authorized to operate on the token. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId, 1); // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook owner = ERC721.ownerOf(tokenId); // Clear approvals delete _tokenApprovals[tokenId]; unchecked { // Cannot overflow, as that would require more tokens to be burned/transferred // out than the owner initially received through minting and transferring in. _balances[owner] -= 1; } delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId, 1); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId, 1); // Check that tokenId was not transferred by `_beforeTokenTransfer` hook require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); // Clear approvals from the previous owner delete _tokenApprovals[tokenId]; unchecked { // `_balances[from]` cannot overflow for the same reason as described in `_burn`: // `from`'s balance is the number of token held, which is at least one before the current // transfer. // `_balances[to]` could overflow in the conditions described in `_mint`. That would require // all 2**256 token ids to be minted, which in practice is impossible. _balances[from] -= 1; _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`. * - When `from` is zero, the tokens will be minted for `to`. * - When `to` is zero, ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256, /* firstTokenId */ uint256 batchSize ) internal virtual { if (batchSize > 1) { if (from != address(0)) { _balances[from] -= batchSize; } if (to != address(0)) { _balances[to] += batchSize; } } } /** * @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 {} } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Burnable.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/extensions/ERC721Burnable.sol) pragma solidity ^0.8.0; /** * @title ERC721 Burnable Token * @dev ERC721 Token that can be burned (destroyed). */ abstract contract ERC721Burnable is Context, ERC721 { /** * @dev Burns `tokenId`. See {ERC721-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _burn(tokenId); } } // 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/Cromunds.sol pragma solidity >=0.7.0 <0.9.0; contract BingoNFT is ERC721Enumerable, ERC721Burnable, Ownable { using Strings for uint256; IERC20 public tokenAddress; string baseURI; string public baseExtension = ".json"; uint256 public cost = 20 ether; uint256 public maxSupply = 10000; uint256 public maxMintAmount = 20; bool public paused = false; bool public revealed = false; string public notRevealedUri; uint256 public rate = 250 * 10**18; constructor( string memory _initBaseURI, string memory _initNotRevealedUri, address _tokenAddress ) ERC721("BingoNFT", "BNFT") { setBaseURI(_initBaseURI); setNotRevealedURI(_initNotRevealedUri); tokenAddress = IERC20(_tokenAddress); } // internal function _baseURI() internal view virtual override returns (string memory) { return baseURI; } // The following functions are overrides required by Solidity. function _beforeTokenTransfer( address from, address to, uint256 tokenId, uint256 batchSize ) internal override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId, batchSize); } function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } // public function mint(uint256 _mintAmount) public { uint256 supply = totalSupply(); require(!paused); require(_mintAmount > 0); require(_mintAmount <= maxMintAmount); require(supply + _mintAmount <= maxSupply); if (msg.sender != owner()) { tokenAddress.transferFrom(msg.sender, address(this), rate); } for (uint256 i = 1; i <= _mintAmount; i++) { _safeMint(msg.sender, supply + i); } } function walletOfOwner(address _owner) public view returns (uint256[] memory) { uint256 ownerTokenCount = balanceOf(_owner); uint256[] memory tokenIds = new uint256[](ownerTokenCount); for (uint256 i; i < ownerTokenCount; i++) { tokenIds[i] = tokenOfOwnerByIndex(_owner, i); } return tokenIds; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); if (revealed == false) { return notRevealedUri; } string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string( abi.encodePacked( currentBaseURI, tokenId.toString(), baseExtension ) ) : ""; } //only owner function reveal() public onlyOwner { revealed = true; } function setCost(uint256 _newCost) public onlyOwner { cost = _newCost; } function setmaxMintAmount(uint256 _newmaxMintAmount) public onlyOwner { maxMintAmount = _newmaxMintAmount; } function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner { notRevealedUri = _notRevealedURI; } function setBaseURI(string memory _newBaseURI) public onlyOwner { baseURI = _newBaseURI; } function setBaseExtension(string memory _newBaseExtension) public onlyOwner { baseExtension = _newBaseExtension; } function pause(bool _state) public onlyOwner { paused = _state; } function withdraw() public payable onlyOwner { (bool os, ) = payable(owner()).call{value: address(this).balance}(""); require(os); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"string","name":"_initNotRevealedUri","type":"string"},{"internalType":"address","name":"_tokenAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"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":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","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":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newmaxMintAmount","type":"uint256"}],"name":"setmaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenAddress","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"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":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600d908051906020019062000051929190620003ed565b506801158e460913d00000600e55612710600f5560146010556000601160006101000a81548160ff0219169083151502179055506000601160016101000a81548160ff021916908315150217905550680d8d726b7177a80000601355348015620000ba57600080fd5b5060405162004d9f38038062004d9f8339818101604052810190620000e0919062000532565b6040518060400160405280600881526020017f42696e676f4e46540000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f424e465400000000000000000000000000000000000000000000000000000000815250816000908051906020019062000164929190620003ed565b5080600190805190602001906200017d929190620003ed565b505050620001a0620001946200020c60201b60201c565b6200021460201b60201c565b620001b183620002da60201b60201c565b620001c2826200030660201b60201c565b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505062000821565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002ea6200033260201b60201c565b80600c908051906020019062000302929190620003ed565b5050565b620003166200033260201b60201c565b80601290805190602001906200032e929190620003ed565b5050565b620003426200020c60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000368620003c360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620003c1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003b890620005f3565b60405180910390fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620003fb90620006ef565b90600052602060002090601f0160209004810192826200041f57600085556200046b565b82601f106200043a57805160ff19168380011785556200046b565b828001600101855582156200046b579182015b828111156200046a5782518255916020019190600101906200044d565b5b5090506200047a91906200047e565b5090565b5b80821115620004995760008160009055506001016200047f565b5090565b6000620004b4620004ae846200063e565b62000615565b905082815260208101848484011115620004d357620004d2620007be565b5b620004e0848285620006b9565b509392505050565b600081519050620004f98162000807565b92915050565b600082601f830112620005175762000516620007b9565b5b8151620005298482602086016200049d565b91505092915050565b6000806000606084860312156200054e576200054d620007c8565b5b600084015167ffffffffffffffff8111156200056f576200056e620007c3565b5b6200057d86828701620004ff565b935050602084015167ffffffffffffffff811115620005a157620005a0620007c3565b5b620005af86828701620004ff565b9250506040620005c286828701620004e8565b9150509250925092565b6000620005db60208362000674565b9150620005e882620007de565b602082019050919050565b600060208201905081810360008301526200060e81620005cc565b9050919050565b60006200062162000634565b90506200062f828262000725565b919050565b6000604051905090565b600067ffffffffffffffff8211156200065c576200065b6200078a565b5b6200066782620007cd565b9050602081019050919050565b600082825260208201905092915050565b6000620006928262000699565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60005b83811015620006d9578082015181840152602081019050620006bc565b83811115620006e9576000848401525b50505050565b600060028204905060018216806200070857607f821691505b602082108114156200071f576200071e6200075b565b5b50919050565b6200073082620007cd565b810181811067ffffffffffffffff821117156200075257620007516200078a565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b620008128162000685565b81146200081e57600080fd5b50565b61456e80620008316000396000f3fe6080604052600436106102305760003560e01c806355f804b31161012e578063a22cb465116100ab578063d5abeb011161006f578063d5abeb011461081c578063da3ef23f14610847578063e985e9c514610870578063f2c4ce1e146108ad578063f2fde38b146108d657610230565b8063a22cb4651461074b578063a475b5dd14610774578063b88d4fde1461078b578063c6682862146107b4578063c87b56dd146107df57610230565b80637f00c7a6116100f25780637f00c7a6146106785780638da5cb5b146106a157806395d89b41146106cc5780639d76ea58146106f7578063a0712d681461072257610230565b806355f804b3146105935780635c975abb146105bc5780636352211e146105e757806370a0823114610624578063715018a61461066157610230565b806323b872dd116101bc57806342966c681161018057806342966c681461049c578063438b6300146104c557806344a0d68a146105025780634f6ccce71461052b578063518302271461056857610230565b806323b872dd146103d85780632c4e722e146104015780632f745c591461042c5780633ccfd60b1461046957806342842e0e1461047357610230565b8063081c8c4411610203578063081c8c4414610303578063095ea7b31461032e57806313faede61461035757806318160ddd14610382578063239c70ae146103ad57610230565b806301ffc9a71461023557806302329a291461027257806306fdde031461029b578063081812fc146102c6575b600080fd5b34801561024157600080fd5b5061025c60048036038101906102579190613312565b6108ff565b6040516102699190613941565b60405180910390f35b34801561027e57600080fd5b50610299600480360381019061029491906132b8565b610911565b005b3480156102a757600080fd5b506102b0610936565b6040516102bd9190613977565b60405180910390f35b3480156102d257600080fd5b506102ed60048036038101906102e891906133b5565b6109c8565b6040516102fa9190613881565b60405180910390f35b34801561030f57600080fd5b50610318610a0e565b6040516103259190613977565b60405180910390f35b34801561033a57600080fd5b5061035560048036038101906103509190613278565b610a9c565b005b34801561036357600080fd5b5061036c610bb4565b6040516103799190613bb9565b60405180910390f35b34801561038e57600080fd5b50610397610bba565b6040516103a49190613bb9565b60405180910390f35b3480156103b957600080fd5b506103c2610bc7565b6040516103cf9190613bb9565b60405180910390f35b3480156103e457600080fd5b506103ff60048036038101906103fa9190613162565b610bcd565b005b34801561040d57600080fd5b50610416610c2d565b6040516104239190613bb9565b60405180910390f35b34801561043857600080fd5b50610453600480360381019061044e9190613278565b610c33565b6040516104609190613bb9565b60405180910390f35b610471610cd8565b005b34801561047f57600080fd5b5061049a60048036038101906104959190613162565b610d60565b005b3480156104a857600080fd5b506104c360048036038101906104be91906133b5565b610d80565b005b3480156104d157600080fd5b506104ec60048036038101906104e791906130f5565b610ddc565b6040516104f9919061391f565b60405180910390f35b34801561050e57600080fd5b50610529600480360381019061052491906133b5565b610e8a565b005b34801561053757600080fd5b50610552600480360381019061054d91906133b5565b610e9c565b60405161055f9190613bb9565b60405180910390f35b34801561057457600080fd5b5061057d610f0d565b60405161058a9190613941565b60405180910390f35b34801561059f57600080fd5b506105ba60048036038101906105b5919061336c565b610f20565b005b3480156105c857600080fd5b506105d1610f42565b6040516105de9190613941565b60405180910390f35b3480156105f357600080fd5b5061060e600480360381019061060991906133b5565b610f55565b60405161061b9190613881565b60405180910390f35b34801561063057600080fd5b5061064b600480360381019061064691906130f5565b610fdc565b6040516106589190613bb9565b60405180910390f35b34801561066d57600080fd5b50610676611094565b005b34801561068457600080fd5b5061069f600480360381019061069a91906133b5565b6110a8565b005b3480156106ad57600080fd5b506106b66110ba565b6040516106c39190613881565b60405180910390f35b3480156106d857600080fd5b506106e16110e4565b6040516106ee9190613977565b60405180910390f35b34801561070357600080fd5b5061070c611176565b604051610719919061395c565b60405180910390f35b34801561072e57600080fd5b50610749600480360381019061074491906133b5565b61119c565b005b34801561075757600080fd5b50610772600480360381019061076d9190613238565b611322565b005b34801561078057600080fd5b50610789611338565b005b34801561079757600080fd5b506107b260048036038101906107ad91906131b5565b61135d565b005b3480156107c057600080fd5b506107c96113bf565b6040516107d69190613977565b60405180910390f35b3480156107eb57600080fd5b50610806600480360381019061080191906133b5565b61144d565b6040516108139190613977565b60405180910390f35b34801561082857600080fd5b506108316115a6565b60405161083e9190613bb9565b60405180910390f35b34801561085357600080fd5b5061086e6004803603810190610869919061336c565b6115ac565b005b34801561087c57600080fd5b5061089760048036038101906108929190613122565b6115ce565b6040516108a49190613941565b60405180910390f35b3480156108b957600080fd5b506108d460048036038101906108cf919061336c565b611662565b005b3480156108e257600080fd5b506108fd60048036038101906108f891906130f5565b611684565b005b600061090a82611708565b9050919050565b610919611782565b80601160006101000a81548160ff02191690831515021790555050565b60606000805461094590613e6d565b80601f016020809104026020016040519081016040528092919081815260200182805461097190613e6d565b80156109be5780601f10610993576101008083540402835291602001916109be565b820191906000526020600020905b8154815290600101906020018083116109a157829003601f168201915b5050505050905090565b60006109d382611800565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60128054610a1b90613e6d565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4790613e6d565b8015610a945780601f10610a6957610100808354040283529160200191610a94565b820191906000526020600020905b815481529060010190602001808311610a7757829003601f168201915b505050505081565b6000610aa782610f55565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0f90613b39565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b3761184b565b73ffffffffffffffffffffffffffffffffffffffff161480610b665750610b6581610b6061184b565b6115ce565b5b610ba5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9c90613b59565b60405180910390fd5b610baf8383611853565b505050565b600e5481565b6000600880549050905090565b60105481565b610bde610bd861184b565b8261190c565b610c1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1490613999565b60405180910390fd5b610c288383836119a1565b505050565b60135481565b6000610c3e83610fdc565b8210610c7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c76906139b9565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610ce0611782565b6000610cea6110ba565b73ffffffffffffffffffffffffffffffffffffffff1647604051610d0d9061386c565b60006040518083038185875af1925050503d8060008114610d4a576040519150601f19603f3d011682016040523d82523d6000602084013e610d4f565b606091505b5050905080610d5d57600080fd5b50565b610d7b8383836040518060200160405280600081525061135d565b505050565b610d91610d8b61184b565b8261190c565b610dd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc790613999565b60405180910390fd5b610dd981611c9b565b50565b60606000610de983610fdc565b905060008167ffffffffffffffff811115610e0757610e06614004565b5b604051908082528060200260200182016040528015610e355781602001602082028036833780820191505090505b50905060005b82811015610e7f57610e4d8582610c33565b828281518110610e6057610e5f613fd5565b5b6020026020010181815250508080610e7790613ed0565b915050610e3b565b508092505050919050565b610e92611782565b80600e8190555050565b6000610ea6610bba565b8210610ee7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ede90613b79565b60405180910390fd5b60088281548110610efb57610efa613fd5565b5b90600052602060002001549050919050565b601160019054906101000a900460ff1681565b610f28611782565b80600c9080519060200190610f3e929190612ef4565b5050565b601160009054906101000a900460ff1681565b600080610f6183611de9565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610fd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fca90613b19565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561104d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104490613a99565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61109c611782565b6110a66000611e26565b565b6110b0611782565b8060108190555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546110f390613e6d565b80601f016020809104026020016040519081016040528092919081815260200182805461111f90613e6d565b801561116c5780601f106111415761010080835404028352916020019161116c565b820191906000526020600020905b81548152906001019060200180831161114f57829003601f168201915b5050505050905090565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006111a6610bba565b9050601160009054906101000a900460ff16156111c257600080fd5b600082116111cf57600080fd5b6010548211156111de57600080fd5b600f5482826111ed9190613cf7565b11156111f857600080fd5b6112006110ba565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146112e757600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33306013546040518463ffffffff1660e01b81526004016112939392919061389c565b602060405180830381600087803b1580156112ad57600080fd5b505af11580156112c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e591906132e5565b505b6000600190505b82811161131d5761130a3382846113059190613cf7565b611eec565b808061131590613ed0565b9150506112ee565b505050565b61133461132d61184b565b8383611f0a565b5050565b611340611782565b6001601160016101000a81548160ff021916908315150217905550565b61136e61136861184b565b8361190c565b6113ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a490613999565b60405180910390fd5b6113b984848484612077565b50505050565b600d80546113cc90613e6d565b80601f01602080910402602001604051908101604052809291908181526020018280546113f890613e6d565b80156114455780601f1061141a57610100808354040283529160200191611445565b820191906000526020600020905b81548152906001019060200180831161142857829003601f168201915b505050505081565b6060611458826120d3565b611497576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148e90613af9565b60405180910390fd5b60001515601160019054906101000a900460ff161515141561154557601280546114c090613e6d565b80601f01602080910402602001604051908101604052809291908181526020018280546114ec90613e6d565b80156115395780601f1061150e57610100808354040283529160200191611539565b820191906000526020600020905b81548152906001019060200180831161151c57829003601f168201915b505050505090506115a1565b600061154f612114565b9050600081511161156f576040518060200160405280600081525061159d565b80611579846121a6565b600d60405160200161158d9392919061383b565b6040516020818303038152906040525b9150505b919050565b600f5481565b6115b4611782565b80600d90805190602001906115ca929190612ef4565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61166a611782565b8060129080519060200190611680929190612ef4565b5050565b61168c611782565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156116fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f3906139f9565b60405180910390fd5b61170581611e26565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061177b575061177a8261227e565b5b9050919050565b61178a61184b565b73ffffffffffffffffffffffffffffffffffffffff166117a86110ba565b73ffffffffffffffffffffffffffffffffffffffff16146117fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f590613ad9565b60405180910390fd5b565b611809816120d3565b611848576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183f90613b19565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166118c683610f55565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061191883610f55565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061195a575061195981856115ce565b5b8061199857508373ffffffffffffffffffffffffffffffffffffffff16611980846109c8565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166119c182610f55565b73ffffffffffffffffffffffffffffffffffffffff1614611a17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0e90613a19565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7e90613a59565b60405180910390fd5b611a948383836001612360565b8273ffffffffffffffffffffffffffffffffffffffff16611ab482610f55565b73ffffffffffffffffffffffffffffffffffffffff1614611b0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0190613a19565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611c968383836001612372565b505050565b6000611ca682610f55565b9050611cb6816000846001612360565b611cbf82610f55565b90506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611de5816000846001612372565b5050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611f06828260405180602001604052806000815250612378565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611f79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7090613a79565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161206a9190613941565b60405180910390a3505050565b6120828484846119a1565b61208e848484846123d3565b6120cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c4906139d9565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff166120f583611de9565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600c805461212390613e6d565b80601f016020809104026020016040519081016040528092919081815260200182805461214f90613e6d565b801561219c5780601f106121715761010080835404028352916020019161219c565b820191906000526020600020905b81548152906001019060200180831161217f57829003601f168201915b5050505050905090565b6060600060016121b58461256a565b01905060008167ffffffffffffffff8111156121d4576121d3614004565b5b6040519080825280601f01601f1916602001820160405280156122065781602001600182028036833780820191505090505b509050600082602001820190505b600115612273578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161225d5761225c613f48565b5b049450600085141561226e57612273565b612214565b819350505050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061234957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806123595750612358826126bd565b5b9050919050565b61236c84848484612727565b50505050565b50505050565b6123828383612887565b61238f60008484846123d3565b6123ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c5906139d9565b60405180910390fd5b505050565b60006123f48473ffffffffffffffffffffffffffffffffffffffff16612aa5565b1561255d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261241d61184b565b8786866040518563ffffffff1660e01b815260040161243f94939291906138d3565b602060405180830381600087803b15801561245957600080fd5b505af192505050801561248a57506040513d601f19601f82011682018060405250810190612487919061333f565b60015b61250d573d80600081146124ba576040519150601f19603f3d011682016040523d82523d6000602084013e6124bf565b606091505b50600081511415612505576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124fc906139d9565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612562565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106125c8577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816125be576125bd613f48565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612605576d04ee2d6d415b85acef810000000083816125fb576125fa613f48565b5b0492506020810190505b662386f26fc10000831061263457662386f26fc10000838161262a57612629613f48565b5b0492506010810190505b6305f5e100831061265d576305f5e100838161265357612652613f48565b5b0492506008810190505b612710831061268257612710838161267857612677613f48565b5b0492506004810190505b606483106126a5576064838161269b5761269a613f48565b5b0492506002810190505b600a83106126b4576001810190505b80915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61273384848484612ac8565b6001811115612777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276e90613b99565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156127bf576127ba81612bee565b6127fe565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146127fd576127fc8582612c37565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156128415761283c81612da4565b612880565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161461287f5761287e8482612e75565b5b5b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ee90613ab9565b60405180910390fd5b612900816120d3565b15612940576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293790613a39565b60405180910390fd5b61294e600083836001612360565b612957816120d3565b15612997576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298e90613a39565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612aa1600083836001612372565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6001811115612be857600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612b5c5780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b549190613d4d565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612be75780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612bdf9190613cf7565b925050819055505b5b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612c4484610fdc565b612c4e9190613d4d565b9050600060076000848152602001908152602001600020549050818114612d33576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612db89190613d4d565b9050600060096000848152602001908152602001600020549050600060088381548110612de857612de7613fd5565b5b906000526020600020015490508060088381548110612e0a57612e09613fd5565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612e5957612e58613fa6565b5b6001900381819060005260206000200160009055905550505050565b6000612e8083610fdc565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054612f0090613e6d565b90600052602060002090601f016020900481019282612f225760008555612f69565b82601f10612f3b57805160ff1916838001178555612f69565b82800160010185558215612f69579182015b82811115612f68578251825591602001919060010190612f4d565b5b509050612f769190612f7a565b5090565b5b80821115612f93576000816000905550600101612f7b565b5090565b6000612faa612fa584613bf9565b613bd4565b905082815260208101848484011115612fc657612fc5614038565b5b612fd1848285613e2b565b509392505050565b6000612fec612fe784613c2a565b613bd4565b90508281526020810184848401111561300857613007614038565b5b613013848285613e2b565b509392505050565b60008135905061302a816144dc565b92915050565b60008135905061303f816144f3565b92915050565b600081519050613054816144f3565b92915050565b6000813590506130698161450a565b92915050565b60008151905061307e8161450a565b92915050565b600082601f83011261309957613098614033565b5b81356130a9848260208601612f97565b91505092915050565b600082601f8301126130c7576130c6614033565b5b81356130d7848260208601612fd9565b91505092915050565b6000813590506130ef81614521565b92915050565b60006020828403121561310b5761310a614042565b5b60006131198482850161301b565b91505092915050565b6000806040838503121561313957613138614042565b5b60006131478582860161301b565b92505060206131588582860161301b565b9150509250929050565b60008060006060848603121561317b5761317a614042565b5b60006131898682870161301b565b935050602061319a8682870161301b565b92505060406131ab868287016130e0565b9150509250925092565b600080600080608085870312156131cf576131ce614042565b5b60006131dd8782880161301b565b94505060206131ee8782880161301b565b93505060406131ff878288016130e0565b925050606085013567ffffffffffffffff8111156132205761321f61403d565b5b61322c87828801613084565b91505092959194509250565b6000806040838503121561324f5761324e614042565b5b600061325d8582860161301b565b925050602061326e85828601613030565b9150509250929050565b6000806040838503121561328f5761328e614042565b5b600061329d8582860161301b565b92505060206132ae858286016130e0565b9150509250929050565b6000602082840312156132ce576132cd614042565b5b60006132dc84828501613030565b91505092915050565b6000602082840312156132fb576132fa614042565b5b600061330984828501613045565b91505092915050565b60006020828403121561332857613327614042565b5b60006133368482850161305a565b91505092915050565b60006020828403121561335557613354614042565b5b60006133638482850161306f565b91505092915050565b60006020828403121561338257613381614042565b5b600082013567ffffffffffffffff8111156133a05761339f61403d565b5b6133ac848285016130b2565b91505092915050565b6000602082840312156133cb576133ca614042565b5b60006133d9848285016130e0565b91505092915050565b60006133ee838361381d565b60208301905092915050565b61340381613d81565b82525050565b600061341482613c80565b61341e8185613cae565b935061342983613c5b565b8060005b8381101561345a57815161344188826133e2565b975061344c83613ca1565b92505060018101905061342d565b5085935050505092915050565b61347081613d93565b82525050565b600061348182613c8b565b61348b8185613cbf565b935061349b818560208601613e3a565b6134a481614047565b840191505092915050565b6134b881613df5565b82525050565b60006134c982613c96565b6134d38185613cdb565b93506134e3818560208601613e3a565b6134ec81614047565b840191505092915050565b600061350282613c96565b61350c8185613cec565b935061351c818560208601613e3a565b80840191505092915050565b6000815461353581613e6d565b61353f8186613cec565b9450600182166000811461355a576001811461356b5761359e565b60ff1983168652818601935061359e565b61357485613c6b565b60005b8381101561359657815481890152600182019150602081019050613577565b838801955050505b50505092915050565b60006135b4602d83613cdb565b91506135bf82614058565b604082019050919050565b60006135d7602b83613cdb565b91506135e2826140a7565b604082019050919050565b60006135fa603283613cdb565b9150613605826140f6565b604082019050919050565b600061361d602683613cdb565b915061362882614145565b604082019050919050565b6000613640602583613cdb565b915061364b82614194565b604082019050919050565b6000613663601c83613cdb565b915061366e826141e3565b602082019050919050565b6000613686602483613cdb565b91506136918261420c565b604082019050919050565b60006136a9601983613cdb565b91506136b48261425b565b602082019050919050565b60006136cc602983613cdb565b91506136d782614284565b604082019050919050565b60006136ef602083613cdb565b91506136fa826142d3565b602082019050919050565b6000613712602083613cdb565b915061371d826142fc565b602082019050919050565b6000613735602f83613cdb565b915061374082614325565b604082019050919050565b6000613758601883613cdb565b915061376382614374565b602082019050919050565b600061377b602183613cdb565b91506137868261439d565b604082019050919050565b600061379e600083613cd0565b91506137a9826143ec565b600082019050919050565b60006137c1603d83613cdb565b91506137cc826143ef565b604082019050919050565b60006137e4602c83613cdb565b91506137ef8261443e565b604082019050919050565b6000613807603583613cdb565b91506138128261448d565b604082019050919050565b61382681613deb565b82525050565b61383581613deb565b82525050565b600061384782866134f7565b915061385382856134f7565b915061385f8284613528565b9150819050949350505050565b600061387782613791565b9150819050919050565b600060208201905061389660008301846133fa565b92915050565b60006060820190506138b160008301866133fa565b6138be60208301856133fa565b6138cb604083018461382c565b949350505050565b60006080820190506138e860008301876133fa565b6138f560208301866133fa565b613902604083018561382c565b81810360608301526139148184613476565b905095945050505050565b600060208201905081810360008301526139398184613409565b905092915050565b60006020820190506139566000830184613467565b92915050565b600060208201905061397160008301846134af565b92915050565b6000602082019050818103600083015261399181846134be565b905092915050565b600060208201905081810360008301526139b2816135a7565b9050919050565b600060208201905081810360008301526139d2816135ca565b9050919050565b600060208201905081810360008301526139f2816135ed565b9050919050565b60006020820190508181036000830152613a1281613610565b9050919050565b60006020820190508181036000830152613a3281613633565b9050919050565b60006020820190508181036000830152613a5281613656565b9050919050565b60006020820190508181036000830152613a7281613679565b9050919050565b60006020820190508181036000830152613a928161369c565b9050919050565b60006020820190508181036000830152613ab2816136bf565b9050919050565b60006020820190508181036000830152613ad2816136e2565b9050919050565b60006020820190508181036000830152613af281613705565b9050919050565b60006020820190508181036000830152613b1281613728565b9050919050565b60006020820190508181036000830152613b328161374b565b9050919050565b60006020820190508181036000830152613b528161376e565b9050919050565b60006020820190508181036000830152613b72816137b4565b9050919050565b60006020820190508181036000830152613b92816137d7565b9050919050565b60006020820190508181036000830152613bb2816137fa565b9050919050565b6000602082019050613bce600083018461382c565b92915050565b6000613bde613bef565b9050613bea8282613e9f565b919050565b6000604051905090565b600067ffffffffffffffff821115613c1457613c13614004565b5b613c1d82614047565b9050602081019050919050565b600067ffffffffffffffff821115613c4557613c44614004565b5b613c4e82614047565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613d0282613deb565b9150613d0d83613deb565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d4257613d41613f19565b5b828201905092915050565b6000613d5882613deb565b9150613d6383613deb565b925082821015613d7657613d75613f19565b5b828203905092915050565b6000613d8c82613dcb565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000613e0082613e07565b9050919050565b6000613e1282613e19565b9050919050565b6000613e2482613dcb565b9050919050565b82818337600083830152505050565b60005b83811015613e58578082015181840152602081019050613e3d565b83811115613e67576000848401525b50505050565b60006002820490506001821680613e8557607f821691505b60208210811415613e9957613e98613f77565b5b50919050565b613ea882614047565b810181811067ffffffffffffffff82111715613ec757613ec6614004565b5b80604052505050565b6000613edb82613deb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613f0e57613f0d613f19565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b6144e581613d81565b81146144f057600080fd5b50565b6144fc81613d93565b811461450757600080fd5b50565b61451381613d9f565b811461451e57600080fd5b50565b61452a81613deb565b811461453557600080fd5b5056fea26469706673582212202066944db13deca1eed0548c7c22c63fec3d75944d9b0e66a9abf6fe4f05a66c64736f6c63430008070033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000006c04b0ad236e7ca3b3189b1d049fe80109c79770000000000000000000000000000000000000000000000000000000000000038697066732e696f2f2f516d58487169546b4b41436e575546373764594355674379364b326278734b46586d414e6b3179323868456969652000000000000000000000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106102305760003560e01c806355f804b31161012e578063a22cb465116100ab578063d5abeb011161006f578063d5abeb011461081c578063da3ef23f14610847578063e985e9c514610870578063f2c4ce1e146108ad578063f2fde38b146108d657610230565b8063a22cb4651461074b578063a475b5dd14610774578063b88d4fde1461078b578063c6682862146107b4578063c87b56dd146107df57610230565b80637f00c7a6116100f25780637f00c7a6146106785780638da5cb5b146106a157806395d89b41146106cc5780639d76ea58146106f7578063a0712d681461072257610230565b806355f804b3146105935780635c975abb146105bc5780636352211e146105e757806370a0823114610624578063715018a61461066157610230565b806323b872dd116101bc57806342966c681161018057806342966c681461049c578063438b6300146104c557806344a0d68a146105025780634f6ccce71461052b578063518302271461056857610230565b806323b872dd146103d85780632c4e722e146104015780632f745c591461042c5780633ccfd60b1461046957806342842e0e1461047357610230565b8063081c8c4411610203578063081c8c4414610303578063095ea7b31461032e57806313faede61461035757806318160ddd14610382578063239c70ae146103ad57610230565b806301ffc9a71461023557806302329a291461027257806306fdde031461029b578063081812fc146102c6575b600080fd5b34801561024157600080fd5b5061025c60048036038101906102579190613312565b6108ff565b6040516102699190613941565b60405180910390f35b34801561027e57600080fd5b50610299600480360381019061029491906132b8565b610911565b005b3480156102a757600080fd5b506102b0610936565b6040516102bd9190613977565b60405180910390f35b3480156102d257600080fd5b506102ed60048036038101906102e891906133b5565b6109c8565b6040516102fa9190613881565b60405180910390f35b34801561030f57600080fd5b50610318610a0e565b6040516103259190613977565b60405180910390f35b34801561033a57600080fd5b5061035560048036038101906103509190613278565b610a9c565b005b34801561036357600080fd5b5061036c610bb4565b6040516103799190613bb9565b60405180910390f35b34801561038e57600080fd5b50610397610bba565b6040516103a49190613bb9565b60405180910390f35b3480156103b957600080fd5b506103c2610bc7565b6040516103cf9190613bb9565b60405180910390f35b3480156103e457600080fd5b506103ff60048036038101906103fa9190613162565b610bcd565b005b34801561040d57600080fd5b50610416610c2d565b6040516104239190613bb9565b60405180910390f35b34801561043857600080fd5b50610453600480360381019061044e9190613278565b610c33565b6040516104609190613bb9565b60405180910390f35b610471610cd8565b005b34801561047f57600080fd5b5061049a60048036038101906104959190613162565b610d60565b005b3480156104a857600080fd5b506104c360048036038101906104be91906133b5565b610d80565b005b3480156104d157600080fd5b506104ec60048036038101906104e791906130f5565b610ddc565b6040516104f9919061391f565b60405180910390f35b34801561050e57600080fd5b50610529600480360381019061052491906133b5565b610e8a565b005b34801561053757600080fd5b50610552600480360381019061054d91906133b5565b610e9c565b60405161055f9190613bb9565b60405180910390f35b34801561057457600080fd5b5061057d610f0d565b60405161058a9190613941565b60405180910390f35b34801561059f57600080fd5b506105ba60048036038101906105b5919061336c565b610f20565b005b3480156105c857600080fd5b506105d1610f42565b6040516105de9190613941565b60405180910390f35b3480156105f357600080fd5b5061060e600480360381019061060991906133b5565b610f55565b60405161061b9190613881565b60405180910390f35b34801561063057600080fd5b5061064b600480360381019061064691906130f5565b610fdc565b6040516106589190613bb9565b60405180910390f35b34801561066d57600080fd5b50610676611094565b005b34801561068457600080fd5b5061069f600480360381019061069a91906133b5565b6110a8565b005b3480156106ad57600080fd5b506106b66110ba565b6040516106c39190613881565b60405180910390f35b3480156106d857600080fd5b506106e16110e4565b6040516106ee9190613977565b60405180910390f35b34801561070357600080fd5b5061070c611176565b604051610719919061395c565b60405180910390f35b34801561072e57600080fd5b50610749600480360381019061074491906133b5565b61119c565b005b34801561075757600080fd5b50610772600480360381019061076d9190613238565b611322565b005b34801561078057600080fd5b50610789611338565b005b34801561079757600080fd5b506107b260048036038101906107ad91906131b5565b61135d565b005b3480156107c057600080fd5b506107c96113bf565b6040516107d69190613977565b60405180910390f35b3480156107eb57600080fd5b50610806600480360381019061080191906133b5565b61144d565b6040516108139190613977565b60405180910390f35b34801561082857600080fd5b506108316115a6565b60405161083e9190613bb9565b60405180910390f35b34801561085357600080fd5b5061086e6004803603810190610869919061336c565b6115ac565b005b34801561087c57600080fd5b5061089760048036038101906108929190613122565b6115ce565b6040516108a49190613941565b60405180910390f35b3480156108b957600080fd5b506108d460048036038101906108cf919061336c565b611662565b005b3480156108e257600080fd5b506108fd60048036038101906108f891906130f5565b611684565b005b600061090a82611708565b9050919050565b610919611782565b80601160006101000a81548160ff02191690831515021790555050565b60606000805461094590613e6d565b80601f016020809104026020016040519081016040528092919081815260200182805461097190613e6d565b80156109be5780601f10610993576101008083540402835291602001916109be565b820191906000526020600020905b8154815290600101906020018083116109a157829003601f168201915b5050505050905090565b60006109d382611800565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60128054610a1b90613e6d565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4790613e6d565b8015610a945780601f10610a6957610100808354040283529160200191610a94565b820191906000526020600020905b815481529060010190602001808311610a7757829003601f168201915b505050505081565b6000610aa782610f55565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0f90613b39565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b3761184b565b73ffffffffffffffffffffffffffffffffffffffff161480610b665750610b6581610b6061184b565b6115ce565b5b610ba5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9c90613b59565b60405180910390fd5b610baf8383611853565b505050565b600e5481565b6000600880549050905090565b60105481565b610bde610bd861184b565b8261190c565b610c1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1490613999565b60405180910390fd5b610c288383836119a1565b505050565b60135481565b6000610c3e83610fdc565b8210610c7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c76906139b9565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610ce0611782565b6000610cea6110ba565b73ffffffffffffffffffffffffffffffffffffffff1647604051610d0d9061386c565b60006040518083038185875af1925050503d8060008114610d4a576040519150601f19603f3d011682016040523d82523d6000602084013e610d4f565b606091505b5050905080610d5d57600080fd5b50565b610d7b8383836040518060200160405280600081525061135d565b505050565b610d91610d8b61184b565b8261190c565b610dd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc790613999565b60405180910390fd5b610dd981611c9b565b50565b60606000610de983610fdc565b905060008167ffffffffffffffff811115610e0757610e06614004565b5b604051908082528060200260200182016040528015610e355781602001602082028036833780820191505090505b50905060005b82811015610e7f57610e4d8582610c33565b828281518110610e6057610e5f613fd5565b5b6020026020010181815250508080610e7790613ed0565b915050610e3b565b508092505050919050565b610e92611782565b80600e8190555050565b6000610ea6610bba565b8210610ee7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ede90613b79565b60405180910390fd5b60088281548110610efb57610efa613fd5565b5b90600052602060002001549050919050565b601160019054906101000a900460ff1681565b610f28611782565b80600c9080519060200190610f3e929190612ef4565b5050565b601160009054906101000a900460ff1681565b600080610f6183611de9565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610fd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fca90613b19565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561104d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104490613a99565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61109c611782565b6110a66000611e26565b565b6110b0611782565b8060108190555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546110f390613e6d565b80601f016020809104026020016040519081016040528092919081815260200182805461111f90613e6d565b801561116c5780601f106111415761010080835404028352916020019161116c565b820191906000526020600020905b81548152906001019060200180831161114f57829003601f168201915b5050505050905090565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006111a6610bba565b9050601160009054906101000a900460ff16156111c257600080fd5b600082116111cf57600080fd5b6010548211156111de57600080fd5b600f5482826111ed9190613cf7565b11156111f857600080fd5b6112006110ba565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146112e757600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33306013546040518463ffffffff1660e01b81526004016112939392919061389c565b602060405180830381600087803b1580156112ad57600080fd5b505af11580156112c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e591906132e5565b505b6000600190505b82811161131d5761130a3382846113059190613cf7565b611eec565b808061131590613ed0565b9150506112ee565b505050565b61133461132d61184b565b8383611f0a565b5050565b611340611782565b6001601160016101000a81548160ff021916908315150217905550565b61136e61136861184b565b8361190c565b6113ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a490613999565b60405180910390fd5b6113b984848484612077565b50505050565b600d80546113cc90613e6d565b80601f01602080910402602001604051908101604052809291908181526020018280546113f890613e6d565b80156114455780601f1061141a57610100808354040283529160200191611445565b820191906000526020600020905b81548152906001019060200180831161142857829003601f168201915b505050505081565b6060611458826120d3565b611497576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148e90613af9565b60405180910390fd5b60001515601160019054906101000a900460ff161515141561154557601280546114c090613e6d565b80601f01602080910402602001604051908101604052809291908181526020018280546114ec90613e6d565b80156115395780601f1061150e57610100808354040283529160200191611539565b820191906000526020600020905b81548152906001019060200180831161151c57829003601f168201915b505050505090506115a1565b600061154f612114565b9050600081511161156f576040518060200160405280600081525061159d565b80611579846121a6565b600d60405160200161158d9392919061383b565b6040516020818303038152906040525b9150505b919050565b600f5481565b6115b4611782565b80600d90805190602001906115ca929190612ef4565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61166a611782565b8060129080519060200190611680929190612ef4565b5050565b61168c611782565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156116fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f3906139f9565b60405180910390fd5b61170581611e26565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061177b575061177a8261227e565b5b9050919050565b61178a61184b565b73ffffffffffffffffffffffffffffffffffffffff166117a86110ba565b73ffffffffffffffffffffffffffffffffffffffff16146117fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f590613ad9565b60405180910390fd5b565b611809816120d3565b611848576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183f90613b19565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166118c683610f55565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061191883610f55565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061195a575061195981856115ce565b5b8061199857508373ffffffffffffffffffffffffffffffffffffffff16611980846109c8565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166119c182610f55565b73ffffffffffffffffffffffffffffffffffffffff1614611a17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0e90613a19565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7e90613a59565b60405180910390fd5b611a948383836001612360565b8273ffffffffffffffffffffffffffffffffffffffff16611ab482610f55565b73ffffffffffffffffffffffffffffffffffffffff1614611b0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0190613a19565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611c968383836001612372565b505050565b6000611ca682610f55565b9050611cb6816000846001612360565b611cbf82610f55565b90506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611de5816000846001612372565b5050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611f06828260405180602001604052806000815250612378565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611f79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7090613a79565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161206a9190613941565b60405180910390a3505050565b6120828484846119a1565b61208e848484846123d3565b6120cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c4906139d9565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff166120f583611de9565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600c805461212390613e6d565b80601f016020809104026020016040519081016040528092919081815260200182805461214f90613e6d565b801561219c5780601f106121715761010080835404028352916020019161219c565b820191906000526020600020905b81548152906001019060200180831161217f57829003601f168201915b5050505050905090565b6060600060016121b58461256a565b01905060008167ffffffffffffffff8111156121d4576121d3614004565b5b6040519080825280601f01601f1916602001820160405280156122065781602001600182028036833780820191505090505b509050600082602001820190505b600115612273578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161225d5761225c613f48565b5b049450600085141561226e57612273565b612214565b819350505050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061234957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806123595750612358826126bd565b5b9050919050565b61236c84848484612727565b50505050565b50505050565b6123828383612887565b61238f60008484846123d3565b6123ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c5906139d9565b60405180910390fd5b505050565b60006123f48473ffffffffffffffffffffffffffffffffffffffff16612aa5565b1561255d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261241d61184b565b8786866040518563ffffffff1660e01b815260040161243f94939291906138d3565b602060405180830381600087803b15801561245957600080fd5b505af192505050801561248a57506040513d601f19601f82011682018060405250810190612487919061333f565b60015b61250d573d80600081146124ba576040519150601f19603f3d011682016040523d82523d6000602084013e6124bf565b606091505b50600081511415612505576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124fc906139d9565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612562565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106125c8577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816125be576125bd613f48565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612605576d04ee2d6d415b85acef810000000083816125fb576125fa613f48565b5b0492506020810190505b662386f26fc10000831061263457662386f26fc10000838161262a57612629613f48565b5b0492506010810190505b6305f5e100831061265d576305f5e100838161265357612652613f48565b5b0492506008810190505b612710831061268257612710838161267857612677613f48565b5b0492506004810190505b606483106126a5576064838161269b5761269a613f48565b5b0492506002810190505b600a83106126b4576001810190505b80915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61273384848484612ac8565b6001811115612777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276e90613b99565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156127bf576127ba81612bee565b6127fe565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146127fd576127fc8582612c37565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156128415761283c81612da4565b612880565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161461287f5761287e8482612e75565b5b5b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ee90613ab9565b60405180910390fd5b612900816120d3565b15612940576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293790613a39565b60405180910390fd5b61294e600083836001612360565b612957816120d3565b15612997576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298e90613a39565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612aa1600083836001612372565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6001811115612be857600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612b5c5780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b549190613d4d565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612be75780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612bdf9190613cf7565b925050819055505b5b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612c4484610fdc565b612c4e9190613d4d565b9050600060076000848152602001908152602001600020549050818114612d33576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612db89190613d4d565b9050600060096000848152602001908152602001600020549050600060088381548110612de857612de7613fd5565b5b906000526020600020015490508060088381548110612e0a57612e09613fd5565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612e5957612e58613fa6565b5b6001900381819060005260206000200160009055905550505050565b6000612e8083610fdc565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054612f0090613e6d565b90600052602060002090601f016020900481019282612f225760008555612f69565b82601f10612f3b57805160ff1916838001178555612f69565b82800160010185558215612f69579182015b82811115612f68578251825591602001919060010190612f4d565b5b509050612f769190612f7a565b5090565b5b80821115612f93576000816000905550600101612f7b565b5090565b6000612faa612fa584613bf9565b613bd4565b905082815260208101848484011115612fc657612fc5614038565b5b612fd1848285613e2b565b509392505050565b6000612fec612fe784613c2a565b613bd4565b90508281526020810184848401111561300857613007614038565b5b613013848285613e2b565b509392505050565b60008135905061302a816144dc565b92915050565b60008135905061303f816144f3565b92915050565b600081519050613054816144f3565b92915050565b6000813590506130698161450a565b92915050565b60008151905061307e8161450a565b92915050565b600082601f83011261309957613098614033565b5b81356130a9848260208601612f97565b91505092915050565b600082601f8301126130c7576130c6614033565b5b81356130d7848260208601612fd9565b91505092915050565b6000813590506130ef81614521565b92915050565b60006020828403121561310b5761310a614042565b5b60006131198482850161301b565b91505092915050565b6000806040838503121561313957613138614042565b5b60006131478582860161301b565b92505060206131588582860161301b565b9150509250929050565b60008060006060848603121561317b5761317a614042565b5b60006131898682870161301b565b935050602061319a8682870161301b565b92505060406131ab868287016130e0565b9150509250925092565b600080600080608085870312156131cf576131ce614042565b5b60006131dd8782880161301b565b94505060206131ee8782880161301b565b93505060406131ff878288016130e0565b925050606085013567ffffffffffffffff8111156132205761321f61403d565b5b61322c87828801613084565b91505092959194509250565b6000806040838503121561324f5761324e614042565b5b600061325d8582860161301b565b925050602061326e85828601613030565b9150509250929050565b6000806040838503121561328f5761328e614042565b5b600061329d8582860161301b565b92505060206132ae858286016130e0565b9150509250929050565b6000602082840312156132ce576132cd614042565b5b60006132dc84828501613030565b91505092915050565b6000602082840312156132fb576132fa614042565b5b600061330984828501613045565b91505092915050565b60006020828403121561332857613327614042565b5b60006133368482850161305a565b91505092915050565b60006020828403121561335557613354614042565b5b60006133638482850161306f565b91505092915050565b60006020828403121561338257613381614042565b5b600082013567ffffffffffffffff8111156133a05761339f61403d565b5b6133ac848285016130b2565b91505092915050565b6000602082840312156133cb576133ca614042565b5b60006133d9848285016130e0565b91505092915050565b60006133ee838361381d565b60208301905092915050565b61340381613d81565b82525050565b600061341482613c80565b61341e8185613cae565b935061342983613c5b565b8060005b8381101561345a57815161344188826133e2565b975061344c83613ca1565b92505060018101905061342d565b5085935050505092915050565b61347081613d93565b82525050565b600061348182613c8b565b61348b8185613cbf565b935061349b818560208601613e3a565b6134a481614047565b840191505092915050565b6134b881613df5565b82525050565b60006134c982613c96565b6134d38185613cdb565b93506134e3818560208601613e3a565b6134ec81614047565b840191505092915050565b600061350282613c96565b61350c8185613cec565b935061351c818560208601613e3a565b80840191505092915050565b6000815461353581613e6d565b61353f8186613cec565b9450600182166000811461355a576001811461356b5761359e565b60ff1983168652818601935061359e565b61357485613c6b565b60005b8381101561359657815481890152600182019150602081019050613577565b838801955050505b50505092915050565b60006135b4602d83613cdb565b91506135bf82614058565b604082019050919050565b60006135d7602b83613cdb565b91506135e2826140a7565b604082019050919050565b60006135fa603283613cdb565b9150613605826140f6565b604082019050919050565b600061361d602683613cdb565b915061362882614145565b604082019050919050565b6000613640602583613cdb565b915061364b82614194565b604082019050919050565b6000613663601c83613cdb565b915061366e826141e3565b602082019050919050565b6000613686602483613cdb565b91506136918261420c565b604082019050919050565b60006136a9601983613cdb565b91506136b48261425b565b602082019050919050565b60006136cc602983613cdb565b91506136d782614284565b604082019050919050565b60006136ef602083613cdb565b91506136fa826142d3565b602082019050919050565b6000613712602083613cdb565b915061371d826142fc565b602082019050919050565b6000613735602f83613cdb565b915061374082614325565b604082019050919050565b6000613758601883613cdb565b915061376382614374565b602082019050919050565b600061377b602183613cdb565b91506137868261439d565b604082019050919050565b600061379e600083613cd0565b91506137a9826143ec565b600082019050919050565b60006137c1603d83613cdb565b91506137cc826143ef565b604082019050919050565b60006137e4602c83613cdb565b91506137ef8261443e565b604082019050919050565b6000613807603583613cdb565b91506138128261448d565b604082019050919050565b61382681613deb565b82525050565b61383581613deb565b82525050565b600061384782866134f7565b915061385382856134f7565b915061385f8284613528565b9150819050949350505050565b600061387782613791565b9150819050919050565b600060208201905061389660008301846133fa565b92915050565b60006060820190506138b160008301866133fa565b6138be60208301856133fa565b6138cb604083018461382c565b949350505050565b60006080820190506138e860008301876133fa565b6138f560208301866133fa565b613902604083018561382c565b81810360608301526139148184613476565b905095945050505050565b600060208201905081810360008301526139398184613409565b905092915050565b60006020820190506139566000830184613467565b92915050565b600060208201905061397160008301846134af565b92915050565b6000602082019050818103600083015261399181846134be565b905092915050565b600060208201905081810360008301526139b2816135a7565b9050919050565b600060208201905081810360008301526139d2816135ca565b9050919050565b600060208201905081810360008301526139f2816135ed565b9050919050565b60006020820190508181036000830152613a1281613610565b9050919050565b60006020820190508181036000830152613a3281613633565b9050919050565b60006020820190508181036000830152613a5281613656565b9050919050565b60006020820190508181036000830152613a7281613679565b9050919050565b60006020820190508181036000830152613a928161369c565b9050919050565b60006020820190508181036000830152613ab2816136bf565b9050919050565b60006020820190508181036000830152613ad2816136e2565b9050919050565b60006020820190508181036000830152613af281613705565b9050919050565b60006020820190508181036000830152613b1281613728565b9050919050565b60006020820190508181036000830152613b328161374b565b9050919050565b60006020820190508181036000830152613b528161376e565b9050919050565b60006020820190508181036000830152613b72816137b4565b9050919050565b60006020820190508181036000830152613b92816137d7565b9050919050565b60006020820190508181036000830152613bb2816137fa565b9050919050565b6000602082019050613bce600083018461382c565b92915050565b6000613bde613bef565b9050613bea8282613e9f565b919050565b6000604051905090565b600067ffffffffffffffff821115613c1457613c13614004565b5b613c1d82614047565b9050602081019050919050565b600067ffffffffffffffff821115613c4557613c44614004565b5b613c4e82614047565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613d0282613deb565b9150613d0d83613deb565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d4257613d41613f19565b5b828201905092915050565b6000613d5882613deb565b9150613d6383613deb565b925082821015613d7657613d75613f19565b5b828203905092915050565b6000613d8c82613dcb565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000613e0082613e07565b9050919050565b6000613e1282613e19565b9050919050565b6000613e2482613dcb565b9050919050565b82818337600083830152505050565b60005b83811015613e58578082015181840152602081019050613e3d565b83811115613e67576000848401525b50505050565b60006002820490506001821680613e8557607f821691505b60208210811415613e9957613e98613f77565b5b50919050565b613ea882614047565b810181811067ffffffffffffffff82111715613ec757613ec6614004565b5b80604052505050565b6000613edb82613deb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613f0e57613f0d613f19565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b6144e581613d81565b81146144f057600080fd5b50565b6144fc81613d93565b811461450757600080fd5b50565b61451381613d9f565b811461451e57600080fd5b50565b61452a81613deb565b811461453557600080fd5b5056fea26469706673582212202066944db13deca1eed0548c7c22c63fec3d75944d9b0e66a9abf6fe4f05a66c64736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000006c04b0ad236e7ca3b3189b1d049fe80109c79770000000000000000000000000000000000000000000000000000000000000038697066732e696f2f2f516d58487169546b4b41436e575546373764594355674379364b326278734b46586d414e6b3179323868456969652000000000000000000000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _initBaseURI (string): ipfs.io//QmXHqiTkKACnWUF77dYCUgCy6K2bxsKFXmANk1y28hEiie
Arg [1] : _initNotRevealedUri (string):
Arg [2] : _tokenAddress (address): 0x06c04b0ad236e7ca3b3189b1d049fe80109c7977
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 00000000000000000000000006c04b0ad236e7ca3b3189b1d049fe80109c7977
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000038
Arg [4] : 697066732e696f2f2f516d58487169546b4b41436e5755463737645943556743
Arg [5] : 79364b326278734b46586d414e6b317932386845696965200000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed ByteCode Sourcemap
66208:4071:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67443:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70034:79;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43466:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44978:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66594:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44496:416;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66410:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60831:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66486:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45678:335;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66629:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60499:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70121:155;;;:::i;:::-;;46084:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58916:242;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68179:390;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69405:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61021:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66559:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69763:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66526:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43176:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42907:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20889:103;;;;;;;;;;;;;:::i;:::-;;69499:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20241:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43635:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66310:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67678:493;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45221:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69328:69;;;;;;;;;;;;;:::i;:::-;;46340:322;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66366:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68577:725;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66447:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69875:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45447:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69629:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21147:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67443:212;67582:4;67611:36;67635:11;67611:23;:36::i;:::-;67604:43;;67443:212;;;:::o;70034:79::-;20127:13;:11;:13::i;:::-;70099:6:::1;70090;;:15;;;;;;;;;;;;;;;;;;70034:79:::0;:::o;43466:100::-;43520:13;43553:5;43546:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43466:100;:::o;44978:171::-;45054:7;45074:23;45089:7;45074:14;:23::i;:::-;45117:15;:24;45133:7;45117:24;;;;;;;;;;;;;;;;;;;;;45110:31;;44978:171;;;:::o;66594:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;44496:416::-;44577:13;44593:23;44608:7;44593:14;:23::i;:::-;44577:39;;44641:5;44635:11;;:2;:11;;;;44627:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;44735:5;44719:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;44744:37;44761:5;44768:12;:10;:12::i;:::-;44744:16;:37::i;:::-;44719:62;44697:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;44883:21;44892:2;44896:7;44883:8;:21::i;:::-;44566:346;44496:416;;:::o;66410:30::-;;;;:::o;60831:113::-;60892:7;60919:10;:17;;;;60912:24;;60831:113;:::o;66486:33::-;;;;:::o;45678:335::-;45873:41;45892:12;:10;:12::i;:::-;45906:7;45873:18;:41::i;:::-;45865:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;45977:28;45987:4;45993:2;45997:7;45977:9;:28::i;:::-;45678:335;;;:::o;66629:34::-;;;;:::o;60499:256::-;60596:7;60632:23;60649:5;60632:16;:23::i;:::-;60624:5;:31;60616:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;60721:12;:19;60734:5;60721:19;;;;;;;;;;;;;;;:26;60741:5;60721:26;;;;;;;;;;;;60714:33;;60499:256;;;;:::o;70121:155::-;20127:13;:11;:13::i;:::-;70178:7:::1;70199;:5;:7::i;:::-;70191:21;;70220;70191:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70177:69;;;70265:2;70257:11;;;::::0;::::1;;70166:110;70121:155::o:0;46084:185::-;46222:39;46239:4;46245:2;46249:7;46222:39;;;;;;;;;;;;:16;:39::i;:::-;46084:185;;;:::o;58916:242::-;59034:41;59053:12;:10;:12::i;:::-;59067:7;59034:18;:41::i;:::-;59026:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;59136:14;59142:7;59136:5;:14::i;:::-;58916:242;:::o;68179:390::-;68266:16;68300:23;68326:17;68336:6;68326:9;:17::i;:::-;68300:43;;68354:25;68396:15;68382:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68354:58;;68428:9;68423:113;68443:15;68439:1;:19;68423:113;;;68494:30;68514:6;68522:1;68494:19;:30::i;:::-;68480:8;68489:1;68480:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;68460:3;;;;;:::i;:::-;;;;68423:113;;;;68553:8;68546:15;;;;68179:390;;;:::o;69405:86::-;20127:13;:11;:13::i;:::-;69475:8:::1;69468:4;:15;;;;69405:86:::0;:::o;61021:233::-;61096:7;61132:30;:28;:30::i;:::-;61124:5;:38;61116:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;61229:10;61240:5;61229:17;;;;;;;;:::i;:::-;;;;;;;;;;61222:24;;61021:233;;;:::o;66559:28::-;;;;;;;;;;;;;:::o;69763:104::-;20127:13;:11;:13::i;:::-;69848:11:::1;69838:7;:21;;;;;;;;;;;;:::i;:::-;;69763:104:::0;:::o;66526:26::-;;;;;;;;;;;;;:::o;43176:223::-;43248:7;43268:13;43284:17;43293:7;43284:8;:17::i;:::-;43268:33;;43337:1;43320:19;;:5;:19;;;;43312:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;43386:5;43379:12;;;43176:223;;;:::o;42907:207::-;42979:7;43024:1;43007:19;;:5;:19;;;;42999:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;43090:9;:16;43100:5;43090:16;;;;;;;;;;;;;;;;43083:23;;42907:207;;;:::o;20889:103::-;20127:13;:11;:13::i;:::-;20954:30:::1;20981:1;20954:18;:30::i;:::-;20889:103::o:0;69499:122::-;20127:13;:11;:13::i;:::-;69596:17:::1;69580:13;:33;;;;69499:122:::0;:::o;20241:87::-;20287:7;20314:6;;;;;;;;;;;20307:13;;20241:87;:::o;43635:104::-;43691:13;43724:7;43717:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43635:104;:::o;66310:26::-;;;;;;;;;;;;;:::o;67678:493::-;67731:14;67748:13;:11;:13::i;:::-;67731:30;;67781:6;;;;;;;;;;;67780:7;67772:16;;;;;;67821:1;67807:11;:15;67799:24;;;;;;67857:13;;67842:11;:28;;67834:37;;;;;;67914:9;;67899:11;67890:6;:20;;;;:::i;:::-;:33;;67882:42;;;;;;67955:7;:5;:7::i;:::-;67941:21;;:10;:21;;;67937:112;;67979:12;;;;;;;;;;;:25;;;68005:10;68025:4;68032;;67979:58;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;67937:112;68066:9;68078:1;68066:13;;68061:103;68086:11;68081:1;:16;68061:103;;68119:33;68129:10;68150:1;68141:6;:10;;;;:::i;:::-;68119:9;:33::i;:::-;68099:3;;;;;:::i;:::-;;;;68061:103;;;;67720:451;67678:493;:::o;45221:155::-;45316:52;45335:12;:10;:12::i;:::-;45349:8;45359;45316:18;:52::i;:::-;45221:155;;:::o;69328:69::-;20127:13;:11;:13::i;:::-;69385:4:::1;69374:8;;:15;;;;;;;;;;;;;;;;;;69328:69::o:0;46340:322::-;46514:41;46533:12;:10;:12::i;:::-;46547:7;46514:18;:41::i;:::-;46506:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;46616:38;46630:4;46636:2;46640:7;46649:4;46616:13;:38::i;:::-;46340:322;;;;:::o;66366:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;68577:725::-;68695:13;68748:16;68756:7;68748;:16::i;:::-;68726:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;68868:5;68856:17;;:8;;;;;;;;;;;:17;;;68852:71;;;68897:14;68890:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68852:71;68935:28;68966:10;:8;:10::i;:::-;68935:41;;69038:1;69013:14;69007:28;:32;:287;;;;;;;;;;;;;;;;;69131:14;69172:18;:7;:16;:18::i;:::-;69217:13;69088:165;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;69007:287;68987:307;;;68577:725;;;;:::o;66447:32::-;;;;:::o;69875:151::-;20127:13;:11;:13::i;:::-;70001:17:::1;69985:13;:33;;;;;;;;;;;;:::i;:::-;;69875:151:::0;:::o;45447:164::-;45544:4;45568:18;:25;45587:5;45568:25;;;;;;;;;;;;;;;:35;45594:8;45568:35;;;;;;;;;;;;;;;;;;;;;;;;;45561:42;;45447:164;;;;:::o;69629:126::-;20127:13;:11;:13::i;:::-;69732:15:::1;69715:14;:32;;;;;;;;;;;;:::i;:::-;;69629:126:::0;:::o;21147:201::-;20127:13;:11;:13::i;:::-;21256:1:::1;21236:22;;:8;:22;;;;21228:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21312:28;21331:8;21312:18;:28::i;:::-;21147:201:::0;:::o;60191:224::-;60293:4;60332:35;60317:50;;;:11;:50;;;;:90;;;;60371:36;60395:11;60371:23;:36::i;:::-;60317:90;60310:97;;60191:224;;;:::o;20406:132::-;20481:12;:10;:12::i;:::-;20470:23;;:7;:5;:7::i;:::-;:23;;;20462:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;20406:132::o;54797:135::-;54879:16;54887:7;54879;:16::i;:::-;54871:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;54797:135;:::o;18792:98::-;18845:7;18872:10;18865:17;;18792:98;:::o;54076:174::-;54178:2;54151:15;:24;54167:7;54151:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;54234:7;54230:2;54196:46;;54205:23;54220:7;54205:14;:23::i;:::-;54196:46;;;;;;;;;;;;54076:174;;:::o;48695:264::-;48788:4;48805:13;48821:23;48836:7;48821:14;:23::i;:::-;48805:39;;48874:5;48863:16;;:7;:16;;;:52;;;;48883:32;48900:5;48907:7;48883:16;:32::i;:::-;48863:52;:87;;;;48943:7;48919:31;;:20;48931:7;48919:11;:20::i;:::-;:31;;;48863:87;48855:96;;;48695:264;;;;:::o;52694:1263::-;52853:4;52826:31;;:23;52841:7;52826:14;:23::i;:::-;:31;;;52818:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;52932:1;52918:16;;:2;:16;;;;52910:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;52988:42;53009:4;53015:2;53019:7;53028:1;52988:20;:42::i;:::-;53160:4;53133:31;;:23;53148:7;53133:14;:23::i;:::-;:31;;;53125:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;53278:15;:24;53294:7;53278:24;;;;;;;;;;;;53271:31;;;;;;;;;;;53773:1;53754:9;:15;53764:4;53754:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;53806:1;53789:9;:13;53799:2;53789:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;53848:2;53829:7;:16;53837:7;53829:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;53887:7;53883:2;53868:27;;53877:4;53868:27;;;;;;;;;;;;53908:41;53928:4;53934:2;53938:7;53947:1;53908:19;:41::i;:::-;52694:1263;;;:::o;51574:783::-;51634:13;51650:23;51665:7;51650:14;:23::i;:::-;51634:39;;51686:51;51707:5;51722:1;51726:7;51735:1;51686:20;:51::i;:::-;51850:23;51865:7;51850:14;:23::i;:::-;51842:31;;51921:15;:24;51937:7;51921:24;;;;;;;;;;;;51914:31;;;;;;;;;;;52186:1;52166:9;:16;52176:5;52166:16;;;;;;;;;;;;;;;;:21;;;;;;;;;;;52216:7;:16;52224:7;52216:16;;;;;;;;;;;;52209:23;;;;;;;;;;;52278:7;52274:1;52250:36;;52259:5;52250:36;;;;;;;;;;;;52299:50;52319:5;52334:1;52338:7;52347:1;52299:19;:50::i;:::-;51623:734;51574:783;:::o;47970:117::-;48036:7;48063;:16;48071:7;48063:16;;;;;;;;;;;;;;;;;;;;;48056:23;;47970:117;;;:::o;21508:191::-;21582:16;21601:6;;;;;;;;;;;21582:25;;21627:8;21618:6;;:17;;;;;;;;;;;;;;;;;;21682:8;21651:40;;21672:8;21651:40;;;;;;;;;;;;21571:128;21508:191;:::o;49301:110::-;49377:26;49387:2;49391:7;49377:26;;;;;;;;;;;;:9;:26::i;:::-;49301:110;;:::o;54393:315::-;54548:8;54539:17;;:5;:17;;;;54531:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;54635:8;54597:18;:25;54616:5;54597:25;;;;;;;;;;;;;;;:35;54623:8;54597:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;54681:8;54659:41;;54674:5;54659:41;;;54691:8;54659:41;;;;;;:::i;:::-;;;;;;;;54393:315;;;:::o;47543:313::-;47699:28;47709:4;47715:2;47719:7;47699:9;:28::i;:::-;47746:47;47769:4;47775:2;47779:7;47788:4;47746:22;:47::i;:::-;47738:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;47543:313;;;;:::o;48400:128::-;48465:4;48518:1;48489:31;;:17;48498:7;48489:8;:17::i;:::-;:31;;;;48482:38;;48400:128;;;:::o;66995:108::-;67055:13;67088:7;67081:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66995:108;:::o;16219:716::-;16275:13;16326:14;16363:1;16343:17;16354:5;16343:10;:17::i;:::-;:21;16326:38;;16379:20;16413:6;16402:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16379:41;;16435:11;16564:6;16560:2;16556:15;16548:6;16544:28;16537:35;;16601:288;16608:4;16601:288;;;16633:5;;;;;;;;16775:8;16770:2;16763:5;16759:14;16754:30;16749:3;16741:44;16831:2;16822:11;;;;;;:::i;:::-;;;;;16865:1;16856:5;:10;16852:21;;;16868:5;;16852:21;16601:288;;;16910:6;16903:13;;;;;16219:716;;;:::o;42538:305::-;42640:4;42692:25;42677:40;;;:11;:40;;;;:105;;;;42749:33;42734:48;;;:11;:48;;;;42677:105;:158;;;;42799:36;42823:11;42799:23;:36::i;:::-;42677:158;42657:178;;42538:305;;;:::o;67181:254::-;67371:56;67398:4;67404:2;67408:7;67417:9;67371:26;:56::i;:::-;67181:254;;;;:::o;58213:158::-;;;;;:::o;49638:319::-;49767:18;49773:2;49777:7;49767:5;:18::i;:::-;49818:53;49849:1;49853:2;49857:7;49866:4;49818:22;:53::i;:::-;49796:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;49638:319;;;:::o;55496:853::-;55650:4;55671:15;:2;:13;;;:15::i;:::-;55667:675;;;55723:2;55707:36;;;55744:12;:10;:12::i;:::-;55758:4;55764:7;55773:4;55707:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;55703:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55965:1;55948:6;:13;:18;55944:328;;;55991:60;;;;;;;;;;:::i;:::-;;;;;;;;55944:328;56222:6;56216:13;56207:6;56203:2;56199:15;56192:38;55703:584;55839:41;;;55829:51;;;:6;:51;;;;55822:58;;;;;55667:675;56326:4;56319:11;;55496:853;;;;;;;:::o;13085:922::-;13138:7;13158:14;13175:1;13158:18;;13225:6;13216:5;:15;13212:102;;13261:6;13252:15;;;;;;:::i;:::-;;;;;13296:2;13286:12;;;;13212:102;13341:6;13332:5;:15;13328:102;;13377:6;13368:15;;;;;;:::i;:::-;;;;;13412:2;13402:12;;;;13328:102;13457:6;13448:5;:15;13444:102;;13493:6;13484:15;;;;;;:::i;:::-;;;;;13528:2;13518:12;;;;13444:102;13573:5;13564;:14;13560:99;;13608:5;13599:14;;;;;;:::i;:::-;;;;;13642:1;13632:11;;;;13560:99;13686:5;13677;:14;13673:99;;13721:5;13712:14;;;;;;:::i;:::-;;;;;13755:1;13745:11;;;;13673:99;13799:5;13790;:14;13786:99;;13834:5;13825:14;;;;;;:::i;:::-;;;;;13868:1;13858:11;;;;13786:99;13912:5;13903;:14;13899:66;;13948:1;13938:11;;;;13899:66;13993:6;13986:13;;;13085:922;;;:::o;33970:157::-;34055:4;34094:25;34079:40;;;:11;:40;;;;34072:47;;33970:157;;;:::o;61328:915::-;61505:61;61532:4;61538:2;61542:12;61556:9;61505:26;:61::i;:::-;61595:1;61583:9;:13;61579:222;;;61726:63;;;;;;;;;;:::i;:::-;;;;;;;;61579:222;61813:15;61831:12;61813:30;;61876:1;61860:18;;:4;:18;;;61856:187;;;61895:40;61927:7;61895:31;:40::i;:::-;61856:187;;;61965:2;61957:10;;:4;:10;;;61953:90;;61984:47;62017:4;62023:7;61984:32;:47::i;:::-;61953:90;61856:187;62071:1;62057:16;;:2;:16;;;62053:183;;;62090:45;62127:7;62090:36;:45::i;:::-;62053:183;;;62163:4;62157:10;;:2;:10;;;62153:83;;62184:40;62212:2;62216:7;62184:27;:40::i;:::-;62153:83;62053:183;61494:749;61328:915;;;;:::o;50293:942::-;50387:1;50373:16;;:2;:16;;;;50365:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;50446:16;50454:7;50446;:16::i;:::-;50445:17;50437:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;50508:48;50537:1;50541:2;50545:7;50554:1;50508:20;:48::i;:::-;50655:16;50663:7;50655;:16::i;:::-;50654:17;50646:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;51070:1;51053:9;:13;51063:2;51053:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;51114:2;51095:7;:16;51103:7;51095:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;51159:7;51155:2;51134:33;;51151:1;51134:33;;;;;;;;;;;;51180:47;51208:1;51212:2;51216:7;51225:1;51180:19;:47::i;:::-;50293:942;;:::o;22939:326::-;22999:4;23256:1;23234:7;:19;;;:23;23227:30;;22939:326;;;:::o;57081:410::-;57271:1;57259:9;:13;57255:229;;;57309:1;57293:18;;:4;:18;;;57289:87;;57351:9;57332;:15;57342:4;57332:15;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;57289:87;57408:1;57394:16;;:2;:16;;;57390:83;;57448:9;57431;:13;57441:2;57431:13;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;57390:83;57255:229;57081:410;;;;:::o;62966:164::-;63070:10;:17;;;;63043:15;:24;63059:7;63043:24;;;;;;;;;;;:44;;;;63098:10;63114:7;63098:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62966:164;:::o;63757:988::-;64023:22;64073:1;64048:22;64065:4;64048:16;:22::i;:::-;:26;;;;:::i;:::-;64023:51;;64085:18;64106:17;:26;64124:7;64106:26;;;;;;;;;;;;64085:47;;64253:14;64239:10;:28;64235:328;;64284:19;64306:12;:18;64319:4;64306:18;;;;;;;;;;;;;;;:34;64325:14;64306:34;;;;;;;;;;;;64284:56;;64390:11;64357:12;:18;64370:4;64357:18;;;;;;;;;;;;;;;:30;64376:10;64357:30;;;;;;;;;;;:44;;;;64507:10;64474:17;:30;64492:11;64474:30;;;;;;;;;;;:43;;;;64269:294;64235:328;64659:17;:26;64677:7;64659:26;;;;;;;;;;;64652:33;;;64703:12;:18;64716:4;64703:18;;;;;;;;;;;;;;;:34;64722:14;64703:34;;;;;;;;;;;64696:41;;;63838:907;;63757:988;;:::o;65040:1079::-;65293:22;65338:1;65318:10;:17;;;;:21;;;;:::i;:::-;65293:46;;65350:18;65371:15;:24;65387:7;65371:24;;;;;;;;;;;;65350:45;;65722:19;65744:10;65755:14;65744:26;;;;;;;;:::i;:::-;;;;;;;;;;65722:48;;65808:11;65783:10;65794;65783:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;65919:10;65888:15;:28;65904:11;65888:28;;;;;;;;;;;:41;;;;66060:15;:24;66076:7;66060:24;;;;;;;;;;;66053:31;;;66095:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;65111:1008;;;65040:1079;:::o;62544:221::-;62629:14;62646:20;62663:2;62646:16;:20::i;:::-;62629:37;;62704:7;62677:12;:16;62690:2;62677:16;;;;;;;;;;;;;;;:24;62694:6;62677:24;;;;;;;;;;;:34;;;;62751:6;62722:17;:26;62740:7;62722:26;;;;;;;;;;;:35;;;;62618:147;62544:221;;:::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:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1179:5;1210:6;1204:13;1195:22;;1226:30;1250:5;1226:30;:::i;:::-;1125:137;;;;:::o;1268:::-;1313:5;1351:6;1338:20;1329:29;;1367:32;1393:5;1367:32;:::i;:::-;1268:137;;;;:::o;1411:141::-;1467:5;1498:6;1492:13;1483:22;;1514:32;1540:5;1514:32;:::i;:::-;1411:141;;;;:::o;1571:338::-;1626:5;1675:3;1668:4;1660:6;1656:17;1652:27;1642:122;;1683:79;;:::i;:::-;1642:122;1800:6;1787:20;1825:78;1899:3;1891:6;1884:4;1876:6;1872:17;1825:78;:::i;:::-;1816:87;;1632:277;1571:338;;;;:::o;1929:340::-;1985:5;2034:3;2027:4;2019:6;2015:17;2011:27;2001:122;;2042:79;;:::i;:::-;2001:122;2159:6;2146:20;2184:79;2259:3;2251:6;2244:4;2236:6;2232:17;2184:79;:::i;:::-;2175:88;;1991:278;1929:340;;;;:::o;2275:139::-;2321:5;2359:6;2346:20;2337:29;;2375:33;2402:5;2375:33;:::i;:::-;2275:139;;;;:::o;2420:329::-;2479:6;2528:2;2516:9;2507:7;2503:23;2499:32;2496:119;;;2534:79;;:::i;:::-;2496:119;2654:1;2679:53;2724:7;2715:6;2704:9;2700:22;2679:53;:::i;:::-;2669:63;;2625:117;2420:329;;;;:::o;2755:474::-;2823:6;2831;2880:2;2868:9;2859:7;2855:23;2851:32;2848:119;;;2886:79;;:::i;:::-;2848:119;3006:1;3031:53;3076:7;3067:6;3056:9;3052:22;3031:53;:::i;:::-;3021:63;;2977:117;3133:2;3159:53;3204:7;3195:6;3184:9;3180:22;3159:53;:::i;:::-;3149:63;;3104:118;2755:474;;;;;:::o;3235:619::-;3312:6;3320;3328;3377:2;3365:9;3356:7;3352:23;3348:32;3345:119;;;3383:79;;:::i;:::-;3345:119;3503:1;3528:53;3573:7;3564:6;3553:9;3549:22;3528:53;:::i;:::-;3518:63;;3474:117;3630:2;3656:53;3701:7;3692:6;3681:9;3677:22;3656:53;:::i;:::-;3646:63;;3601:118;3758:2;3784:53;3829:7;3820:6;3809:9;3805:22;3784:53;:::i;:::-;3774:63;;3729:118;3235:619;;;;;:::o;3860:943::-;3955:6;3963;3971;3979;4028:3;4016:9;4007:7;4003:23;3999:33;3996:120;;;4035:79;;:::i;:::-;3996:120;4155:1;4180:53;4225:7;4216:6;4205:9;4201:22;4180:53;:::i;:::-;4170:63;;4126:117;4282:2;4308:53;4353:7;4344:6;4333:9;4329:22;4308:53;:::i;:::-;4298:63;;4253:118;4410:2;4436:53;4481:7;4472:6;4461:9;4457:22;4436:53;:::i;:::-;4426:63;;4381:118;4566:2;4555:9;4551:18;4538:32;4597:18;4589:6;4586:30;4583:117;;;4619:79;;:::i;:::-;4583:117;4724:62;4778:7;4769:6;4758:9;4754:22;4724:62;:::i;:::-;4714:72;;4509:287;3860:943;;;;;;;:::o;4809:468::-;4874:6;4882;4931:2;4919:9;4910:7;4906:23;4902:32;4899:119;;;4937:79;;:::i;:::-;4899:119;5057:1;5082:53;5127:7;5118:6;5107:9;5103:22;5082:53;:::i;:::-;5072:63;;5028:117;5184:2;5210:50;5252:7;5243:6;5232:9;5228:22;5210:50;:::i;:::-;5200:60;;5155:115;4809:468;;;;;:::o;5283:474::-;5351:6;5359;5408:2;5396:9;5387:7;5383:23;5379:32;5376:119;;;5414:79;;:::i;:::-;5376:119;5534:1;5559:53;5604:7;5595:6;5584:9;5580:22;5559:53;:::i;:::-;5549:63;;5505:117;5661:2;5687:53;5732:7;5723:6;5712:9;5708:22;5687:53;:::i;:::-;5677:63;;5632:118;5283:474;;;;;:::o;5763:323::-;5819:6;5868:2;5856:9;5847:7;5843:23;5839:32;5836:119;;;5874:79;;:::i;:::-;5836:119;5994:1;6019:50;6061:7;6052:6;6041:9;6037:22;6019:50;:::i;:::-;6009:60;;5965:114;5763:323;;;;:::o;6092:345::-;6159:6;6208:2;6196:9;6187:7;6183:23;6179:32;6176:119;;;6214:79;;:::i;:::-;6176:119;6334:1;6359:61;6412:7;6403:6;6392:9;6388:22;6359:61;:::i;:::-;6349:71;;6305:125;6092:345;;;;:::o;6443:327::-;6501:6;6550:2;6538:9;6529:7;6525:23;6521:32;6518:119;;;6556:79;;:::i;:::-;6518:119;6676:1;6701:52;6745:7;6736:6;6725:9;6721:22;6701:52;:::i;:::-;6691:62;;6647:116;6443:327;;;;:::o;6776:349::-;6845:6;6894:2;6882:9;6873:7;6869:23;6865:32;6862:119;;;6900:79;;:::i;:::-;6862:119;7020:1;7045:63;7100:7;7091:6;7080:9;7076:22;7045:63;:::i;:::-;7035:73;;6991:127;6776:349;;;;:::o;7131:509::-;7200:6;7249:2;7237:9;7228:7;7224:23;7220:32;7217:119;;;7255:79;;:::i;:::-;7217:119;7403:1;7392:9;7388:17;7375:31;7433:18;7425:6;7422:30;7419:117;;;7455:79;;:::i;:::-;7419:117;7560:63;7615:7;7606:6;7595:9;7591:22;7560:63;:::i;:::-;7550:73;;7346:287;7131:509;;;;:::o;7646:329::-;7705:6;7754:2;7742:9;7733:7;7729:23;7725:32;7722:119;;;7760:79;;:::i;:::-;7722:119;7880:1;7905:53;7950:7;7941:6;7930:9;7926:22;7905:53;:::i;:::-;7895:63;;7851:117;7646:329;;;;:::o;7981:179::-;8050:10;8071:46;8113:3;8105:6;8071:46;:::i;:::-;8149:4;8144:3;8140:14;8126:28;;7981:179;;;;:::o;8166:118::-;8253:24;8271:5;8253:24;:::i;:::-;8248:3;8241:37;8166:118;;:::o;8320:732::-;8439:3;8468:54;8516:5;8468:54;:::i;:::-;8538:86;8617:6;8612:3;8538:86;:::i;:::-;8531:93;;8648:56;8698:5;8648:56;:::i;:::-;8727:7;8758:1;8743:284;8768:6;8765:1;8762:13;8743:284;;;8844:6;8838:13;8871:63;8930:3;8915:13;8871:63;:::i;:::-;8864:70;;8957:60;9010:6;8957:60;:::i;:::-;8947:70;;8803:224;8790:1;8787;8783:9;8778:14;;8743:284;;;8747:14;9043:3;9036:10;;8444:608;;;8320:732;;;;:::o;9058:109::-;9139:21;9154:5;9139:21;:::i;:::-;9134:3;9127:34;9058:109;;:::o;9173:360::-;9259:3;9287:38;9319:5;9287:38;:::i;:::-;9341:70;9404:6;9399:3;9341:70;:::i;:::-;9334:77;;9420:52;9465:6;9460:3;9453:4;9446:5;9442:16;9420:52;:::i;:::-;9497:29;9519:6;9497:29;:::i;:::-;9492:3;9488:39;9481:46;;9263:270;9173:360;;;;:::o;9539:157::-;9639:50;9683:5;9639:50;:::i;:::-;9634:3;9627:63;9539:157;;:::o;9702:364::-;9790:3;9818:39;9851:5;9818:39;:::i;:::-;9873:71;9937:6;9932:3;9873:71;:::i;:::-;9866:78;;9953:52;9998:6;9993:3;9986:4;9979:5;9975:16;9953:52;:::i;:::-;10030:29;10052:6;10030:29;:::i;:::-;10025:3;10021:39;10014:46;;9794:272;9702:364;;;;:::o;10072:377::-;10178:3;10206:39;10239:5;10206:39;:::i;:::-;10261:89;10343:6;10338:3;10261:89;:::i;:::-;10254:96;;10359:52;10404:6;10399:3;10392:4;10385:5;10381:16;10359:52;:::i;:::-;10436:6;10431:3;10427:16;10420:23;;10182:267;10072:377;;;;:::o;10479:845::-;10582:3;10619:5;10613:12;10648:36;10674:9;10648:36;:::i;:::-;10700:89;10782:6;10777:3;10700:89;:::i;:::-;10693:96;;10820:1;10809:9;10805:17;10836:1;10831:137;;;;10982:1;10977:341;;;;10798:520;;10831:137;10915:4;10911:9;10900;10896:25;10891:3;10884:38;10951:6;10946:3;10942:16;10935:23;;10831:137;;10977:341;11044:38;11076:5;11044:38;:::i;:::-;11104:1;11118:154;11132:6;11129:1;11126:13;11118:154;;;11206:7;11200:14;11196:1;11191:3;11187:11;11180:35;11256:1;11247:7;11243:15;11232:26;;11154:4;11151:1;11147:12;11142:17;;11118:154;;;11301:6;11296:3;11292:16;11285:23;;10984:334;;10798:520;;10586:738;;10479:845;;;;:::o;11330:366::-;11472:3;11493:67;11557:2;11552:3;11493:67;:::i;:::-;11486:74;;11569:93;11658:3;11569:93;:::i;:::-;11687:2;11682:3;11678:12;11671:19;;11330:366;;;:::o;11702:::-;11844:3;11865:67;11929:2;11924:3;11865:67;:::i;:::-;11858:74;;11941:93;12030:3;11941:93;:::i;:::-;12059:2;12054:3;12050:12;12043:19;;11702:366;;;:::o;12074:::-;12216:3;12237:67;12301:2;12296:3;12237:67;:::i;:::-;12230:74;;12313:93;12402:3;12313:93;:::i;:::-;12431:2;12426:3;12422:12;12415:19;;12074:366;;;:::o;12446:::-;12588:3;12609:67;12673:2;12668:3;12609:67;:::i;:::-;12602:74;;12685:93;12774:3;12685:93;:::i;:::-;12803:2;12798:3;12794:12;12787:19;;12446:366;;;:::o;12818:::-;12960:3;12981:67;13045:2;13040:3;12981:67;:::i;:::-;12974:74;;13057:93;13146:3;13057:93;:::i;:::-;13175:2;13170:3;13166:12;13159:19;;12818:366;;;:::o;13190:::-;13332:3;13353:67;13417:2;13412:3;13353:67;:::i;:::-;13346:74;;13429:93;13518:3;13429:93;:::i;:::-;13547:2;13542:3;13538:12;13531:19;;13190:366;;;:::o;13562:::-;13704:3;13725:67;13789:2;13784:3;13725:67;:::i;:::-;13718:74;;13801:93;13890:3;13801:93;:::i;:::-;13919:2;13914:3;13910:12;13903:19;;13562:366;;;:::o;13934:::-;14076:3;14097:67;14161:2;14156:3;14097:67;:::i;:::-;14090:74;;14173:93;14262:3;14173:93;:::i;:::-;14291:2;14286:3;14282:12;14275:19;;13934:366;;;:::o;14306:::-;14448:3;14469:67;14533:2;14528:3;14469:67;:::i;:::-;14462:74;;14545:93;14634:3;14545:93;:::i;:::-;14663:2;14658:3;14654:12;14647:19;;14306:366;;;:::o;14678:::-;14820:3;14841:67;14905:2;14900:3;14841:67;:::i;:::-;14834:74;;14917:93;15006:3;14917:93;:::i;:::-;15035:2;15030:3;15026:12;15019:19;;14678:366;;;:::o;15050:::-;15192:3;15213:67;15277:2;15272:3;15213:67;:::i;:::-;15206:74;;15289:93;15378:3;15289:93;:::i;:::-;15407:2;15402:3;15398:12;15391:19;;15050:366;;;:::o;15422:::-;15564:3;15585:67;15649:2;15644:3;15585:67;:::i;:::-;15578:74;;15661:93;15750:3;15661:93;:::i;:::-;15779:2;15774:3;15770:12;15763:19;;15422:366;;;:::o;15794:::-;15936:3;15957:67;16021:2;16016:3;15957:67;:::i;:::-;15950:74;;16033:93;16122:3;16033:93;:::i;:::-;16151:2;16146:3;16142:12;16135:19;;15794:366;;;:::o;16166:::-;16308:3;16329:67;16393:2;16388:3;16329:67;:::i;:::-;16322:74;;16405:93;16494:3;16405:93;:::i;:::-;16523:2;16518:3;16514:12;16507:19;;16166:366;;;:::o;16538:398::-;16697:3;16718:83;16799:1;16794:3;16718:83;:::i;:::-;16711:90;;16810:93;16899:3;16810:93;:::i;:::-;16928:1;16923:3;16919:11;16912:18;;16538:398;;;:::o;16942:366::-;17084:3;17105:67;17169:2;17164:3;17105:67;:::i;:::-;17098:74;;17181:93;17270:3;17181:93;:::i;:::-;17299:2;17294:3;17290:12;17283:19;;16942:366;;;:::o;17314:::-;17456:3;17477:67;17541:2;17536:3;17477:67;:::i;:::-;17470:74;;17553:93;17642:3;17553:93;:::i;:::-;17671:2;17666:3;17662:12;17655:19;;17314:366;;;:::o;17686:::-;17828:3;17849:67;17913:2;17908:3;17849:67;:::i;:::-;17842:74;;17925:93;18014:3;17925:93;:::i;:::-;18043:2;18038:3;18034:12;18027:19;;17686:366;;;:::o;18058:108::-;18135:24;18153:5;18135:24;:::i;:::-;18130:3;18123:37;18058:108;;:::o;18172:118::-;18259:24;18277:5;18259:24;:::i;:::-;18254:3;18247:37;18172:118;;:::o;18296:589::-;18521:3;18543:95;18634:3;18625:6;18543:95;:::i;:::-;18536:102;;18655:95;18746:3;18737:6;18655:95;:::i;:::-;18648:102;;18767:92;18855:3;18846:6;18767:92;:::i;:::-;18760:99;;18876:3;18869:10;;18296:589;;;;;;:::o;18891:379::-;19075:3;19097:147;19240:3;19097:147;:::i;:::-;19090:154;;19261:3;19254:10;;18891:379;;;:::o;19276:222::-;19369:4;19407:2;19396:9;19392:18;19384:26;;19420:71;19488:1;19477:9;19473:17;19464:6;19420:71;:::i;:::-;19276:222;;;;:::o;19504:442::-;19653:4;19691:2;19680:9;19676:18;19668:26;;19704:71;19772:1;19761:9;19757:17;19748:6;19704:71;:::i;:::-;19785:72;19853:2;19842:9;19838:18;19829:6;19785:72;:::i;:::-;19867;19935:2;19924:9;19920:18;19911:6;19867:72;:::i;:::-;19504:442;;;;;;:::o;19952:640::-;20147:4;20185:3;20174:9;20170:19;20162:27;;20199:71;20267:1;20256:9;20252:17;20243:6;20199:71;:::i;:::-;20280:72;20348:2;20337:9;20333:18;20324:6;20280:72;:::i;:::-;20362;20430:2;20419:9;20415:18;20406:6;20362:72;:::i;:::-;20481:9;20475:4;20471:20;20466:2;20455:9;20451:18;20444:48;20509:76;20580:4;20571:6;20509:76;:::i;:::-;20501:84;;19952:640;;;;;;;:::o;20598:373::-;20741:4;20779:2;20768:9;20764:18;20756:26;;20828:9;20822:4;20818:20;20814:1;20803:9;20799:17;20792:47;20856:108;20959:4;20950:6;20856:108;:::i;:::-;20848:116;;20598:373;;;;:::o;20977:210::-;21064:4;21102:2;21091:9;21087:18;21079:26;;21115:65;21177:1;21166:9;21162:17;21153:6;21115:65;:::i;:::-;20977:210;;;;:::o;21193:248::-;21299:4;21337:2;21326:9;21322:18;21314:26;;21350:84;21431:1;21420:9;21416:17;21407:6;21350:84;:::i;:::-;21193:248;;;;:::o;21447:313::-;21560:4;21598:2;21587:9;21583:18;21575:26;;21647:9;21641:4;21637:20;21633:1;21622:9;21618:17;21611:47;21675:78;21748:4;21739:6;21675:78;:::i;:::-;21667:86;;21447:313;;;;:::o;21766:419::-;21932:4;21970:2;21959:9;21955:18;21947:26;;22019:9;22013:4;22009:20;22005:1;21994:9;21990:17;21983:47;22047:131;22173:4;22047:131;:::i;:::-;22039:139;;21766:419;;;:::o;22191:::-;22357:4;22395:2;22384:9;22380:18;22372:26;;22444:9;22438:4;22434:20;22430:1;22419:9;22415:17;22408:47;22472:131;22598:4;22472:131;:::i;:::-;22464:139;;22191:419;;;:::o;22616:::-;22782:4;22820:2;22809:9;22805:18;22797:26;;22869:9;22863:4;22859:20;22855:1;22844:9;22840:17;22833:47;22897:131;23023:4;22897:131;:::i;:::-;22889:139;;22616:419;;;:::o;23041:::-;23207:4;23245:2;23234:9;23230:18;23222:26;;23294:9;23288:4;23284:20;23280:1;23269:9;23265:17;23258:47;23322:131;23448:4;23322:131;:::i;:::-;23314:139;;23041:419;;;:::o;23466:::-;23632:4;23670:2;23659:9;23655:18;23647:26;;23719:9;23713:4;23709:20;23705:1;23694:9;23690:17;23683:47;23747:131;23873:4;23747:131;:::i;:::-;23739:139;;23466:419;;;:::o;23891:::-;24057:4;24095:2;24084:9;24080:18;24072:26;;24144:9;24138:4;24134:20;24130:1;24119:9;24115:17;24108:47;24172:131;24298:4;24172:131;:::i;:::-;24164:139;;23891:419;;;:::o;24316:::-;24482:4;24520:2;24509:9;24505:18;24497:26;;24569:9;24563:4;24559:20;24555:1;24544:9;24540:17;24533:47;24597:131;24723:4;24597:131;:::i;:::-;24589:139;;24316:419;;;:::o;24741:::-;24907:4;24945:2;24934:9;24930:18;24922:26;;24994:9;24988:4;24984:20;24980:1;24969:9;24965:17;24958:47;25022:131;25148:4;25022:131;:::i;:::-;25014:139;;24741:419;;;:::o;25166:::-;25332:4;25370:2;25359:9;25355:18;25347:26;;25419:9;25413:4;25409:20;25405:1;25394:9;25390:17;25383:47;25447:131;25573:4;25447:131;:::i;:::-;25439:139;;25166:419;;;:::o;25591:::-;25757:4;25795:2;25784:9;25780:18;25772:26;;25844:9;25838:4;25834:20;25830:1;25819:9;25815:17;25808:47;25872:131;25998:4;25872:131;:::i;:::-;25864:139;;25591:419;;;:::o;26016:::-;26182:4;26220:2;26209:9;26205:18;26197:26;;26269:9;26263:4;26259:20;26255:1;26244:9;26240:17;26233:47;26297:131;26423:4;26297:131;:::i;:::-;26289:139;;26016:419;;;:::o;26441:::-;26607:4;26645:2;26634:9;26630:18;26622:26;;26694:9;26688:4;26684:20;26680:1;26669:9;26665:17;26658:47;26722:131;26848:4;26722:131;:::i;:::-;26714:139;;26441:419;;;:::o;26866:::-;27032:4;27070:2;27059:9;27055:18;27047:26;;27119:9;27113:4;27109:20;27105:1;27094:9;27090:17;27083:47;27147:131;27273:4;27147:131;:::i;:::-;27139:139;;26866:419;;;:::o;27291:::-;27457:4;27495:2;27484:9;27480:18;27472:26;;27544:9;27538:4;27534:20;27530:1;27519:9;27515:17;27508:47;27572:131;27698:4;27572:131;:::i;:::-;27564:139;;27291:419;;;:::o;27716:::-;27882:4;27920:2;27909:9;27905:18;27897:26;;27969:9;27963:4;27959:20;27955:1;27944:9;27940:17;27933:47;27997:131;28123:4;27997:131;:::i;:::-;27989:139;;27716:419;;;:::o;28141:::-;28307:4;28345:2;28334:9;28330:18;28322:26;;28394:9;28388:4;28384:20;28380:1;28369:9;28365:17;28358:47;28422:131;28548:4;28422:131;:::i;:::-;28414:139;;28141:419;;;:::o;28566:::-;28732:4;28770:2;28759:9;28755:18;28747:26;;28819:9;28813:4;28809:20;28805:1;28794:9;28790:17;28783:47;28847:131;28973:4;28847:131;:::i;:::-;28839:139;;28566:419;;;:::o;28991:222::-;29084:4;29122:2;29111:9;29107:18;29099:26;;29135:71;29203:1;29192:9;29188:17;29179:6;29135:71;:::i;:::-;28991:222;;;;:::o;29219:129::-;29253:6;29280:20;;:::i;:::-;29270:30;;29309:33;29337:4;29329:6;29309:33;:::i;:::-;29219:129;;;:::o;29354:75::-;29387:6;29420:2;29414:9;29404:19;;29354:75;:::o;29435:307::-;29496:4;29586:18;29578:6;29575:30;29572:56;;;29608:18;;:::i;:::-;29572:56;29646:29;29668:6;29646:29;:::i;:::-;29638:37;;29730:4;29724;29720:15;29712:23;;29435:307;;;:::o;29748:308::-;29810:4;29900:18;29892:6;29889:30;29886:56;;;29922:18;;:::i;:::-;29886:56;29960:29;29982:6;29960:29;:::i;:::-;29952:37;;30044:4;30038;30034:15;30026:23;;29748:308;;;:::o;30062:132::-;30129:4;30152:3;30144:11;;30182:4;30177:3;30173:14;30165:22;;30062:132;;;:::o;30200:141::-;30249:4;30272:3;30264:11;;30295:3;30292:1;30285:14;30329:4;30326:1;30316:18;30308:26;;30200:141;;;:::o;30347:114::-;30414:6;30448:5;30442:12;30432:22;;30347:114;;;:::o;30467:98::-;30518:6;30552:5;30546:12;30536:22;;30467:98;;;:::o;30571:99::-;30623:6;30657:5;30651:12;30641:22;;30571:99;;;:::o;30676:113::-;30746:4;30778;30773:3;30769:14;30761:22;;30676:113;;;:::o;30795:184::-;30894:11;30928:6;30923:3;30916:19;30968:4;30963:3;30959:14;30944:29;;30795:184;;;;:::o;30985:168::-;31068:11;31102:6;31097:3;31090:19;31142:4;31137:3;31133:14;31118:29;;30985:168;;;;:::o;31159:147::-;31260:11;31297:3;31282:18;;31159:147;;;;:::o;31312:169::-;31396:11;31430:6;31425:3;31418:19;31470:4;31465:3;31461:14;31446:29;;31312:169;;;;:::o;31487:148::-;31589:11;31626:3;31611:18;;31487:148;;;;:::o;31641:305::-;31681:3;31700:20;31718:1;31700:20;:::i;:::-;31695:25;;31734:20;31752:1;31734:20;:::i;:::-;31729:25;;31888:1;31820:66;31816:74;31813:1;31810:81;31807:107;;;31894:18;;:::i;:::-;31807:107;31938:1;31935;31931:9;31924:16;;31641:305;;;;:::o;31952:191::-;31992:4;32012:20;32030:1;32012:20;:::i;:::-;32007:25;;32046:20;32064:1;32046:20;:::i;:::-;32041:25;;32085:1;32082;32079:8;32076:34;;;32090:18;;:::i;:::-;32076:34;32135:1;32132;32128:9;32120:17;;31952:191;;;;:::o;32149:96::-;32186:7;32215:24;32233:5;32215:24;:::i;:::-;32204:35;;32149:96;;;:::o;32251:90::-;32285:7;32328:5;32321:13;32314:21;32303:32;;32251:90;;;:::o;32347:149::-;32383:7;32423:66;32416:5;32412:78;32401:89;;32347:149;;;:::o;32502:126::-;32539:7;32579:42;32572:5;32568:54;32557:65;;32502:126;;;:::o;32634:77::-;32671:7;32700:5;32689:16;;32634:77;;;:::o;32717:139::-;32780:9;32813:37;32844:5;32813:37;:::i;:::-;32800:50;;32717:139;;;:::o;32862:126::-;32912:9;32945:37;32976:5;32945:37;:::i;:::-;32932:50;;32862:126;;;:::o;32994:113::-;33044:9;33077:24;33095:5;33077:24;:::i;:::-;33064:37;;32994:113;;;:::o;33113:154::-;33197:6;33192:3;33187;33174:30;33259:1;33250:6;33245:3;33241:16;33234:27;33113:154;;;:::o;33273:307::-;33341:1;33351:113;33365:6;33362:1;33359:13;33351:113;;;33450:1;33445:3;33441:11;33435:18;33431:1;33426:3;33422:11;33415:39;33387:2;33384:1;33380:10;33375:15;;33351:113;;;33482:6;33479:1;33476:13;33473:101;;;33562:1;33553:6;33548:3;33544:16;33537:27;33473:101;33322:258;33273:307;;;:::o;33586:320::-;33630:6;33667:1;33661:4;33657:12;33647:22;;33714:1;33708:4;33704:12;33735:18;33725:81;;33791:4;33783:6;33779:17;33769:27;;33725:81;33853:2;33845:6;33842:14;33822:18;33819:38;33816:84;;;33872:18;;:::i;:::-;33816:84;33637:269;33586:320;;;:::o;33912:281::-;33995:27;34017:4;33995:27;:::i;:::-;33987:6;33983:40;34125:6;34113:10;34110:22;34089:18;34077:10;34074:34;34071:62;34068:88;;;34136:18;;:::i;:::-;34068:88;34176:10;34172:2;34165:22;33955:238;33912:281;;:::o;34199:233::-;34238:3;34261:24;34279:5;34261:24;:::i;:::-;34252:33;;34307:66;34300:5;34297:77;34294:103;;;34377:18;;:::i;:::-;34294:103;34424:1;34417:5;34413:13;34406:20;;34199:233;;;:::o;34438:180::-;34486:77;34483:1;34476:88;34583:4;34580:1;34573:15;34607:4;34604:1;34597:15;34624:180;34672:77;34669:1;34662:88;34769:4;34766:1;34759:15;34793:4;34790:1;34783:15;34810:180;34858:77;34855:1;34848:88;34955:4;34952:1;34945:15;34979:4;34976:1;34969:15;34996:180;35044:77;35041:1;35034:88;35141:4;35138:1;35131:15;35165:4;35162:1;35155:15;35182:180;35230:77;35227:1;35220:88;35327:4;35324:1;35317:15;35351:4;35348:1;35341:15;35368:180;35416:77;35413:1;35406:88;35513:4;35510:1;35503:15;35537:4;35534:1;35527:15;35554:117;35663:1;35660;35653:12;35677:117;35786:1;35783;35776:12;35800:117;35909:1;35906;35899:12;35923:117;36032:1;36029;36022:12;36046:102;36087:6;36138:2;36134:7;36129:2;36122:5;36118:14;36114:28;36104:38;;36046:102;;;:::o;36154:232::-;36294:34;36290:1;36282:6;36278:14;36271:58;36363:15;36358:2;36350:6;36346:15;36339:40;36154:232;:::o;36392:230::-;36532:34;36528:1;36520:6;36516:14;36509:58;36601:13;36596:2;36588:6;36584:15;36577:38;36392:230;:::o;36628:237::-;36768:34;36764:1;36756:6;36752:14;36745:58;36837:20;36832:2;36824:6;36820:15;36813:45;36628:237;:::o;36871:225::-;37011:34;37007:1;36999:6;36995:14;36988:58;37080:8;37075:2;37067:6;37063:15;37056:33;36871:225;:::o;37102:224::-;37242:34;37238:1;37230:6;37226:14;37219:58;37311:7;37306:2;37298:6;37294:15;37287:32;37102:224;:::o;37332:178::-;37472:30;37468:1;37460:6;37456:14;37449:54;37332:178;:::o;37516:223::-;37656:34;37652:1;37644:6;37640:14;37633:58;37725:6;37720:2;37712:6;37708:15;37701:31;37516:223;:::o;37745:175::-;37885:27;37881:1;37873:6;37869:14;37862:51;37745:175;:::o;37926:228::-;38066:34;38062:1;38054:6;38050:14;38043:58;38135:11;38130:2;38122:6;38118:15;38111:36;37926:228;:::o;38160:182::-;38300:34;38296:1;38288:6;38284:14;38277:58;38160:182;:::o;38348:::-;38488:34;38484:1;38476:6;38472:14;38465:58;38348:182;:::o;38536:234::-;38676:34;38672:1;38664:6;38660:14;38653:58;38745:17;38740:2;38732:6;38728:15;38721:42;38536:234;:::o;38776:174::-;38916:26;38912:1;38904:6;38900:14;38893:50;38776:174;:::o;38956:220::-;39096:34;39092:1;39084:6;39080:14;39073:58;39165:3;39160:2;39152:6;39148:15;39141:28;38956:220;:::o;39182:114::-;;:::o;39302:248::-;39442:34;39438:1;39430:6;39426:14;39419:58;39511:31;39506:2;39498:6;39494:15;39487:56;39302:248;:::o;39556:231::-;39696:34;39692:1;39684:6;39680:14;39673:58;39765:14;39760:2;39752:6;39748:15;39741:39;39556:231;:::o;39793:240::-;39933:34;39929:1;39921:6;39917:14;39910:58;40002:23;39997:2;39989:6;39985:15;39978:48;39793:240;:::o;40039:122::-;40112:24;40130:5;40112:24;:::i;:::-;40105:5;40102:35;40092:63;;40151:1;40148;40141:12;40092:63;40039:122;:::o;40167:116::-;40237:21;40252:5;40237:21;:::i;:::-;40230:5;40227:32;40217:60;;40273:1;40270;40263:12;40217:60;40167:116;:::o;40289:120::-;40361:23;40378:5;40361:23;:::i;:::-;40354:5;40351:34;40341:62;;40399:1;40396;40389:12;40341:62;40289:120;:::o;40415:122::-;40488:24;40506:5;40488:24;:::i;:::-;40481:5;40478:35;40468:63;;40527:1;40524;40517:12;40468:63;40415:122;:::o
Swarm Source
ipfs://2066944db13deca1eed0548c7c22c63fec3d75944d9b0e66a9abf6fe4f05a66c