Source Code
Overview
S Balance
S Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 64 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Get Wolf Pre Min... | 53114425 | 85 days ago | IN | 0 S | 0.01435747 | ||||
| Get Wolf Pre Min... | 53114346 | 85 days ago | IN | 0 S | 0.01459747 | ||||
| Get Wolf Pre Min... | 53034358 | 86 days ago | IN | 0 S | 0.01687323 | ||||
| Get Wolf Pre Min... | 53034327 | 86 days ago | IN | 0 S | 0.01713723 | ||||
| Get Wolf Pre Min... | 53034224 | 86 days ago | IN | 0 S | 0.01697553 | ||||
| Get Wolf Pre Min... | 53011312 | 86 days ago | IN | 0 S | 0.01660923 | ||||
| Get Wolf Pre Min... | 53011275 | 86 days ago | IN | 0 S | 0.01687323 | ||||
| Get Wolf Pre Min... | 53011237 | 86 days ago | IN | 0 S | 0.01687323 | ||||
| Get Wolf Pre Min... | 53010941 | 86 days ago | IN | 0 S | 0.01660923 | ||||
| Get Wolf Pre Min... | 53010909 | 86 days ago | IN | 0 S | 0.01840716 | ||||
| Get Wolf Pre Min... | 53010866 | 86 days ago | IN | 0 S | 0.01823076 | ||||
| Get Wolf Pre Min... | 52826500 | 87 days ago | IN | 0 S | 0.01493247 | ||||
| Get Wolf Pre Min... | 52826493 | 87 days ago | IN | 0 S | 0.03739029 | ||||
| Get Wolf Pre Min... | 52826448 | 87 days ago | IN | 0 S | 0.03739029 | ||||
| Get Wolf Pre Min... | 52826434 | 87 days ago | IN | 0 S | 0.03739029 | ||||
| Get Wolf Pre Min... | 52826421 | 87 days ago | IN | 0 S | 0.03739029 | ||||
| Get Wolf Pre Min... | 52826401 | 87 days ago | IN | 0 S | 0.03739029 | ||||
| Get Wolf Pre Min... | 52826391 | 87 days ago | IN | 0 S | 0.03739029 | ||||
| Get Wolf Pre Min... | 52826375 | 87 days ago | IN | 0 S | 0.03739029 | ||||
| Get Wolf Pre Min... | 52826359 | 87 days ago | IN | 0 S | 0.03739029 | ||||
| Get Wolf Pre Min... | 52826349 | 87 days ago | IN | 0 S | 0.03739029 | ||||
| Get Wolf Pre Min... | 52826333 | 87 days ago | IN | 0 S | 0.03739029 | ||||
| Get Wolf Pre Min... | 52826323 | 87 days ago | IN | 0 S | 0.03739029 | ||||
| Get Wolf Pre Min... | 52825805 | 87 days ago | IN | 0 S | 0.03739029 | ||||
| Get Wolf Pre Min... | 52825790 | 87 days ago | IN | 0 S | 0.03739029 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Cross-Chain Transactions
Loading...
Loading
Contract Name:
WOLF
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity)
/**
*Submitted for verification at SonicScan.org on 2025-10-29
*/
// SPDX-License-Identifier: MIT
pragma solidity =0.8.13 ^0.8.0 ^0.8.1 ^0.8.13;
// lib/openzeppelin-contracts/contracts/utils/Address.sol
// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)
/**
* @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);
}
}
}
// lib/openzeppelin-contracts/contracts/utils/Context.sol
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
/**
* @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;
}
}
// src/FeeM.sol
abstract contract FeeM {
/// @dev Register my contract on Sonic FeeM
function registerMe() external {
(bool _success,) = address(0xDC2B0D2Dd2b7759D97D50db4eabDC36973110830).call(
abi.encodeWithSignature("selfRegister(uint256)", 76)
);
require(_success, "FeeM registration failed");
}
}
// lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
/**
* @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);
}
// lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)
/**
* @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);
}
// lib/openzeppelin-contracts/contracts/token/ERC721/IERC721Receiver.sol
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)
/**
* @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);
}
// src/interfaces/IPair.sol
interface IPair {
function sync() external;
}
// src/interfaces/ISheep.sol
interface ISheep {
function transferOwnership(address newOwner) external;
function eatSheep(address _victim, uint256 _amount, address _owner, uint256 _mintPercent) external;
function transferFrom(address from, address to, uint256 amount) external;
function transfer(address to, uint256 amount) external returns (bool);
function burnSheep(uint256 balSheepHere) external;
function owner() external view returns (address);
function wGasToken() external view returns (address);
function wolf() external view returns (address);
function balanceOf(address account) external view returns (uint256);
function pastured() external view returns (bool);
function saleStarted() external view returns (bool);
}
// src/interfaces/IWolfMetadata.sol
interface IWolfMetadata {
function tokenURI(uint256 tokenId) external view returns (string memory);
}
// lib/openzeppelin-contracts/contracts/utils/math/Math.sol
// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)
/**
* @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);
}
}
}
// lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
/**
* @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;
}
}
// lib/openzeppelin-contracts/contracts/interfaces/IERC2981.sol
// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)
/**
* @dev Interface for the NFT Royalty Standard.
*
* A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
* support for royalty payments across all NFT marketplaces and ecosystem participants.
*
* _Available since v4.5._
*/
interface IERC2981 is IERC165 {
/**
* @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
* exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
*/
function royaltyInfo(uint256 tokenId, uint256 salePrice)
external
view
returns (address receiver, uint256 royaltyAmount);
}
// lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol)
/**
* @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);
}
// lib/openzeppelin-contracts/contracts/access/Ownable.sol
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)
/**
* @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);
}
}
// lib/openzeppelin-contracts/contracts/utils/Strings.sol
// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)
/**
* @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);
}
}
// lib/openzeppelin-contracts/contracts/token/ERC721/extensions/IERC721Enumerable.sol
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)
/**
* @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);
}
// lib/openzeppelin-contracts/contracts/token/ERC721/extensions/IERC721Metadata.sol
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)
/**
* @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);
}
// lib/openzeppelin-contracts/contracts/access/Ownable2Step.sol
// OpenZeppelin Contracts (last updated v4.8.0) (access/Ownable2Step.sol)
/**
* @dev Contract module which provides 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} and {acceptOwnership}.
*
* This module is used through inheritance. It will make available all functions
* from parent (Ownable).
*/
abstract contract Ownable2Step is Ownable {
address private _pendingOwner;
event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);
/**
* @dev Returns the address of the pending owner.
*/
function pendingOwner() public view virtual returns (address) {
return _pendingOwner;
}
/**
* @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual override onlyOwner {
_pendingOwner = newOwner;
emit OwnershipTransferStarted(owner(), newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner.
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual override {
delete _pendingOwner;
super._transferOwnership(newOwner);
}
/**
* @dev The new owner accepts the ownership transfer.
*/
function acceptOwnership() external {
address sender = _msgSender();
require(pendingOwner() == sender, "Ownable2Step: caller is not the new owner");
_transferOwnership(sender);
}
}
// lib/openzeppelin-contracts/contracts/token/ERC721/ERC721.sol
// OpenZeppelin Contracts (last updated v4.8.2) (token/ERC721/ERC721.sol)
/**
* @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
* the Metadata extension, but not including the Enumerable extension, which is available separately as
* {ERC721Enumerable}.
*/
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
using Address for address;
using Strings for uint256;
// Token name
string private _name;
// Token symbol
string private _symbol;
// Mapping from token ID to owner address
mapping(uint256 => address) private _owners;
// Mapping owner address to token count
mapping(address => uint256) private _balances;
// Mapping from token ID to approved address
mapping(uint256 => address) private _tokenApprovals;
// Mapping from owner to operator approvals
mapping(address => mapping(address => bool)) private _operatorApprovals;
/**
* @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
*/
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
return
interfaceId == type(IERC721).interfaceId ||
interfaceId == type(IERC721Metadata).interfaceId ||
super.supportsInterface(interfaceId);
}
/**
* @dev See {IERC721-balanceOf}.
*/
function balanceOf(address owner) public view virtual override returns (uint256) {
require(owner != address(0), "ERC721: address zero is not a valid owner");
return _balances[owner];
}
/**
* @dev See {IERC721-ownerOf}.
*/
function ownerOf(uint256 tokenId) public view virtual override returns (address) {
address owner = _ownerOf(tokenId);
require(owner != address(0), "ERC721: invalid token ID");
return owner;
}
/**
* @dev See {IERC721Metadata-name}.
*/
function name() public view virtual override returns (string memory) {
return _name;
}
/**
* @dev See {IERC721Metadata-symbol}.
*/
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
/**
* @dev See {IERC721Metadata-tokenURI}.
*/
function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
_requireMinted(tokenId);
string memory baseURI = _baseURI();
return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
}
/**
* @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
* token will be the concatenation of the `baseURI` and the `tokenId`. Empty
* by default, can be overridden in child contracts.
*/
function _baseURI() internal view virtual returns (string memory) {
return "";
}
/**
* @dev See {IERC721-approve}.
*/
function approve(address to, uint256 tokenId) public virtual override {
address owner = ERC721.ownerOf(tokenId);
require(to != owner, "ERC721: approval to current owner");
require(
_msgSender() == owner || isApprovedForAll(owner, _msgSender()),
"ERC721: approve caller is not token owner or approved for all"
);
_approve(to, tokenId);
}
/**
* @dev See {IERC721-getApproved}.
*/
function getApproved(uint256 tokenId) public view virtual override returns (address) {
_requireMinted(tokenId);
return _tokenApprovals[tokenId];
}
/**
* @dev See {IERC721-setApprovalForAll}.
*/
function setApprovalForAll(address operator, bool approved) public virtual override {
_setApprovalForAll(_msgSender(), operator, approved);
}
/**
* @dev See {IERC721-isApprovedForAll}.
*/
function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
return _operatorApprovals[owner][operator];
}
/**
* @dev See {IERC721-transferFrom}.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
//solhint-disable-next-line max-line-length
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved");
_transfer(from, to, tokenId);
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
safeTransferFrom(from, to, tokenId, "");
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes memory data
) public virtual override {
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved");
_safeTransfer(from, to, tokenId, data);
}
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* `data` is additional data, it has no specified format and it is sent in call to `to`.
*
* This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
* implement alternative mechanisms to perform token transfer, such as signature-based.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function _safeTransfer(
address from,
address to,
uint256 tokenId,
bytes memory data
) internal virtual {
_transfer(from, to, tokenId);
require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer");
}
/**
* @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist
*/
function _ownerOf(uint256 tokenId) internal view virtual returns (address) {
return _owners[tokenId];
}
/**
* @dev Returns whether `tokenId` exists.
*
* Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
*
* Tokens start existing when they are minted (`_mint`),
* and stop existing when they are burned (`_burn`).
*/
function _exists(uint256 tokenId) internal view virtual returns (bool) {
return _ownerOf(tokenId) != address(0);
}
/**
* @dev Returns whether `spender` is allowed to manage `tokenId`.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
address owner = ERC721.ownerOf(tokenId);
return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
}
/**
* @dev Safely mints `tokenId` and transfers it to `to`.
*
* Requirements:
*
* - `tokenId` must not exist.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function _safeMint(address to, uint256 tokenId) internal virtual {
_safeMint(to, tokenId, "");
}
/**
* @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
* forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
*/
function _safeMint(
address to,
uint256 tokenId,
bytes memory data
) internal virtual {
_mint(to, tokenId);
require(
_checkOnERC721Received(address(0), to, tokenId, data),
"ERC721: transfer to non ERC721Receiver implementer"
);
}
/**
* @dev Mints `tokenId` and transfers it to `to`.
*
* WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
*
* Requirements:
*
* - `tokenId` must not exist.
* - `to` cannot be the zero address.
*
* Emits a {Transfer} event.
*/
function _mint(address to, uint256 tokenId) internal virtual {
require(to != address(0), "ERC721: mint to the zero address");
require(!_exists(tokenId), "ERC721: token already minted");
_beforeTokenTransfer(address(0), to, tokenId, 1);
// Check that tokenId was not minted by `_beforeTokenTransfer` hook
require(!_exists(tokenId), "ERC721: token already minted");
unchecked {
// Will not overflow unless all 2**256 token ids are minted to the same owner.
// Given that tokens are minted one by one, it is impossible in practice that
// this ever happens. Might change if we allow batch minting.
// The ERC fails to describe this case.
_balances[to] += 1;
}
_owners[tokenId] = to;
emit Transfer(address(0), to, tokenId);
_afterTokenTransfer(address(0), to, tokenId, 1);
}
/**
* @dev Destroys `tokenId`.
* The approval is cleared when the token is burned.
* This is an internal function that does not check if the sender is authorized to operate on the token.
*
* Requirements:
*
* - `tokenId` must exist.
*
* Emits a {Transfer} event.
*/
function _burn(uint256 tokenId) internal virtual {
address owner = ERC721.ownerOf(tokenId);
_beforeTokenTransfer(owner, address(0), tokenId, 1);
// Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook
owner = ERC721.ownerOf(tokenId);
// Clear approvals
delete _tokenApprovals[tokenId];
unchecked {
// Cannot overflow, as that would require more tokens to be burned/transferred
// out than the owner initially received through minting and transferring in.
_balances[owner] -= 1;
}
delete _owners[tokenId];
emit Transfer(owner, address(0), tokenId);
_afterTokenTransfer(owner, address(0), tokenId, 1);
}
/**
* @dev Transfers `tokenId` from `from` to `to`.
* As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
*
* Emits a {Transfer} event.
*/
function _transfer(
address from,
address to,
uint256 tokenId
) internal virtual {
require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
require(to != address(0), "ERC721: transfer to the zero address");
_beforeTokenTransfer(from, to, tokenId, 1);
// Check that tokenId was not transferred by `_beforeTokenTransfer` hook
require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
// Clear approvals from the previous owner
delete _tokenApprovals[tokenId];
unchecked {
// `_balances[from]` cannot overflow for the same reason as described in `_burn`:
// `from`'s balance is the number of token held, which is at least one before the current
// transfer.
// `_balances[to]` could overflow in the conditions described in `_mint`. That would require
// all 2**256 token ids to be minted, which in practice is impossible.
_balances[from] -= 1;
_balances[to] += 1;
}
_owners[tokenId] = to;
emit Transfer(from, to, tokenId);
_afterTokenTransfer(from, to, tokenId, 1);
}
/**
* @dev Approve `to` to operate on `tokenId`
*
* Emits an {Approval} event.
*/
function _approve(address to, uint256 tokenId) internal virtual {
_tokenApprovals[tokenId] = to;
emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
}
/**
* @dev Approve `operator` to operate on all of `owner` tokens
*
* Emits an {ApprovalForAll} event.
*/
function _setApprovalForAll(
address owner,
address operator,
bool approved
) internal virtual {
require(owner != operator, "ERC721: approve to caller");
_operatorApprovals[owner][operator] = approved;
emit ApprovalForAll(owner, operator, approved);
}
/**
* @dev Reverts if the `tokenId` has not been minted yet.
*/
function _requireMinted(uint256 tokenId) internal view virtual {
require(_exists(tokenId), "ERC721: invalid token ID");
}
/**
* @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
* The call is not executed if the target address is not a contract.
*
* @param from address representing the previous owner of the given token ID
* @param to target address that will receive the tokens
* @param tokenId uint256 ID of the token to be transferred
* @param data bytes optional data to send along with the call
* @return bool whether the call correctly returned the expected magic value
*/
function _checkOnERC721Received(
address from,
address to,
uint256 tokenId,
bytes memory data
) private returns (bool) {
if (to.isContract()) {
try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {
return retval == IERC721Receiver.onERC721Received.selector;
} catch (bytes memory reason) {
if (reason.length == 0) {
revert("ERC721: transfer to non ERC721Receiver implementer");
} else {
/// @solidity memory-safe-assembly
assembly {
revert(add(32, reason), mload(reason))
}
}
}
} else {
return true;
}
}
/**
* @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is
* used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`.
* - When `from` is zero, the tokens will be minted for `to`.
* - When `to` is zero, ``from``'s tokens will be burned.
* - `from` and `to` are never both zero.
* - `batchSize` is non-zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(
address from,
address to,
uint256 firstTokenId,
uint256 batchSize
) internal virtual {}
/**
* @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is
* used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`.
* - When `from` is zero, the tokens were minted for `to`.
* - When `to` is zero, ``from``'s tokens were burned.
* - `from` and `to` are never both zero.
* - `batchSize` is non-zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _afterTokenTransfer(
address from,
address to,
uint256 firstTokenId,
uint256 batchSize
) internal virtual {}
/**
* @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override.
*
* WARNING: Anyone calling this MUST ensure that the balances remain consistent with the ownership. The invariant
* being that for any address `a` the value returned by `balanceOf(a)` must be equal to the number of tokens such
* that `ownerOf(tokenId)` is `a`.
*/
// solhint-disable-next-line func-name-mixedcase
function __unsafe_increaseBalance(address account, uint256 amount) internal {
_balances[account] += amount;
}
}
// lib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Enumerable.sol
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/extensions/ERC721Enumerable.sol)
/**
* @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();
}
}
// src/WolfNFT.sol
// This contract gets to burn SHEEP token in other addresses
// It costs x gasTokens and SHEEP to mint
// It gets hungrier and starves
contract WOLF is ERC721Enumerable,IERC2981,Ownable2Step,FeeM {
uint256 public constant ONE = 1 * 1e18;
uint256 public constant TEN = 10 * 1e18;
uint256 public constant HUNDRED = 100 * 1e18;
uint256 public constant HUNDRED_FIFTY = 150 * 1e18;
uint256 public constant DAY = 86400;
uint256 public constant WEEK = 604800;
address public sheep;
mapping(uint256 => uint256) public starved; //tokenId => time
mapping(uint256 => uint256) public hungry; //tokenId => time
mapping(uint256 => uint256) public hunger; //tokenId => quantity will eat
mapping(uint256 => uint256) public leftToEat; //tokenId => quantity still left to eat in current feeding cycle
mapping(address => uint256) public mints; //owner => tokenId
mapping(address => uint256) public protectionTime; // address to time that address is protected from eating
uint256 wolfID = 0;
address public wGasToken;
address public sheepDog;
address public sheepMarket;
address public nftMetadata;
mapping(address => bool) public canNotBeEaten;
event cryWolf(address indexed minter, uint256 amount);
event sheepEaten(address indexed victim, uint256 amount);
constructor(address _sheep, address _sheepDog) ERC721 ("Wolf2", "WOLF2") {
sheep = _sheep;
wGasToken = ISheep(sheep).wGasToken();
sheepDog = _sheepDog;
canNotBeEaten[sheepDog] = true;
canNotBeEaten[address(this)] = true;
}
function getWolfPreMint() public {
require(ISheep(sheep).pastured(),"You are too late");
require(ISheep(sheep).saleStarted(),"The sale hasn't started yet");
ISheep(sheep).eatSheep(msg.sender, HUNDRED, address(this),0);
emit sheepEaten(msg.sender, HUNDRED);
IERC20(wGasToken).transferFrom(msg.sender, owner(), HUNDRED); // TODO decide the price
_safeMint(msg.sender, wolfID);
emit cryWolf(msg.sender, wolfID);
starved[wolfID] = block.timestamp + (2 * 52 * WEEK); // they can not eat till game start so they need more time
hungry[wolfID] = block.timestamp + DAY;
hunger[wolfID] = ONE;
leftToEat[wolfID] = ONE;
wolfID = wolfID + 1;
}
// This function allows caller to pay fee, burn tokens, and mint an NFT
// The fee is in wGasTokens
// The burned tokens are SHEEP - User must have bal
function getWolf() public {
require(!ISheep(sheep).pastured(),"Game has not started yet");
ISheep(sheep).eatSheep(msg.sender, HUNDRED_FIFTY, address(this),0);
emit sheepEaten(msg.sender, HUNDRED_FIFTY);
IERC20(wGasToken).transferFrom(msg.sender, sheepDog, HUNDRED); // TODO decide the price
_safeMint(msg.sender, wolfID);
emit cryWolf(msg.sender, wolfID);
starved[wolfID] = block.timestamp + WEEK;
hungry[wolfID] = block.timestamp + DAY;
hunger[wolfID] = ONE;
leftToEat[wolfID] = ONE;
wolfID = wolfID + 1;
}
// Owner of wolfNFT calls this to burn SHEEP
// Must burn 1/wk can 1/day
function eatSheep(address _victim, uint256 _wolfID) public {
require(!ISheep(sheep).pastured(),"Game has not started");
require(_isApprovedOrOwner(msg.sender, _wolfID), "You do not own this wolf");
require(block.timestamp < starved[_wolfID], "your wolf has starved");
require(block.timestamp > hungry[_wolfID], "Your wolf is not hungry yet");
uint256 sheepToEat = Math.min(leftToEat[_wolfID],ISheep(sheep).balanceOf(_victim));
_burnSheep(_victim, sheepToEat);
leftToEat[_wolfID] -= sheepToEat;
if(leftToEat[_wolfID] == 0) { // feeding completed
hunger[_wolfID] = hunger[_wolfID] + ONE;
hungry[_wolfID] = block.timestamp + DAY; // 1 day
starved[_wolfID] = block.timestamp + WEEK; // 1 week
leftToEat[_wolfID] = hunger[_wolfID];
}
emit sheepEaten(_victim, sheepToEat);
}
function buyProtection() public {
uint price = TEN;
if(protectionTime[msg.sender] >= block.timestamp) {
price = 12 * ONE;
}
IERC20(wGasToken).transferFrom(msg.sender, sheepDog, price);
protectionTime[msg.sender] = block.timestamp + DAY;
}
// internal function that actually burns
function _burnSheep(address _victim,uint256 _sheepToEat) private {
require(!canNotBeEaten[_victim],"Can not eat from this address");
require(protectionTime[_victim] < block.timestamp,"This address is currently protected");
uint256 mintPercent = 25;
bool isSheepMarket = _victim == sheepMarket;
if(isSheepMarket) {
mintPercent = 0;
}
ISheep(sheep).eatSheep(_victim, _sheepToEat, msg.sender,mintPercent);
if(isSheepMarket) {
IPair(sheepMarket).sync();
uint256 rewardAmount = (_sheepToEat * 10 / 100);
if(ISheep(sheep).balanceOf(address(this)) > rewardAmount) { // sheeps from the sheepdog defaults
ISheep(sheep).transfer(msg.sender, rewardAmount);
}
}
}
// Overrides
// block transfer of the starved nfts, so they can not be sold on nft marketplaces
function _transfer(
address from,
address to,
uint256 tokenId
) internal override {
require(block.timestamp < starved[tokenId], 'Your wolf has starved');
super._transfer(from,to,tokenId);
}
///////////////////////////////////////
/////ROYALTY FUNCTIONS/////////////////
///////////////////////////////////////
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721Enumerable,IERC165) returns (bool) {
return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId);
}
function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view returns (
address receiver,
uint256 royaltyAmount
) {
receiver = ISheep(sheep).owner();
royaltyAmount = _salePrice * 500 / 10000;
}
// Returns the static URI for all tokens
function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
return IWolfMetadata(nftMetadata).tokenURI(tokenId);
}
// Sets a new address to the nft metadata contract
function setNftMetadata(address _nftMetadata) public onlyOwner {
nftMetadata = _nftMetadata;
}
///////////////////////////////////////
/////OWNER FUNCTIONS/////////////////
///////////////////////////////////////
function toggleCanBeEaten(address _victim) public onlyOwner {
canNotBeEaten[_victim] = !canNotBeEaten[_victim];
}
function setSheepMarket(address _sheepMarket) public onlyOwner {
sheepMarket = _sheepMarket;
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_sheep","type":"address"},{"internalType":"address","name":"_sheepDog","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":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"cryWolf","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"victim","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"sheepEaten","type":"event"},{"inputs":[],"name":"DAY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HUNDRED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HUNDRED_FIFTY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ONE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TEN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WEEK","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyProtection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"canNotBeEaten","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_victim","type":"address"},{"internalType":"uint256","name":"_wolfID","type":"uint256"}],"name":"eatSheep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWolf","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getWolfPreMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"hunger","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"hungry","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"leftToEat","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftMetadata","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"protectionTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"registerMe","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_nftMetadata","type":"address"}],"name":"setNftMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sheepMarket","type":"address"}],"name":"setSheepMarket","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sheep","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sheepDog","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sheepMarket","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"starved","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_victim","type":"address"}],"name":"toggleCanBeEaten","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wGasToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]Contract Creation Code
608060405260006013553480156200001657600080fd5b5060405162005cc838038062005cc883398181016040528101906200003c919062000552565b6040518060400160405280600581526020017f576f6c66320000000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f574f4c46320000000000000000000000000000000000000000000000000000008152508160009080519060200190620000c092919062000438565b508060019080519060200190620000d992919062000438565b505050620000fc620000f06200032c60201b60201c565b6200033460201b60201c565b81600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e46ba78b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001ab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001d1919062000599565b601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160186000601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601860003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050506200062f565b600033905090565b600b60006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556200036f816200037260201b620024a71760201c565b50565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200044690620005fa565b90600052602060002090601f0160209004810192826200046a5760008555620004b6565b82601f106200048557805160ff1916838001178555620004b6565b82800160010185558215620004b6579182015b82811115620004b557825182559160200191906001019062000498565b5b509050620004c59190620004c9565b5090565b5b80821115620004e4576000816000905550600101620004ca565b5090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200051a82620004ed565b9050919050565b6200052c816200050d565b81146200053857600080fd5b50565b6000815190506200054c8162000521565b92915050565b600080604083850312156200056c576200056b620004e8565b5b60006200057c858286016200053b565b92505060206200058f858286016200053b565b9150509250929050565b600060208284031215620005b257620005b1620004e8565b5b6000620005c2848285016200053b565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200061357607f821691505b602082108103620006295762000628620005cb565b5b50919050565b615689806200063f6000396000f3fe608060405234801561001057600080fd5b50600436106102a05760003560e01c80638da5cb5b11610167578063c87b56dd116100ce578063e46ba78b11610087578063e46ba78b14610816578063e985e9c514610834578063ee2f3a0514610864578063f2fde38b14610882578063f4359ce51461089e578063f85fc0ab146108bc576102a0565b8063c87b56dd14610752578063cac644cf14610782578063d3b136d21461078c578063db56da40146107aa578063e0efffa3146107da578063e30c3978146107f8576102a0565b8063b7fd973d11610120578063b7fd973d146106a6578063b88d4fde146106c2578063ba98f977146106de578063c0e2b32f146106e8578063c2ee3a0814610718578063c64a505114610736576102a0565b80638da5cb5b1461060a57806395d89b41146106285780639a198d6114610646578063a22cb46514610650578063b3be10e31461066c578063b714956914610676576102a0565b80633ea73d5d1161020b57806370a08231116101c457806370a082311461055c578063715018a61461058c57806379ba5097146105965780637a3ecd94146105a057806383289c82146105d057806389f10d90146105ec576102a0565b80633ea73d5d1461045057806342842e0e14610480578063486e66da1461049c5780634f6ccce7146104cc5780635660f851146104fc5780636352211e1461052c576102a0565b806318160ddd1161025d57806318160ddd1461037957806323b872dd1461039757806327cfe856146103b35780632a55205a146103d15780632baa0e97146104025780632f745c5914610420576102a0565b806301ffc9a7146102a557806306fdde03146102d5578063081812fc146102f3578063095ea7b31461032357806310cc45611461033f578063145e32c51461035b575b600080fd5b6102bf60048036038101906102ba9190613c55565b6108da565b6040516102cc9190613c9d565b60405180910390f35b6102dd610954565b6040516102ea9190613d51565b60405180910390f35b61030d60048036038101906103089190613da9565b6109e6565b60405161031a9190613e17565b60405180910390f35b61033d60048036038101906103389190613e5e565b610a2c565b005b61035960048036038101906103549190613e9e565b610b43565b005b610363610b8f565b6040516103709190613e17565b60405180910390f35b610381610bb5565b60405161038e9190613eda565b60405180910390f35b6103b160048036038101906103ac9190613ef5565b610bc2565b005b6103bb610c22565b6040516103c89190613eda565b60405180910390f35b6103eb60048036038101906103e69190613f48565b610c29565b6040516103f9929190613f88565b60405180910390f35b61040a610ce3565b6040516104179190613e17565b60405180910390f35b61043a60048036038101906104359190613e5e565b610d09565b6040516104479190613eda565b60405180910390f35b61046a60048036038101906104659190613da9565b610dae565b6040516104779190613eda565b60405180910390f35b61049a60048036038101906104959190613ef5565b610dc6565b005b6104b660048036038101906104b19190613da9565b610de6565b6040516104c39190613eda565b60405180910390f35b6104e660048036038101906104e19190613da9565b610dfe565b6040516104f39190613eda565b60405180910390f35b61051660048036038101906105119190613e9e565b610e6f565b6040516105239190613eda565b60405180910390f35b61054660048036038101906105419190613da9565b610e87565b6040516105539190613e17565b60405180910390f35b61057660048036038101906105719190613e9e565b610f0d565b6040516105839190613eda565b60405180910390f35b610594610fc4565b005b61059e610fd8565b005b6105ba60048036038101906105b59190613da9565b611065565b6040516105c79190613eda565b60405180910390f35b6105ea60048036038101906105e59190613e5e565b61107d565b005b6105f4611455565b6040516106019190613e17565b60405180910390f35b61061261147b565b60405161061f9190613e17565b60405180910390f35b6106306114a5565b60405161063d9190613d51565b60405180910390f35b61064e611537565b005b61066a60048036038101906106659190613fdd565b611689565b005b61067461169f565b005b610690600480360381019061068b9190613e9e565b611a39565b60405161069d9190613c9d565b60405180910390f35b6106c060048036038101906106bb9190613e9e565b611a59565b005b6106dc60048036038101906106d79190614152565b611aa5565b005b6106e6611b07565b005b61070260048036038101906106fd9190613e9e565b611f61565b60405161070f9190613eda565b60405180910390f35b610720611f79565b60405161072d9190613eda565b60405180910390f35b610750600480360381019061074b9190613e9e565b611f85565b005b61076c60048036038101906107679190613da9565b612034565b6040516107799190613d51565b60405180910390f35b61078a612126565b005b6107946122ab565b6040516107a19190613e17565b60405180910390f35b6107c460048036038101906107bf9190613da9565b6122d1565b6040516107d19190613eda565b60405180910390f35b6107e26122e9565b6040516107ef9190613eda565b60405180910390f35b6108006122f6565b60405161080d9190613e17565b60405180910390f35b61081e612320565b60405161082b9190613e17565b60405180910390f35b61084e600480360381019061084991906141d5565b612346565b60405161085b9190613c9d565b60405180910390f35b61086c6123da565b6040516108799190613eda565b60405180910390f35b61089c60048036038101906108979190613e9e565b6123e6565b005b6108a6612493565b6040516108b39190613eda565b60405180910390f35b6108c461249a565b6040516108d19190613eda565b60405180910390f35b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061094d575061094c8261256d565b5b9050919050565b60606000805461096390614244565b80601f016020809104026020016040519081016040528092919081815260200182805461098f90614244565b80156109dc5780601f106109b1576101008083540402835291602001916109dc565b820191906000526020600020905b8154815290600101906020018083116109bf57829003601f168201915b5050505050905090565b60006109f1826125e7565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a3782610e87565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610aa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9e906142e7565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ac6612632565b73ffffffffffffffffffffffffffffffffffffffff161480610af55750610af481610aef612632565b612346565b5b610b34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2b90614379565b60405180910390fd5b610b3e838361263a565b505050565b610b4b6126f3565b80601760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600880549050905090565b610bd3610bcd612632565b82612771565b610c12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c099061440b565b60405180910390fd5b610c1d838383612806565b505050565b6201518081565b600080600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cbd9190614440565b91506127106101f484610cd0919061449c565b610cda9190614525565b90509250929050565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000610d1483610f0d565b8210610d55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4c906145c8565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600d6020528060005260406000206000915090505481565b610de183838360405180602001604052806000815250611aa5565b505050565b600e6020528060005260406000206000915090505481565b6000610e08610bb5565b8210610e49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e409061465a565b60405180910390fd5b60088281548110610e5d57610e5c61467a565b5b90600052602060002001549050919050565b60116020528060005260406000206000915090505481565b600080610e938361286b565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efb906146f5565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7490614787565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610fcc6126f3565b610fd660006128a8565b565b6000610fe2612632565b90508073ffffffffffffffffffffffffffffffffffffffff166110036122f6565b73ffffffffffffffffffffffffffffffffffffffff1614611059576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105090614819565b60405180910390fd5b611062816128a8565b50565b60106020528060005260406000206000915090505481565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663470904f46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061110e919061484e565b1561114e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611145906148c7565b60405180910390fd5b6111583382612771565b611197576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118e90614933565b60405180910390fd5b600d60008281526020019081526020016000205442106111ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e39061499f565b60405180910390fd5b600e6000828152602001908152602001600020544211611241576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123890614a0b565b60405180910390fd5b60006112fb6010600084815260200190815260200160002054600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b81526004016112b59190613e17565b602060405180830381865afa1580156112d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112f69190614a40565b6128d9565b905061130783826128f2565b8060106000848152602001908152602001600020600082825461132a9190614a6d565b92505081905550600060106000848152602001908152602001600020540361140257670de0b6b3a7640000600f6000848152602001908152602001600020546113739190614aa1565b600f60008481526020019081526020016000208190555062015180426113999190614aa1565b600e60008481526020019081526020016000208190555062093a80426113bf9190614aa1565b600d600084815260200190815260200160002081905550600f60008381526020019081526020016000205460106000848152602001908152602001600020819055505b8273ffffffffffffffffffffffffffffffffffffffff167fba481b677f2fba7935dcabd413d044804f9491caee4109873893c4524cfc07d8826040516114489190613eda565b60405180910390a2505050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546114b490614244565b80601f01602080910402602001604051908101604052809291908181526020018280546114e090614244565b801561152d5780601f106115025761010080835404028352916020019161152d565b820191906000526020600020905b81548152906001019060200180831161151057829003601f168201915b5050505050905090565b600073dc2b0d2dd2b7759d97d50db4eabdc3697311083073ffffffffffffffffffffffffffffffffffffffff16604c6040516024016115769190614b49565b6040516020818303038152906040527f1e60fd14000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516116009190614bab565b6000604051808303816000865af19150503d806000811461163d576040519150601f19603f3d011682016040523d82523d6000602084013e611642565b606091505b5050905080611686576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167d90614c0e565b60405180910390fd5b50565b61169b611694612632565b8383612ceb565b5050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663470904f46040518163ffffffff1660e01b8152600401602060405180830381865afa15801561170c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611730919061484e565b15611770576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176790614c7a565b60405180910390fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663967cb38233680821ab0d44149800003060006040518563ffffffff1660e01b81526004016117db9493929190614cd5565b600060405180830381600087803b1580156117f557600080fd5b505af1158015611809573d6000803e3d6000fd5b505050503373ffffffffffffffffffffffffffffffffffffffff167fba481b677f2fba7935dcabd413d044804f9491caee4109873893c4524cfc07d8680821ab0d441498000060405161185c9190613eda565b60405180910390a2601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1668056bc75e2d631000006040518463ffffffff1660e01b81526004016118ee93929190614d1a565b6020604051808303816000875af115801561190d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611931919061484e565b5061193e33601354612e57565b3373ffffffffffffffffffffffffffffffffffffffff167f802faf56f3a8767918e7d95051fd7c8c30bcabac4bf1bf0a30d4265fb2929a186013546040516119869190613eda565b60405180910390a262093a804261199d9190614aa1565b600d600060135481526020019081526020016000208190555062015180426119c59190614aa1565b600e6000601354815260200190815260200160002081905550670de0b6b3a7640000600f6000601354815260200190815260200160002081905550670de0b6b3a7640000601060006013548152602001908152602001600020819055506001601354611a319190614aa1565b601381905550565b60186020528060005260406000206000915054906101000a900460ff1681565b611a616126f3565b80601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611ab6611ab0612632565b83612771565b611af5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aec9061440b565b60405180910390fd5b611b0184848484612e75565b50505050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663470904f46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b98919061484e565b611bd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bce90614d9d565b60405180910390fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c474f9e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c68919061484e565b611ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9e90614e09565b60405180910390fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663967cb3823368056bc75e2d631000003060006040518563ffffffff1660e01b8152600401611d129493929190614cd5565b600060405180830381600087803b158015611d2c57600080fd5b505af1158015611d40573d6000803e3d6000fd5b505050503373ffffffffffffffffffffffffffffffffffffffff167fba481b677f2fba7935dcabd413d044804f9491caee4109873893c4524cfc07d868056bc75e2d63100000604051611d939190613eda565b60405180910390a2601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33611de261147b565b68056bc75e2d631000006040518463ffffffff1660e01b8152600401611e0a93929190614d1a565b6020604051808303816000875af1158015611e29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e4d919061484e565b50611e5a33601354612e57565b3373ffffffffffffffffffffffffffffffffffffffff167f802faf56f3a8767918e7d95051fd7c8c30bcabac4bf1bf0a30d4265fb2929a18601354604051611ea29190613eda565b60405180910390a262093a806068611eba919061449c565b42611ec59190614aa1565b600d60006013548152602001908152602001600020819055506201518042611eed9190614aa1565b600e6000601354815260200190815260200160002081905550670de0b6b3a7640000600f6000601354815260200190815260200160002081905550670de0b6b3a7640000601060006013548152602001908152602001600020819055506001601354611f599190614aa1565b601381905550565b60126020528060005260406000206000915090505481565b670de0b6b3a764000081565b611f8d6126f3565b601860008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615601860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b606061203f82612ed1565b61207e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207590614e9b565b60405180910390fd5b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c87b56dd836040518263ffffffff1660e01b81526004016120d99190613eda565b600060405180830381865afa1580156120f6573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061211f9190614f5c565b9050919050565b6000678ac7230489e80000905042601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541061219157670de0b6b3a7640000600c61218e919061449c565b90505b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518463ffffffff1660e01b815260040161221293929190614d1a565b6020604051808303816000875af1158015612231573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612255919061484e565b5062015180426122659190614aa1565b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600f6020528060005260406000206000915090505481565b680821ab0d441498000081565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b678ac7230489e8000081565b6123ee6126f3565b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff1661244e61147b565b73ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b62093a8081565b68056bc75e2d6310000081565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806125e057506125df82612f12565b5b9050919050565b6125f081612ed1565b61262f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612626906146f5565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166126ad83610e87565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6126fb612632565b73ffffffffffffffffffffffffffffffffffffffff1661271961147b565b73ffffffffffffffffffffffffffffffffffffffff161461276f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276690614ff1565b60405180910390fd5b565b60008061277d83610e87565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806127bf57506127be8185612346565b5b806127fd57508373ffffffffffffffffffffffffffffffffffffffff166127e5846109e6565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b600d600082815260200190815260200160002054421061285b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128529061505d565b60405180910390fd5b612866838383612ff4565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600b60006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556128d6816124a7565b50565b60008183106128e857816128ea565b825b905092915050565b601860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561297f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612976906150c9565b60405180910390fd5b42601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410612a00576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f79061515b565b60405180910390fd5b6000601990506000601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161490508015612a6657600091505b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663967cb382858533866040518563ffffffff1660e01b8152600401612ac7949392919061517b565b600060405180830381600087803b158015612ae157600080fd5b505af1158015612af5573d6000803e3d6000fd5b505050508015612ce557601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612b6957600080fd5b505af1158015612b7d573d6000803e3d6000fd5b5050505060006064600a85612b92919061449c565b612b9c9190614525565b905080600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612bfa9190613e17565b602060405180830381865afa158015612c17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c3b9190614a40565b1115612ce357600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401612c9e929190613f88565b6020604051808303816000875af1158015612cbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ce1919061484e565b505b505b50505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612d59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d509061520c565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612e4a9190613c9d565b60405180910390a3505050565b612e718282604051806020016040528060008152506132ed565b5050565b612e80848484612806565b612e8c84848484613348565b612ecb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ec29061529e565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff16612ef38361286b565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612fdd57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612fed5750612fec826134cf565b5b9050919050565b8273ffffffffffffffffffffffffffffffffffffffff1661301482610e87565b73ffffffffffffffffffffffffffffffffffffffff161461306a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306190615330565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036130d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130d0906153c2565b60405180910390fd5b6130e68383836001613539565b8273ffffffffffffffffffffffffffffffffffffffff1661310682610e87565b73ffffffffffffffffffffffffffffffffffffffff161461315c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161315390615330565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46132e88383836001613697565b505050565b6132f7838361369d565b6133046000848484613348565b613343576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161333a9061529e565b60405180910390fd5b505050565b60006133698473ffffffffffffffffffffffffffffffffffffffff166138ba565b156134c2578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613392612632565b8786866040518563ffffffff1660e01b81526004016133b4949392919061542c565b6020604051808303816000875af19250505080156133f057506040513d601f19601f820116820180604052508101906133ed919061548d565b60015b613472573d8060008114613420576040519150601f19603f3d011682016040523d82523d6000602084013e613425565b606091505b50600081510361346a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134619061529e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506134c7565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b613545848484846138dd565b6001811115613589576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135809061552c565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036135d0576135cb816138e3565b61360f565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161461360e5761360d858261392c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036136515761364c81613a99565b613690565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161461368f5761368e8482613b6a565b5b5b5050505050565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361370c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161370390615598565b60405180910390fd5b61371581612ed1565b15613755576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161374c90615604565b60405180910390fd5b613763600083836001613539565b61376c81612ed1565b156137ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137a390615604565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46138b6600083836001613697565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161393984610f0d565b6139439190614a6d565b9050600060076000848152602001908152602001600020549050818114613a28576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613aad9190614a6d565b9050600060096000848152602001908152602001600020549050600060088381548110613add57613adc61467a565b5b906000526020600020015490508060088381548110613aff57613afe61467a565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613b4e57613b4d615624565b5b6001900381819060005260206000200160009055905550505050565b6000613b7583610f0d565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613c3281613bfd565b8114613c3d57600080fd5b50565b600081359050613c4f81613c29565b92915050565b600060208284031215613c6b57613c6a613bf3565b5b6000613c7984828501613c40565b91505092915050565b60008115159050919050565b613c9781613c82565b82525050565b6000602082019050613cb26000830184613c8e565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613cf2578082015181840152602081019050613cd7565b83811115613d01576000848401525b50505050565b6000601f19601f8301169050919050565b6000613d2382613cb8565b613d2d8185613cc3565b9350613d3d818560208601613cd4565b613d4681613d07565b840191505092915050565b60006020820190508181036000830152613d6b8184613d18565b905092915050565b6000819050919050565b613d8681613d73565b8114613d9157600080fd5b50565b600081359050613da381613d7d565b92915050565b600060208284031215613dbf57613dbe613bf3565b5b6000613dcd84828501613d94565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613e0182613dd6565b9050919050565b613e1181613df6565b82525050565b6000602082019050613e2c6000830184613e08565b92915050565b613e3b81613df6565b8114613e4657600080fd5b50565b600081359050613e5881613e32565b92915050565b60008060408385031215613e7557613e74613bf3565b5b6000613e8385828601613e49565b9250506020613e9485828601613d94565b9150509250929050565b600060208284031215613eb457613eb3613bf3565b5b6000613ec284828501613e49565b91505092915050565b613ed481613d73565b82525050565b6000602082019050613eef6000830184613ecb565b92915050565b600080600060608486031215613f0e57613f0d613bf3565b5b6000613f1c86828701613e49565b9350506020613f2d86828701613e49565b9250506040613f3e86828701613d94565b9150509250925092565b60008060408385031215613f5f57613f5e613bf3565b5b6000613f6d85828601613d94565b9250506020613f7e85828601613d94565b9150509250929050565b6000604082019050613f9d6000830185613e08565b613faa6020830184613ecb565b9392505050565b613fba81613c82565b8114613fc557600080fd5b50565b600081359050613fd781613fb1565b92915050565b60008060408385031215613ff457613ff3613bf3565b5b600061400285828601613e49565b925050602061401385828601613fc8565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61405f82613d07565b810181811067ffffffffffffffff8211171561407e5761407d614027565b5b80604052505050565b6000614091613be9565b905061409d8282614056565b919050565b600067ffffffffffffffff8211156140bd576140bc614027565b5b6140c682613d07565b9050602081019050919050565b82818337600083830152505050565b60006140f56140f0846140a2565b614087565b90508281526020810184848401111561411157614110614022565b5b61411c8482856140d3565b509392505050565b600082601f8301126141395761413861401d565b5b81356141498482602086016140e2565b91505092915050565b6000806000806080858703121561416c5761416b613bf3565b5b600061417a87828801613e49565b945050602061418b87828801613e49565b935050604061419c87828801613d94565b925050606085013567ffffffffffffffff8111156141bd576141bc613bf8565b5b6141c987828801614124565b91505092959194509250565b600080604083850312156141ec576141eb613bf3565b5b60006141fa85828601613e49565b925050602061420b85828601613e49565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061425c57607f821691505b60208210810361426f5761426e614215565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006142d1602183613cc3565b91506142dc82614275565b604082019050919050565b60006020820190508181036000830152614300816142c4565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000614363603d83613cc3565b915061436e82614307565b604082019050919050565b6000602082019050818103600083015261439281614356565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b60006143f5602d83613cc3565b915061440082614399565b604082019050919050565b60006020820190508181036000830152614424816143e8565b9050919050565b60008151905061443a81613e32565b92915050565b60006020828403121561445657614455613bf3565b5b60006144648482850161442b565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006144a782613d73565b91506144b283613d73565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156144eb576144ea61446d565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061453082613d73565b915061453b83613d73565b92508261454b5761454a6144f6565b5b828204905092915050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006145b2602b83613cc3565b91506145bd82614556565b604082019050919050565b600060208201905081810360008301526145e1816145a5565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000614644602c83613cc3565b915061464f826145e8565b604082019050919050565b6000602082019050818103600083015261467381614637565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b60006146df601883613cc3565b91506146ea826146a9565b602082019050919050565b6000602082019050818103600083015261470e816146d2565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000614771602983613cc3565b915061477c82614715565b604082019050919050565b600060208201905081810360008301526147a081614764565b9050919050565b7f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060008201527f6e6577206f776e65720000000000000000000000000000000000000000000000602082015250565b6000614803602983613cc3565b915061480e826147a7565b604082019050919050565b60006020820190508181036000830152614832816147f6565b9050919050565b60008151905061484881613fb1565b92915050565b60006020828403121561486457614863613bf3565b5b600061487284828501614839565b91505092915050565b7f47616d6520686173206e6f742073746172746564000000000000000000000000600082015250565b60006148b1601483613cc3565b91506148bc8261487b565b602082019050919050565b600060208201905081810360008301526148e0816148a4565b9050919050565b7f596f7520646f206e6f74206f776e207468697320776f6c660000000000000000600082015250565b600061491d601883613cc3565b9150614928826148e7565b602082019050919050565b6000602082019050818103600083015261494c81614910565b9050919050565b7f796f757220776f6c662068617320737461727665640000000000000000000000600082015250565b6000614989601583613cc3565b915061499482614953565b602082019050919050565b600060208201905081810360008301526149b88161497c565b9050919050565b7f596f757220776f6c66206973206e6f742068756e677279207965740000000000600082015250565b60006149f5601b83613cc3565b9150614a00826149bf565b602082019050919050565b60006020820190508181036000830152614a24816149e8565b9050919050565b600081519050614a3a81613d7d565b92915050565b600060208284031215614a5657614a55613bf3565b5b6000614a6484828501614a2b565b91505092915050565b6000614a7882613d73565b9150614a8383613d73565b925082821015614a9657614a9561446d565b5b828203905092915050565b6000614aac82613d73565b9150614ab783613d73565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614aec57614aeb61446d565b5b828201905092915050565b6000819050919050565b600060ff82169050919050565b6000819050919050565b6000614b33614b2e614b2984614af7565b614b0e565b614b01565b9050919050565b614b4381614b18565b82525050565b6000602082019050614b5e6000830184614b3a565b92915050565b600081519050919050565b600081905092915050565b6000614b8582614b64565b614b8f8185614b6f565b9350614b9f818560208601613cd4565b80840191505092915050565b6000614bb78284614b7a565b915081905092915050565b7f4665654d20726567697374726174696f6e206661696c65640000000000000000600082015250565b6000614bf8601883613cc3565b9150614c0382614bc2565b602082019050919050565b60006020820190508181036000830152614c2781614beb565b9050919050565b7f47616d6520686173206e6f742073746172746564207965740000000000000000600082015250565b6000614c64601883613cc3565b9150614c6f82614c2e565b602082019050919050565b60006020820190508181036000830152614c9381614c57565b9050919050565b6000819050919050565b6000614cbf614cba614cb584614c9a565b614b0e565b613d73565b9050919050565b614ccf81614ca4565b82525050565b6000608082019050614cea6000830187613e08565b614cf76020830186613ecb565b614d046040830185613e08565b614d116060830184614cc6565b95945050505050565b6000606082019050614d2f6000830186613e08565b614d3c6020830185613e08565b614d496040830184613ecb565b949350505050565b7f596f752061726520746f6f206c61746500000000000000000000000000000000600082015250565b6000614d87601083613cc3565b9150614d9282614d51565b602082019050919050565b60006020820190508181036000830152614db681614d7a565b9050919050565b7f5468652073616c65206861736e27742073746172746564207965740000000000600082015250565b6000614df3601b83613cc3565b9150614dfe82614dbd565b602082019050919050565b60006020820190508181036000830152614e2281614de6565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614e85602f83613cc3565b9150614e9082614e29565b604082019050919050565b60006020820190508181036000830152614eb481614e78565b9050919050565b600067ffffffffffffffff821115614ed657614ed5614027565b5b614edf82613d07565b9050602081019050919050565b6000614eff614efa84614ebb565b614087565b905082815260208101848484011115614f1b57614f1a614022565b5b614f26848285613cd4565b509392505050565b600082601f830112614f4357614f4261401d565b5b8151614f53848260208601614eec565b91505092915050565b600060208284031215614f7257614f71613bf3565b5b600082015167ffffffffffffffff811115614f9057614f8f613bf8565b5b614f9c84828501614f2e565b91505092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614fdb602083613cc3565b9150614fe682614fa5565b602082019050919050565b6000602082019050818103600083015261500a81614fce565b9050919050565b7f596f757220776f6c662068617320737461727665640000000000000000000000600082015250565b6000615047601583613cc3565b915061505282615011565b602082019050919050565b600060208201905081810360008301526150768161503a565b9050919050565b7f43616e206e6f74206561742066726f6d20746869732061646472657373000000600082015250565b60006150b3601d83613cc3565b91506150be8261507d565b602082019050919050565b600060208201905081810360008301526150e2816150a6565b9050919050565b7f5468697320616464726573732069732063757272656e746c792070726f74656360008201527f7465640000000000000000000000000000000000000000000000000000000000602082015250565b6000615145602383613cc3565b9150615150826150e9565b604082019050919050565b6000602082019050818103600083015261517481615138565b9050919050565b60006080820190506151906000830187613e08565b61519d6020830186613ecb565b6151aa6040830185613e08565b6151b76060830184613ecb565b95945050505050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006151f6601983613cc3565b9150615201826151c0565b602082019050919050565b60006020820190508181036000830152615225816151e9565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000615288603283613cc3565b91506152938261522c565b604082019050919050565b600060208201905081810360008301526152b78161527b565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061531a602583613cc3565b9150615325826152be565b604082019050919050565b600060208201905081810360008301526153498161530d565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006153ac602483613cc3565b91506153b782615350565b604082019050919050565b600060208201905081810360008301526153db8161539f565b9050919050565b600082825260208201905092915050565b60006153fe82614b64565b61540881856153e2565b9350615418818560208601613cd4565b61542181613d07565b840191505092915050565b60006080820190506154416000830187613e08565b61544e6020830186613e08565b61545b6040830185613ecb565b818103606083015261546d81846153f3565b905095945050505050565b60008151905061548781613c29565b92915050565b6000602082840312156154a3576154a2613bf3565b5b60006154b184828501615478565b91505092915050565b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b6000615516603583613cc3565b9150615521826154ba565b604082019050919050565b6000602082019050818103600083015261554581615509565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000615582602083613cc3565b915061558d8261554c565b602082019050919050565b600060208201905081810360008301526155b181615575565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006155ee601c83613cc3565b91506155f9826155b8565b602082019050919050565b6000602082019050818103600083015261561d816155e1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea264697066735822122088e35a0c7e5d173eb4a497967bd6aae426a427f43eedce8851395ca8844e38d664736f6c634300080d003300000000000000000000000019330aa2832394e6d525e297f2eace513a63b7110000000000000000000000004ce37d663a6439d9ecf2c04427e9d9a24ea940a1
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102a05760003560e01c80638da5cb5b11610167578063c87b56dd116100ce578063e46ba78b11610087578063e46ba78b14610816578063e985e9c514610834578063ee2f3a0514610864578063f2fde38b14610882578063f4359ce51461089e578063f85fc0ab146108bc576102a0565b8063c87b56dd14610752578063cac644cf14610782578063d3b136d21461078c578063db56da40146107aa578063e0efffa3146107da578063e30c3978146107f8576102a0565b8063b7fd973d11610120578063b7fd973d146106a6578063b88d4fde146106c2578063ba98f977146106de578063c0e2b32f146106e8578063c2ee3a0814610718578063c64a505114610736576102a0565b80638da5cb5b1461060a57806395d89b41146106285780639a198d6114610646578063a22cb46514610650578063b3be10e31461066c578063b714956914610676576102a0565b80633ea73d5d1161020b57806370a08231116101c457806370a082311461055c578063715018a61461058c57806379ba5097146105965780637a3ecd94146105a057806383289c82146105d057806389f10d90146105ec576102a0565b80633ea73d5d1461045057806342842e0e14610480578063486e66da1461049c5780634f6ccce7146104cc5780635660f851146104fc5780636352211e1461052c576102a0565b806318160ddd1161025d57806318160ddd1461037957806323b872dd1461039757806327cfe856146103b35780632a55205a146103d15780632baa0e97146104025780632f745c5914610420576102a0565b806301ffc9a7146102a557806306fdde03146102d5578063081812fc146102f3578063095ea7b31461032357806310cc45611461033f578063145e32c51461035b575b600080fd5b6102bf60048036038101906102ba9190613c55565b6108da565b6040516102cc9190613c9d565b60405180910390f35b6102dd610954565b6040516102ea9190613d51565b60405180910390f35b61030d60048036038101906103089190613da9565b6109e6565b60405161031a9190613e17565b60405180910390f35b61033d60048036038101906103389190613e5e565b610a2c565b005b61035960048036038101906103549190613e9e565b610b43565b005b610363610b8f565b6040516103709190613e17565b60405180910390f35b610381610bb5565b60405161038e9190613eda565b60405180910390f35b6103b160048036038101906103ac9190613ef5565b610bc2565b005b6103bb610c22565b6040516103c89190613eda565b60405180910390f35b6103eb60048036038101906103e69190613f48565b610c29565b6040516103f9929190613f88565b60405180910390f35b61040a610ce3565b6040516104179190613e17565b60405180910390f35b61043a60048036038101906104359190613e5e565b610d09565b6040516104479190613eda565b60405180910390f35b61046a60048036038101906104659190613da9565b610dae565b6040516104779190613eda565b60405180910390f35b61049a60048036038101906104959190613ef5565b610dc6565b005b6104b660048036038101906104b19190613da9565b610de6565b6040516104c39190613eda565b60405180910390f35b6104e660048036038101906104e19190613da9565b610dfe565b6040516104f39190613eda565b60405180910390f35b61051660048036038101906105119190613e9e565b610e6f565b6040516105239190613eda565b60405180910390f35b61054660048036038101906105419190613da9565b610e87565b6040516105539190613e17565b60405180910390f35b61057660048036038101906105719190613e9e565b610f0d565b6040516105839190613eda565b60405180910390f35b610594610fc4565b005b61059e610fd8565b005b6105ba60048036038101906105b59190613da9565b611065565b6040516105c79190613eda565b60405180910390f35b6105ea60048036038101906105e59190613e5e565b61107d565b005b6105f4611455565b6040516106019190613e17565b60405180910390f35b61061261147b565b60405161061f9190613e17565b60405180910390f35b6106306114a5565b60405161063d9190613d51565b60405180910390f35b61064e611537565b005b61066a60048036038101906106659190613fdd565b611689565b005b61067461169f565b005b610690600480360381019061068b9190613e9e565b611a39565b60405161069d9190613c9d565b60405180910390f35b6106c060048036038101906106bb9190613e9e565b611a59565b005b6106dc60048036038101906106d79190614152565b611aa5565b005b6106e6611b07565b005b61070260048036038101906106fd9190613e9e565b611f61565b60405161070f9190613eda565b60405180910390f35b610720611f79565b60405161072d9190613eda565b60405180910390f35b610750600480360381019061074b9190613e9e565b611f85565b005b61076c60048036038101906107679190613da9565b612034565b6040516107799190613d51565b60405180910390f35b61078a612126565b005b6107946122ab565b6040516107a19190613e17565b60405180910390f35b6107c460048036038101906107bf9190613da9565b6122d1565b6040516107d19190613eda565b60405180910390f35b6107e26122e9565b6040516107ef9190613eda565b60405180910390f35b6108006122f6565b60405161080d9190613e17565b60405180910390f35b61081e612320565b60405161082b9190613e17565b60405180910390f35b61084e600480360381019061084991906141d5565b612346565b60405161085b9190613c9d565b60405180910390f35b61086c6123da565b6040516108799190613eda565b60405180910390f35b61089c60048036038101906108979190613e9e565b6123e6565b005b6108a6612493565b6040516108b39190613eda565b60405180910390f35b6108c461249a565b6040516108d19190613eda565b60405180910390f35b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061094d575061094c8261256d565b5b9050919050565b60606000805461096390614244565b80601f016020809104026020016040519081016040528092919081815260200182805461098f90614244565b80156109dc5780601f106109b1576101008083540402835291602001916109dc565b820191906000526020600020905b8154815290600101906020018083116109bf57829003601f168201915b5050505050905090565b60006109f1826125e7565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a3782610e87565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610aa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9e906142e7565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ac6612632565b73ffffffffffffffffffffffffffffffffffffffff161480610af55750610af481610aef612632565b612346565b5b610b34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2b90614379565b60405180910390fd5b610b3e838361263a565b505050565b610b4b6126f3565b80601760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600880549050905090565b610bd3610bcd612632565b82612771565b610c12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c099061440b565b60405180910390fd5b610c1d838383612806565b505050565b6201518081565b600080600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cbd9190614440565b91506127106101f484610cd0919061449c565b610cda9190614525565b90509250929050565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000610d1483610f0d565b8210610d55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4c906145c8565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600d6020528060005260406000206000915090505481565b610de183838360405180602001604052806000815250611aa5565b505050565b600e6020528060005260406000206000915090505481565b6000610e08610bb5565b8210610e49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e409061465a565b60405180910390fd5b60088281548110610e5d57610e5c61467a565b5b90600052602060002001549050919050565b60116020528060005260406000206000915090505481565b600080610e938361286b565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efb906146f5565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7490614787565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610fcc6126f3565b610fd660006128a8565b565b6000610fe2612632565b90508073ffffffffffffffffffffffffffffffffffffffff166110036122f6565b73ffffffffffffffffffffffffffffffffffffffff1614611059576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105090614819565b60405180910390fd5b611062816128a8565b50565b60106020528060005260406000206000915090505481565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663470904f46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061110e919061484e565b1561114e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611145906148c7565b60405180910390fd5b6111583382612771565b611197576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118e90614933565b60405180910390fd5b600d60008281526020019081526020016000205442106111ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e39061499f565b60405180910390fd5b600e6000828152602001908152602001600020544211611241576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123890614a0b565b60405180910390fd5b60006112fb6010600084815260200190815260200160002054600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b81526004016112b59190613e17565b602060405180830381865afa1580156112d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112f69190614a40565b6128d9565b905061130783826128f2565b8060106000848152602001908152602001600020600082825461132a9190614a6d565b92505081905550600060106000848152602001908152602001600020540361140257670de0b6b3a7640000600f6000848152602001908152602001600020546113739190614aa1565b600f60008481526020019081526020016000208190555062015180426113999190614aa1565b600e60008481526020019081526020016000208190555062093a80426113bf9190614aa1565b600d600084815260200190815260200160002081905550600f60008381526020019081526020016000205460106000848152602001908152602001600020819055505b8273ffffffffffffffffffffffffffffffffffffffff167fba481b677f2fba7935dcabd413d044804f9491caee4109873893c4524cfc07d8826040516114489190613eda565b60405180910390a2505050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546114b490614244565b80601f01602080910402602001604051908101604052809291908181526020018280546114e090614244565b801561152d5780601f106115025761010080835404028352916020019161152d565b820191906000526020600020905b81548152906001019060200180831161151057829003601f168201915b5050505050905090565b600073dc2b0d2dd2b7759d97d50db4eabdc3697311083073ffffffffffffffffffffffffffffffffffffffff16604c6040516024016115769190614b49565b6040516020818303038152906040527f1e60fd14000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516116009190614bab565b6000604051808303816000865af19150503d806000811461163d576040519150601f19603f3d011682016040523d82523d6000602084013e611642565b606091505b5050905080611686576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167d90614c0e565b60405180910390fd5b50565b61169b611694612632565b8383612ceb565b5050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663470904f46040518163ffffffff1660e01b8152600401602060405180830381865afa15801561170c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611730919061484e565b15611770576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176790614c7a565b60405180910390fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663967cb38233680821ab0d44149800003060006040518563ffffffff1660e01b81526004016117db9493929190614cd5565b600060405180830381600087803b1580156117f557600080fd5b505af1158015611809573d6000803e3d6000fd5b505050503373ffffffffffffffffffffffffffffffffffffffff167fba481b677f2fba7935dcabd413d044804f9491caee4109873893c4524cfc07d8680821ab0d441498000060405161185c9190613eda565b60405180910390a2601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1668056bc75e2d631000006040518463ffffffff1660e01b81526004016118ee93929190614d1a565b6020604051808303816000875af115801561190d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611931919061484e565b5061193e33601354612e57565b3373ffffffffffffffffffffffffffffffffffffffff167f802faf56f3a8767918e7d95051fd7c8c30bcabac4bf1bf0a30d4265fb2929a186013546040516119869190613eda565b60405180910390a262093a804261199d9190614aa1565b600d600060135481526020019081526020016000208190555062015180426119c59190614aa1565b600e6000601354815260200190815260200160002081905550670de0b6b3a7640000600f6000601354815260200190815260200160002081905550670de0b6b3a7640000601060006013548152602001908152602001600020819055506001601354611a319190614aa1565b601381905550565b60186020528060005260406000206000915054906101000a900460ff1681565b611a616126f3565b80601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611ab6611ab0612632565b83612771565b611af5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aec9061440b565b60405180910390fd5b611b0184848484612e75565b50505050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663470904f46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b98919061484e565b611bd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bce90614d9d565b60405180910390fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c474f9e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c68919061484e565b611ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9e90614e09565b60405180910390fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663967cb3823368056bc75e2d631000003060006040518563ffffffff1660e01b8152600401611d129493929190614cd5565b600060405180830381600087803b158015611d2c57600080fd5b505af1158015611d40573d6000803e3d6000fd5b505050503373ffffffffffffffffffffffffffffffffffffffff167fba481b677f2fba7935dcabd413d044804f9491caee4109873893c4524cfc07d868056bc75e2d63100000604051611d939190613eda565b60405180910390a2601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33611de261147b565b68056bc75e2d631000006040518463ffffffff1660e01b8152600401611e0a93929190614d1a565b6020604051808303816000875af1158015611e29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e4d919061484e565b50611e5a33601354612e57565b3373ffffffffffffffffffffffffffffffffffffffff167f802faf56f3a8767918e7d95051fd7c8c30bcabac4bf1bf0a30d4265fb2929a18601354604051611ea29190613eda565b60405180910390a262093a806068611eba919061449c565b42611ec59190614aa1565b600d60006013548152602001908152602001600020819055506201518042611eed9190614aa1565b600e6000601354815260200190815260200160002081905550670de0b6b3a7640000600f6000601354815260200190815260200160002081905550670de0b6b3a7640000601060006013548152602001908152602001600020819055506001601354611f599190614aa1565b601381905550565b60126020528060005260406000206000915090505481565b670de0b6b3a764000081565b611f8d6126f3565b601860008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615601860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b606061203f82612ed1565b61207e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207590614e9b565b60405180910390fd5b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c87b56dd836040518263ffffffff1660e01b81526004016120d99190613eda565b600060405180830381865afa1580156120f6573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061211f9190614f5c565b9050919050565b6000678ac7230489e80000905042601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541061219157670de0b6b3a7640000600c61218e919061449c565b90505b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518463ffffffff1660e01b815260040161221293929190614d1a565b6020604051808303816000875af1158015612231573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612255919061484e565b5062015180426122659190614aa1565b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600f6020528060005260406000206000915090505481565b680821ab0d441498000081565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b678ac7230489e8000081565b6123ee6126f3565b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff1661244e61147b565b73ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b62093a8081565b68056bc75e2d6310000081565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806125e057506125df82612f12565b5b9050919050565b6125f081612ed1565b61262f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612626906146f5565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166126ad83610e87565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6126fb612632565b73ffffffffffffffffffffffffffffffffffffffff1661271961147b565b73ffffffffffffffffffffffffffffffffffffffff161461276f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276690614ff1565b60405180910390fd5b565b60008061277d83610e87565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806127bf57506127be8185612346565b5b806127fd57508373ffffffffffffffffffffffffffffffffffffffff166127e5846109e6565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b600d600082815260200190815260200160002054421061285b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128529061505d565b60405180910390fd5b612866838383612ff4565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600b60006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556128d6816124a7565b50565b60008183106128e857816128ea565b825b905092915050565b601860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561297f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612976906150c9565b60405180910390fd5b42601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410612a00576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f79061515b565b60405180910390fd5b6000601990506000601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161490508015612a6657600091505b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663967cb382858533866040518563ffffffff1660e01b8152600401612ac7949392919061517b565b600060405180830381600087803b158015612ae157600080fd5b505af1158015612af5573d6000803e3d6000fd5b505050508015612ce557601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612b6957600080fd5b505af1158015612b7d573d6000803e3d6000fd5b5050505060006064600a85612b92919061449c565b612b9c9190614525565b905080600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612bfa9190613e17565b602060405180830381865afa158015612c17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c3b9190614a40565b1115612ce357600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401612c9e929190613f88565b6020604051808303816000875af1158015612cbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ce1919061484e565b505b505b50505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612d59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d509061520c565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612e4a9190613c9d565b60405180910390a3505050565b612e718282604051806020016040528060008152506132ed565b5050565b612e80848484612806565b612e8c84848484613348565b612ecb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ec29061529e565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff16612ef38361286b565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612fdd57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612fed5750612fec826134cf565b5b9050919050565b8273ffffffffffffffffffffffffffffffffffffffff1661301482610e87565b73ffffffffffffffffffffffffffffffffffffffff161461306a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306190615330565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036130d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130d0906153c2565b60405180910390fd5b6130e68383836001613539565b8273ffffffffffffffffffffffffffffffffffffffff1661310682610e87565b73ffffffffffffffffffffffffffffffffffffffff161461315c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161315390615330565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46132e88383836001613697565b505050565b6132f7838361369d565b6133046000848484613348565b613343576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161333a9061529e565b60405180910390fd5b505050565b60006133698473ffffffffffffffffffffffffffffffffffffffff166138ba565b156134c2578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613392612632565b8786866040518563ffffffff1660e01b81526004016133b4949392919061542c565b6020604051808303816000875af19250505080156133f057506040513d601f19601f820116820180604052508101906133ed919061548d565b60015b613472573d8060008114613420576040519150601f19603f3d011682016040523d82523d6000602084013e613425565b606091505b50600081510361346a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134619061529e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506134c7565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b613545848484846138dd565b6001811115613589576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135809061552c565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036135d0576135cb816138e3565b61360f565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161461360e5761360d858261392c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036136515761364c81613a99565b613690565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161461368f5761368e8482613b6a565b5b5b5050505050565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361370c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161370390615598565b60405180910390fd5b61371581612ed1565b15613755576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161374c90615604565b60405180910390fd5b613763600083836001613539565b61376c81612ed1565b156137ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137a390615604565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46138b6600083836001613697565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161393984610f0d565b6139439190614a6d565b9050600060076000848152602001908152602001600020549050818114613a28576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613aad9190614a6d565b9050600060096000848152602001908152602001600020549050600060088381548110613add57613adc61467a565b5b906000526020600020015490508060088381548110613aff57613afe61467a565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613b4e57613b4d615624565b5b6001900381819060005260206000200160009055905550505050565b6000613b7583610f0d565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613c3281613bfd565b8114613c3d57600080fd5b50565b600081359050613c4f81613c29565b92915050565b600060208284031215613c6b57613c6a613bf3565b5b6000613c7984828501613c40565b91505092915050565b60008115159050919050565b613c9781613c82565b82525050565b6000602082019050613cb26000830184613c8e565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613cf2578082015181840152602081019050613cd7565b83811115613d01576000848401525b50505050565b6000601f19601f8301169050919050565b6000613d2382613cb8565b613d2d8185613cc3565b9350613d3d818560208601613cd4565b613d4681613d07565b840191505092915050565b60006020820190508181036000830152613d6b8184613d18565b905092915050565b6000819050919050565b613d8681613d73565b8114613d9157600080fd5b50565b600081359050613da381613d7d565b92915050565b600060208284031215613dbf57613dbe613bf3565b5b6000613dcd84828501613d94565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613e0182613dd6565b9050919050565b613e1181613df6565b82525050565b6000602082019050613e2c6000830184613e08565b92915050565b613e3b81613df6565b8114613e4657600080fd5b50565b600081359050613e5881613e32565b92915050565b60008060408385031215613e7557613e74613bf3565b5b6000613e8385828601613e49565b9250506020613e9485828601613d94565b9150509250929050565b600060208284031215613eb457613eb3613bf3565b5b6000613ec284828501613e49565b91505092915050565b613ed481613d73565b82525050565b6000602082019050613eef6000830184613ecb565b92915050565b600080600060608486031215613f0e57613f0d613bf3565b5b6000613f1c86828701613e49565b9350506020613f2d86828701613e49565b9250506040613f3e86828701613d94565b9150509250925092565b60008060408385031215613f5f57613f5e613bf3565b5b6000613f6d85828601613d94565b9250506020613f7e85828601613d94565b9150509250929050565b6000604082019050613f9d6000830185613e08565b613faa6020830184613ecb565b9392505050565b613fba81613c82565b8114613fc557600080fd5b50565b600081359050613fd781613fb1565b92915050565b60008060408385031215613ff457613ff3613bf3565b5b600061400285828601613e49565b925050602061401385828601613fc8565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61405f82613d07565b810181811067ffffffffffffffff8211171561407e5761407d614027565b5b80604052505050565b6000614091613be9565b905061409d8282614056565b919050565b600067ffffffffffffffff8211156140bd576140bc614027565b5b6140c682613d07565b9050602081019050919050565b82818337600083830152505050565b60006140f56140f0846140a2565b614087565b90508281526020810184848401111561411157614110614022565b5b61411c8482856140d3565b509392505050565b600082601f8301126141395761413861401d565b5b81356141498482602086016140e2565b91505092915050565b6000806000806080858703121561416c5761416b613bf3565b5b600061417a87828801613e49565b945050602061418b87828801613e49565b935050604061419c87828801613d94565b925050606085013567ffffffffffffffff8111156141bd576141bc613bf8565b5b6141c987828801614124565b91505092959194509250565b600080604083850312156141ec576141eb613bf3565b5b60006141fa85828601613e49565b925050602061420b85828601613e49565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061425c57607f821691505b60208210810361426f5761426e614215565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006142d1602183613cc3565b91506142dc82614275565b604082019050919050565b60006020820190508181036000830152614300816142c4565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000614363603d83613cc3565b915061436e82614307565b604082019050919050565b6000602082019050818103600083015261439281614356565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b60006143f5602d83613cc3565b915061440082614399565b604082019050919050565b60006020820190508181036000830152614424816143e8565b9050919050565b60008151905061443a81613e32565b92915050565b60006020828403121561445657614455613bf3565b5b60006144648482850161442b565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006144a782613d73565b91506144b283613d73565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156144eb576144ea61446d565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061453082613d73565b915061453b83613d73565b92508261454b5761454a6144f6565b5b828204905092915050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006145b2602b83613cc3565b91506145bd82614556565b604082019050919050565b600060208201905081810360008301526145e1816145a5565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000614644602c83613cc3565b915061464f826145e8565b604082019050919050565b6000602082019050818103600083015261467381614637565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b60006146df601883613cc3565b91506146ea826146a9565b602082019050919050565b6000602082019050818103600083015261470e816146d2565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000614771602983613cc3565b915061477c82614715565b604082019050919050565b600060208201905081810360008301526147a081614764565b9050919050565b7f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060008201527f6e6577206f776e65720000000000000000000000000000000000000000000000602082015250565b6000614803602983613cc3565b915061480e826147a7565b604082019050919050565b60006020820190508181036000830152614832816147f6565b9050919050565b60008151905061484881613fb1565b92915050565b60006020828403121561486457614863613bf3565b5b600061487284828501614839565b91505092915050565b7f47616d6520686173206e6f742073746172746564000000000000000000000000600082015250565b60006148b1601483613cc3565b91506148bc8261487b565b602082019050919050565b600060208201905081810360008301526148e0816148a4565b9050919050565b7f596f7520646f206e6f74206f776e207468697320776f6c660000000000000000600082015250565b600061491d601883613cc3565b9150614928826148e7565b602082019050919050565b6000602082019050818103600083015261494c81614910565b9050919050565b7f796f757220776f6c662068617320737461727665640000000000000000000000600082015250565b6000614989601583613cc3565b915061499482614953565b602082019050919050565b600060208201905081810360008301526149b88161497c565b9050919050565b7f596f757220776f6c66206973206e6f742068756e677279207965740000000000600082015250565b60006149f5601b83613cc3565b9150614a00826149bf565b602082019050919050565b60006020820190508181036000830152614a24816149e8565b9050919050565b600081519050614a3a81613d7d565b92915050565b600060208284031215614a5657614a55613bf3565b5b6000614a6484828501614a2b565b91505092915050565b6000614a7882613d73565b9150614a8383613d73565b925082821015614a9657614a9561446d565b5b828203905092915050565b6000614aac82613d73565b9150614ab783613d73565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614aec57614aeb61446d565b5b828201905092915050565b6000819050919050565b600060ff82169050919050565b6000819050919050565b6000614b33614b2e614b2984614af7565b614b0e565b614b01565b9050919050565b614b4381614b18565b82525050565b6000602082019050614b5e6000830184614b3a565b92915050565b600081519050919050565b600081905092915050565b6000614b8582614b64565b614b8f8185614b6f565b9350614b9f818560208601613cd4565b80840191505092915050565b6000614bb78284614b7a565b915081905092915050565b7f4665654d20726567697374726174696f6e206661696c65640000000000000000600082015250565b6000614bf8601883613cc3565b9150614c0382614bc2565b602082019050919050565b60006020820190508181036000830152614c2781614beb565b9050919050565b7f47616d6520686173206e6f742073746172746564207965740000000000000000600082015250565b6000614c64601883613cc3565b9150614c6f82614c2e565b602082019050919050565b60006020820190508181036000830152614c9381614c57565b9050919050565b6000819050919050565b6000614cbf614cba614cb584614c9a565b614b0e565b613d73565b9050919050565b614ccf81614ca4565b82525050565b6000608082019050614cea6000830187613e08565b614cf76020830186613ecb565b614d046040830185613e08565b614d116060830184614cc6565b95945050505050565b6000606082019050614d2f6000830186613e08565b614d3c6020830185613e08565b614d496040830184613ecb565b949350505050565b7f596f752061726520746f6f206c61746500000000000000000000000000000000600082015250565b6000614d87601083613cc3565b9150614d9282614d51565b602082019050919050565b60006020820190508181036000830152614db681614d7a565b9050919050565b7f5468652073616c65206861736e27742073746172746564207965740000000000600082015250565b6000614df3601b83613cc3565b9150614dfe82614dbd565b602082019050919050565b60006020820190508181036000830152614e2281614de6565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614e85602f83613cc3565b9150614e9082614e29565b604082019050919050565b60006020820190508181036000830152614eb481614e78565b9050919050565b600067ffffffffffffffff821115614ed657614ed5614027565b5b614edf82613d07565b9050602081019050919050565b6000614eff614efa84614ebb565b614087565b905082815260208101848484011115614f1b57614f1a614022565b5b614f26848285613cd4565b509392505050565b600082601f830112614f4357614f4261401d565b5b8151614f53848260208601614eec565b91505092915050565b600060208284031215614f7257614f71613bf3565b5b600082015167ffffffffffffffff811115614f9057614f8f613bf8565b5b614f9c84828501614f2e565b91505092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614fdb602083613cc3565b9150614fe682614fa5565b602082019050919050565b6000602082019050818103600083015261500a81614fce565b9050919050565b7f596f757220776f6c662068617320737461727665640000000000000000000000600082015250565b6000615047601583613cc3565b915061505282615011565b602082019050919050565b600060208201905081810360008301526150768161503a565b9050919050565b7f43616e206e6f74206561742066726f6d20746869732061646472657373000000600082015250565b60006150b3601d83613cc3565b91506150be8261507d565b602082019050919050565b600060208201905081810360008301526150e2816150a6565b9050919050565b7f5468697320616464726573732069732063757272656e746c792070726f74656360008201527f7465640000000000000000000000000000000000000000000000000000000000602082015250565b6000615145602383613cc3565b9150615150826150e9565b604082019050919050565b6000602082019050818103600083015261517481615138565b9050919050565b60006080820190506151906000830187613e08565b61519d6020830186613ecb565b6151aa6040830185613e08565b6151b76060830184613ecb565b95945050505050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006151f6601983613cc3565b9150615201826151c0565b602082019050919050565b60006020820190508181036000830152615225816151e9565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000615288603283613cc3565b91506152938261522c565b604082019050919050565b600060208201905081810360008301526152b78161527b565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061531a602583613cc3565b9150615325826152be565b604082019050919050565b600060208201905081810360008301526153498161530d565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006153ac602483613cc3565b91506153b782615350565b604082019050919050565b600060208201905081810360008301526153db8161539f565b9050919050565b600082825260208201905092915050565b60006153fe82614b64565b61540881856153e2565b9350615418818560208601613cd4565b61542181613d07565b840191505092915050565b60006080820190506154416000830187613e08565b61544e6020830186613e08565b61545b6040830185613ecb565b818103606083015261546d81846153f3565b905095945050505050565b60008151905061548781613c29565b92915050565b6000602082840312156154a3576154a2613bf3565b5b60006154b184828501615478565b91505092915050565b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b6000615516603583613cc3565b9150615521826154ba565b604082019050919050565b6000602082019050818103600083015261554581615509565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000615582602083613cc3565b915061558d8261554c565b602082019050919050565b600060208201905081810360008301526155b181615575565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006155ee601c83613cc3565b91506155f9826155b8565b602082019050919050565b6000602082019050818103600083015261561d816155e1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea264697066735822122088e35a0c7e5d173eb4a497967bd6aae426a427f43eedce8851395ca8844e38d664736f6c634300080d0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000019330aa2832394e6d525e297f2eace513a63b7110000000000000000000000004ce37d663a6439d9ecf2c04427e9d9a24ea940a1
-----Decoded View---------------
Arg [0] : _sheep (address): 0x19330Aa2832394E6d525E297f2Eace513A63B711
Arg [1] : _sheepDog (address): 0x4Ce37D663a6439d9eCf2C04427e9d9a24EA940A1
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000019330aa2832394e6d525e297f2eace513a63b711
Arg [1] : 0000000000000000000000004ce37d663a6439d9ecf2c04427e9d9a24ea940a1
Deployed Bytecode Sourcemap
69812:7148:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75596:224;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47448:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48960:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48478:416;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76461:108;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70829:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64355:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49660:335;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70081:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75828:270;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;70796:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64023:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70200:42;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50066:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70267:41;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64545:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70529:40;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47158:223;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46889:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38207:103;;;:::i;:::-;;44932:210;;;:::i;:::-;;70412:44;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72967:925;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70169:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37559:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47617:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10458:259;;;:::i;:::-;;49203:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72252:622;;;:::i;:::-;;70864:45;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76847:108;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50322:322;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71323:754;;;:::i;:::-;;70595:49;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69880:38;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76712:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76152:245;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73900:308;;;:::i;:::-;;70766:23;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70333:41;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70022:50;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44020:101;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70735:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49429:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69925:39;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44320:181;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70123:37;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69971:44;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75596:224;75707:4;75746:26;75731:41;;;:11;:41;;;;:81;;;;75776:36;75800:11;75776:23;:36::i;:::-;75731:81;75724:88;;75596:224;;;:::o;47448:100::-;47502:13;47535:5;47528:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47448:100;:::o;48960:171::-;49036:7;49056:23;49071:7;49056:14;:23::i;:::-;49099:15;:24;49115:7;49099:24;;;;;;;;;;;;;;;;;;;;;49092:31;;48960:171;;;:::o;48478:416::-;48559:13;48575:23;48590:7;48575:14;:23::i;:::-;48559:39;;48623:5;48617:11;;:2;:11;;;48609:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;48717:5;48701:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;48726:37;48743:5;48750:12;:10;:12::i;:::-;48726:16;:37::i;:::-;48701:62;48679:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;48865:21;48874:2;48878:7;48865:8;:21::i;:::-;48548:346;48478:416;;:::o;76461:108::-;37445:13;:11;:13::i;:::-;76549:12:::1;76535:11;;:26;;;;;;;;;;;;;;;;;;76461:108:::0;:::o;70829:26::-;;;;;;;;;;;;;:::o;64355:113::-;64416:7;64443:10;:17;;;;64436:24;;64355:113;:::o;49660:335::-;49855:41;49874:12;:10;:12::i;:::-;49888:7;49855:18;:41::i;:::-;49847:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;49959:28;49969:4;49975:2;49979:7;49959:9;:28::i;:::-;49660:335;;;:::o;70081:35::-;70111:5;70081:35;:::o;75828:270::-;75924:16;75955:21;76021:5;;;;;;;;;;;76014:19;;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;76003:32;;76085:5;76079:3;76066:10;:16;;;;:::i;:::-;:24;;;;:::i;:::-;76050:40;;75828:270;;;;;:::o;70796:26::-;;;;;;;;;;;;;:::o;64023:256::-;64120:7;64156:23;64173:5;64156:16;:23::i;:::-;64148:5;:31;64140:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;64245:12;:19;64258:5;64245:19;;;;;;;;;;;;;;;:26;64265:5;64245:26;;;;;;;;;;;;64238:33;;64023:256;;;;:::o;70200:42::-;;;;;;;;;;;;;;;;;:::o;50066:185::-;50204:39;50221:4;50227:2;50231:7;50204:39;;;;;;;;;;;;:16;:39::i;:::-;50066:185;;;:::o;70267:41::-;;;;;;;;;;;;;;;;;:::o;64545:233::-;64620:7;64656:30;:28;:30::i;:::-;64648:5;:38;64640:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;64753:10;64764:5;64753:17;;;;;;;;:::i;:::-;;;;;;;;;;64746:24;;64545:233;;;:::o;70529:40::-;;;;;;;;;;;;;;;;;:::o;47158:223::-;47230:7;47250:13;47266:17;47275:7;47266:8;:17::i;:::-;47250:33;;47319:1;47302:19;;:5;:19;;;47294:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;47368:5;47361:12;;;47158:223;;;:::o;46889:207::-;46961:7;47006:1;46989:19;;:5;:19;;;46981:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;47072:9;:16;47082:5;47072:16;;;;;;;;;;;;;;;;47065:23;;46889:207;;;:::o;38207:103::-;37445:13;:11;:13::i;:::-;38272:30:::1;38299:1;38272:18;:30::i;:::-;38207:103::o:0;44932:210::-;44979:14;44996:12;:10;:12::i;:::-;44979:29;;45045:6;45027:24;;:14;:12;:14::i;:::-;:24;;;45019:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;45108:26;45127:6;45108:18;:26::i;:::-;44968:174;44932:210::o;70412:44::-;;;;;;;;;;;;;;;;;:::o;72967:925::-;73053:5;;;;;;;;;;;73046:22;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73045:25;73037:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;73113:39;73132:10;73144:7;73113:18;:39::i;:::-;73105:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;73218:7;:16;73226:7;73218:16;;;;;;;;;;;;73200:15;:34;73192:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73297:6;:15;73304:7;73297:15;;;;;;;;;;;;73279;:33;73271:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;73357:18;73378:61;73387:9;:18;73397:7;73387:18;;;;;;;;;;;;73413:5;;;;;;;;;;;73406:23;;;73430:7;73406:32;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73378:8;:61::i;:::-;73357:82;;73452:31;73463:7;73472:10;73452;:31::i;:::-;73518:10;73496:9;:18;73506:7;73496:18;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;73566:1;73544:9;:18;73554:7;73544:18;;;;;;;;;;;;:23;73541:295;;69910:8;73623:6;:15;73630:7;73623:15;;;;;;;;;;;;:21;;;;:::i;:::-;73605:6;:15;73612:7;73605:15;;;;;;;;;;;:39;;;;70111:5;73677:15;:21;;;;:::i;:::-;73659:6;:15;73666:7;73659:15;;;;;;;;;;;:39;;;;70154:6;73741:15;:22;;;;:::i;:::-;73722:7;:16;73730:7;73722:16;;;;;;;;;;;:41;;;;73809:6;:15;73816:7;73809:15;;;;;;;;;;;;73788:9;:18;73798:7;73788:18;;;;;;;;;;;:36;;;;73541:295;73864:7;73853:31;;;73873:10;73853:31;;;;;;:::i;:::-;;;;;;;;73026:866;72967:925;;:::o;70169:20::-;;;;;;;;;;;;;:::o;37559:87::-;37605:7;37632:6;;;;;;;;;;;37625:13;;37559:87;:::o;47617:104::-;47673:13;47706:7;47699:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47617:104;:::o;10458:259::-;10501:13;10527:42;10519:56;;10639:2;10590:52;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10519:134;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10500:153;;;10672:8;10664:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;10489:228;10458:259::o;49203:155::-;49298:52;49317:12;:10;:12::i;:::-;49331:8;49341;49298:18;:52::i;:::-;49203:155;;:::o;72252:622::-;72305:5;;;;;;;;;;;72298:22;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;72297:25;72289:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;72370:5;;;;;;;;;;;72363:22;;;72386:10;70062;72421:4;72427:1;72363:66;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72456:10;72445:37;;;70062:10;72445:37;;;;;;:::i;:::-;;;;;;;;72502:9;;;;;;;;;;;72495:30;;;72526:10;72538:8;;;;;;;;;;;70005:10;72495:61;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;72595:29;72605:10;72617:6;;72595:9;:29::i;:::-;72648:10;72640:27;;;72660:6;;72640:27;;;;;;:::i;:::-;;;;;;;;70154:6;72698:15;:22;;;;:::i;:::-;72680:7;:15;72688:6;;72680:15;;;;;;;;;;;:40;;;;70111:5;72748:15;:21;;;;:::i;:::-;72731:6;:14;72738:6;;72731:14;;;;;;;;;;;:38;;;;69910:8;72780:6;:14;72787:6;;72780:14;;;;;;;;;;;:20;;;;69910:8;72811:9;:17;72821:6;;72811:17;;;;;;;;;;;:23;;;;72865:1;72856:6;;:10;;;;:::i;:::-;72847:6;:19;;;;72252:622::o;70864:45::-;;;;;;;;;;;;;;;;;;;;;;:::o;76847:108::-;37445:13;:11;:13::i;:::-;76935:12:::1;76921:11;;:26;;;;;;;;;;;;;;;;;;76847:108:::0;:::o;50322:322::-;50496:41;50515:12;:10;:12::i;:::-;50529:7;50496:18;:41::i;:::-;50488:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;50598:38;50612:4;50618:2;50622:7;50631:4;50598:13;:38::i;:::-;50322:322;;;;:::o;71323:754::-;71382:5;;;;;;;;;;;71375:22;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71367:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;71445:5;;;;;;;;;;;71438:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71430:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;71516:5;;;;;;;;;;;71509:22;;;71532:10;70005;71561:4;71567:1;71509:60;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71596:10;71585:31;;;70005:10;71585:31;;;;;;:::i;:::-;;;;;;;;71636:9;;;;;;;;;;;71629:30;;;71660:10;71672:7;:5;:7::i;:::-;70005:10;71629:60;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;71728:29;71738:10;71750:6;;71728:9;:29::i;:::-;71781:10;71773:27;;;71793:6;;71773:27;;;;;;:::i;:::-;;;;;;;;70154:6;71850;:13;;;;:::i;:::-;71831:15;:33;;;;:::i;:::-;71813:7;:15;71821:6;;71813:15;;;;;;;;;;;:51;;;;70111:5;71951:15;:21;;;;:::i;:::-;71934:6;:14;71941:6;;71934:14;;;;;;;;;;;:38;;;;69910:8;71983:6;:14;71990:6;;71983:14;;;;;;;;;;;:20;;;;69910:8;72014:9;:17;72024:6;;72014:17;;;;;;;;;;;:23;;;;72068:1;72059:6;;:10;;;;:::i;:::-;72050:6;:19;;;;71323:754::o;70595:49::-;;;;;;;;;;;;;;;;;:::o;69880:38::-;69910:8;69880:38;:::o;76712:127::-;37445:13;:11;:13::i;:::-;76809::::1;:22;76823:7;76809:22;;;;;;;;;;;;;;;;;;;;;;;;;76808:23;76783:13;:22;76797:7;76783:22;;;;;;;;;;;;;;;;:48;;;;;;;;;;;;;;;;;;76712:127:::0;:::o;76152:245::-;76225:13;76259:16;76267:7;76259;:16::i;:::-;76251:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;76359:11;;;;;;;;;;;76345:35;;;76381:7;76345:44;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;76338:51;;76152:245;;;:::o;73900:308::-;73943:10;69955:9;73943:16;;74005:15;73975:14;:26;73990:10;73975:26;;;;;;;;;;;;;;;;:45;73972:93;;69910:8;74045:2;:8;;;;:::i;:::-;74037:16;;73972:93;74084:9;;;;;;;;;;;74077:30;;;74108:10;74120:8;;;;;;;;;;;74130:5;74077:59;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;70111:5;74179:15;:21;;;;:::i;:::-;74150:14;:26;74165:10;74150:26;;;;;;;;;;;;;;;:50;;;;73932:276;73900:308::o;70766:23::-;;;;;;;;;;;;;:::o;70333:41::-;;;;;;;;;;;;;;;;;:::o;70022:50::-;70062:10;70022:50;:::o;44020:101::-;44073:7;44100:13;;;;;;;;;;;44093:20;;44020:101;:::o;70735:24::-;;;;;;;;;;;;;:::o;49429:164::-;49526:4;49550:18;:25;49569:5;49550:25;;;;;;;;;;;;;;;:35;49576:8;49550:35;;;;;;;;;;;;;;;;;;;;;;;;;49543:42;;49429:164;;;;:::o;69925:39::-;69955:9;69925:39;:::o;44320:181::-;37445:13;:11;:13::i;:::-;44426:8:::1;44410:13;;:24;;;;;;;;;;;;;;;;;;44484:8;44450:43;;44475:7;:5;:7::i;:::-;44450:43;;;;;;;;;;;;44320:181:::0;:::o;70123:37::-;70154:6;70123:37;:::o;69971:44::-;70005:10;69971:44;:::o;38826:191::-;38900:16;38919:6;;;;;;;;;;;38900:25;;38945:8;38936:6;;:17;;;;;;;;;;;;;;;;;;39000:8;38969:40;;38990:8;38969:40;;;;;;;;;;;;38889:128;38826:191;:::o;63715:224::-;63817:4;63856:35;63841:50;;;:11;:50;;;;:90;;;;63895:36;63919:11;63895:23;:36::i;:::-;63841:90;63834:97;;63715:224;;;:::o;58779:135::-;58861:16;58869:7;58861;:16::i;:::-;58853:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;58779:135;:::o;10146:98::-;10199:7;10226:10;10219:17;;10146:98;:::o;58058:174::-;58160:2;58133:15;:24;58149:7;58133:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;58216:7;58212:2;58178:46;;58187:23;58202:7;58187:14;:23::i;:::-;58178:46;;;;;;;;;;;;58058:174;;:::o;37724:132::-;37799:12;:10;:12::i;:::-;37788:23;;:7;:5;:7::i;:::-;:23;;;37780:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37724:132::o;52677:264::-;52770:4;52787:13;52803:23;52818:7;52803:14;:23::i;:::-;52787:39;;52856:5;52845:16;;:7;:16;;;:52;;;;52865:32;52882:5;52889:7;52865:16;:32::i;:::-;52845:52;:87;;;;52925:7;52901:31;;:20;52913:7;52901:11;:20::i;:::-;:31;;;52845:87;52837:96;;;52677:264;;;;:::o;75207:244::-;75358:7;:16;75366:7;75358:16;;;;;;;;;;;;75340:15;:34;75332:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;75411:32;75427:4;75432:2;75435:7;75411:15;:32::i;:::-;75207:244;;;:::o;51952:117::-;52018:7;52045;:16;52053:7;52045:16;;;;;;;;;;;;;;;;;;;;;52038:23;;51952:117;;;:::o;44691:156::-;44781:13;;44774:20;;;;;;;;;;;44805:34;44830:8;44805:24;:34::i;:::-;44691:156;:::o;17150:106::-;17208:7;17239:1;17235;:5;:13;;17247:1;17235:13;;;17243:1;17235:13;17228:20;;17150:106;;;;:::o;74262:828::-;74347:13;:22;74361:7;74347:22;;;;;;;;;;;;;;;;;;;;;;;;;74346:23;74338:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;74447:15;74421:14;:23;74436:7;74421:23;;;;;;;;;;;;;;;;:41;74413:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;74514:19;74536:2;74514:24;;74549:18;74581:11;;;;;;;;;;;74570:22;;:7;:22;;;74549:43;;74608:13;74605:60;;;74652:1;74638:15;;74605:60;74685:5;;;;;;;;;;;74678:22;;;74701:7;74710:11;74723:10;74734:11;74678:68;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74762:13;74759:324;;;74798:11;;;;;;;;;;;74792:23;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74832:20;74875:3;74870:2;74856:11;:16;;;;:::i;:::-;:22;;;;:::i;:::-;74832:47;;74938:12;74904:5;;;;;;;;;;;74897:23;;;74929:4;74897:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;74894:178;;;75015:5;;;;;;;;;;;75008:22;;;75031:10;75043:12;75008:48;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;74894:178;74777:306;74759:324;74327:763;;74262:828;;:::o;58375:315::-;58530:8;58521:17;;:5;:17;;;58513:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;58617:8;58579:18;:25;58598:5;58579:25;;;;;;;;;;;;;;;:35;58605:8;58579:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;58663:8;58641:41;;58656:5;58641:41;;;58673:8;58641:41;;;;;;:::i;:::-;;;;;;;;58375:315;;;:::o;53283:110::-;53359:26;53369:2;53373:7;53359:26;;;;;;;;;;;;:9;:26::i;:::-;53283:110;;:::o;51525:313::-;51681:28;51691:4;51697:2;51701:7;51681:9;:28::i;:::-;51728:47;51751:4;51757:2;51761:7;51770:4;51728:22;:47::i;:::-;51720:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;51525:313;;;;:::o;52382:128::-;52447:4;52500:1;52471:31;;:17;52480:7;52471:8;:17::i;:::-;:31;;;;52464:38;;52382:128;;;:::o;46520:305::-;46622:4;46674:25;46659:40;;;:11;:40;;;;:105;;;;46731:33;46716:48;;;:11;:48;;;;46659:105;:158;;;;46781:36;46805:11;46781:23;:36::i;:::-;46659:158;46639:178;;46520:305;;;:::o;56676:1263::-;56835:4;56808:31;;:23;56823:7;56808:14;:23::i;:::-;:31;;;56800:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;56914:1;56900:16;;:2;:16;;;56892:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;56970:42;56991:4;56997:2;57001:7;57010:1;56970:20;:42::i;:::-;57142:4;57115:31;;:23;57130:7;57115:14;:23::i;:::-;:31;;;57107:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;57260:15;:24;57276:7;57260:24;;;;;;;;;;;;57253:31;;;;;;;;;;;57755:1;57736:9;:15;57746:4;57736:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;57788:1;57771:9;:13;57781:2;57771:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;57830:2;57811:7;:16;57819:7;57811:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;57869:7;57865:2;57850:27;;57859:4;57850:27;;;;;;;;;;;;57890:41;57910:4;57916:2;57920:7;57929:1;57890:19;:41::i;:::-;56676:1263;;;:::o;53620:319::-;53749:18;53755:2;53759:7;53749:5;:18::i;:::-;53800:53;53831:1;53835:2;53839:7;53848:4;53800:22;:53::i;:::-;53778:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;53620:319;;;:::o;59478:853::-;59632:4;59653:15;:2;:13;;;:15::i;:::-;59649:675;;;59705:2;59689:36;;;59726:12;:10;:12::i;:::-;59740:4;59746:7;59755:4;59689:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;59685:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59947:1;59930:6;:13;:18;59926:328;;59973:60;;;;;;;;;;:::i;:::-;;;;;;;;59926:328;60204:6;60198:13;60189:6;60185:2;60181:15;60174:38;59685:584;59821:41;;;59811:51;;;:6;:51;;;;59804:58;;;;;59649:675;60308:4;60301:11;;59478:853;;;;;;;:::o;30230:157::-;30315:4;30354:25;30339:40;;;:11;:40;;;;30332:47;;30230:157;;;:::o;64852:915::-;65029:61;65056:4;65062:2;65066:12;65080:9;65029:26;:61::i;:::-;65119:1;65107:9;:13;65103:222;;;65250:63;;;;;;;;;;:::i;:::-;;;;;;;;65103:222;65337:15;65355:12;65337:30;;65400:1;65384:18;;:4;:18;;;65380:187;;65419:40;65451:7;65419:31;:40::i;:::-;65380:187;;;65489:2;65481:10;;:4;:10;;;65477:90;;65508:47;65541:4;65547:7;65508:32;:47::i;:::-;65477:90;65380:187;65595:1;65581:16;;:2;:16;;;65577:183;;65614:45;65651:7;65614:36;:45::i;:::-;65577:183;;;65687:4;65681:10;;:2;:10;;;65677:83;;65708:40;65736:2;65740:7;65708:27;:40::i;:::-;65677:83;65577:183;65018:749;64852:915;;;;:::o;61944:158::-;;;;;:::o;54275:942::-;54369:1;54355:16;;:2;:16;;;54347:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;54428:16;54436:7;54428;:16::i;:::-;54427:17;54419:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;54490:48;54519:1;54523:2;54527:7;54536:1;54490:20;:48::i;:::-;54637:16;54645:7;54637;:16::i;:::-;54636:17;54628:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;55052:1;55035:9;:13;55045:2;55035:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;55096:2;55077:7;:16;55085:7;55077:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;55141:7;55137:2;55116:33;;55133:1;55116:33;;;;;;;;;;;;55162:47;55190:1;55194:2;55198:7;55207:1;55162:19;:47::i;:::-;54275:942;;:::o;1294:326::-;1354:4;1611:1;1589:7;:19;;;:23;1582:30;;1294:326;;;:::o;61063:159::-;;;;;:::o;66490:164::-;66594:10;:17;;;;66567:15;:24;66583:7;66567:24;;;;;;;;;;;:44;;;;66622:10;66638:7;66622:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66490:164;:::o;67281:988::-;67547:22;67597:1;67572:22;67589:4;67572:16;:22::i;:::-;:26;;;;:::i;:::-;67547:51;;67609:18;67630:17;:26;67648:7;67630:26;;;;;;;;;;;;67609:47;;67777:14;67763:10;:28;67759:328;;67808:19;67830:12;:18;67843:4;67830:18;;;;;;;;;;;;;;;:34;67849:14;67830:34;;;;;;;;;;;;67808:56;;67914:11;67881:12;:18;67894:4;67881:18;;;;;;;;;;;;;;;:30;67900:10;67881:30;;;;;;;;;;;:44;;;;68031:10;67998:17;:30;68016:11;67998:30;;;;;;;;;;;:43;;;;67793:294;67759:328;68183:17;:26;68201:7;68183:26;;;;;;;;;;;68176:33;;;68227:12;:18;68240:4;68227:18;;;;;;;;;;;;;;;:34;68246:14;68227:34;;;;;;;;;;;68220:41;;;67362:907;;67281:988;;:::o;68564:1079::-;68817:22;68862:1;68842:10;:17;;;;:21;;;;:::i;:::-;68817:46;;68874:18;68895:15;:24;68911:7;68895:24;;;;;;;;;;;;68874:45;;69246:19;69268:10;69279:14;69268:26;;;;;;;;:::i;:::-;;;;;;;;;;69246:48;;69332:11;69307:10;69318;69307:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;69443:10;69412:15;:28;69428:11;69412:28;;;;;;;;;;;:41;;;;69584:15;:24;69600:7;69584:24;;;;;;;;;;;69577:31;;;69619:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;68635:1008;;;68564:1079;:::o;66068:221::-;66153:14;66170:20;66187:2;66170:16;:20::i;:::-;66153:37;;66228:7;66201:12;:16;66214:2;66201:16;;;;;;;;;;;;;;;:24;66218:6;66201:24;;;;;;;;;;;:34;;;;66275:6;66246:17;:26;66264:7;66246:26;;;;;;;;;;;:35;;;;66142:147;66068:221;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:329::-;4997:6;5046:2;5034:9;5025:7;5021:23;5017:32;5014:119;;;5052:79;;:::i;:::-;5014:119;5172:1;5197:53;5242:7;5233:6;5222:9;5218:22;5197:53;:::i;:::-;5187:63;;5143:117;4938:329;;;;:::o;5273:118::-;5360:24;5378:5;5360:24;:::i;:::-;5355:3;5348:37;5273:118;;:::o;5397:222::-;5490:4;5528:2;5517:9;5513:18;5505:26;;5541:71;5609:1;5598:9;5594:17;5585:6;5541:71;:::i;:::-;5397:222;;;;:::o;5625:619::-;5702:6;5710;5718;5767:2;5755:9;5746:7;5742:23;5738:32;5735:119;;;5773:79;;:::i;:::-;5735:119;5893:1;5918:53;5963:7;5954:6;5943:9;5939:22;5918:53;:::i;:::-;5908:63;;5864:117;6020:2;6046:53;6091:7;6082:6;6071:9;6067:22;6046:53;:::i;:::-;6036:63;;5991:118;6148:2;6174:53;6219:7;6210:6;6199:9;6195:22;6174:53;:::i;:::-;6164:63;;6119:118;5625:619;;;;;:::o;6250:474::-;6318:6;6326;6375:2;6363:9;6354:7;6350:23;6346:32;6343:119;;;6381:79;;:::i;:::-;6343:119;6501:1;6526:53;6571:7;6562:6;6551:9;6547:22;6526:53;:::i;:::-;6516:63;;6472:117;6628:2;6654:53;6699:7;6690:6;6679:9;6675:22;6654:53;:::i;:::-;6644:63;;6599:118;6250:474;;;;;:::o;6730:332::-;6851:4;6889:2;6878:9;6874:18;6866:26;;6902:71;6970:1;6959:9;6955:17;6946:6;6902:71;:::i;:::-;6983:72;7051:2;7040:9;7036:18;7027:6;6983:72;:::i;:::-;6730:332;;;;;:::o;7068:116::-;7138:21;7153:5;7138:21;:::i;:::-;7131:5;7128:32;7118:60;;7174:1;7171;7164:12;7118:60;7068:116;:::o;7190:133::-;7233:5;7271:6;7258:20;7249:29;;7287:30;7311:5;7287:30;:::i;:::-;7190:133;;;;:::o;7329:468::-;7394:6;7402;7451:2;7439:9;7430:7;7426:23;7422:32;7419:119;;;7457:79;;:::i;:::-;7419:119;7577:1;7602:53;7647:7;7638:6;7627:9;7623:22;7602:53;:::i;:::-;7592:63;;7548:117;7704:2;7730:50;7772:7;7763:6;7752:9;7748:22;7730:50;:::i;:::-;7720:60;;7675:115;7329:468;;;;;:::o;7803:117::-;7912:1;7909;7902:12;7926:117;8035:1;8032;8025:12;8049:180;8097:77;8094:1;8087:88;8194:4;8191:1;8184:15;8218:4;8215:1;8208:15;8235:281;8318:27;8340:4;8318:27;:::i;:::-;8310:6;8306:40;8448:6;8436:10;8433:22;8412:18;8400:10;8397:34;8394:62;8391:88;;;8459:18;;:::i;:::-;8391:88;8499:10;8495:2;8488:22;8278:238;8235:281;;:::o;8522:129::-;8556:6;8583:20;;:::i;:::-;8573:30;;8612:33;8640:4;8632:6;8612:33;:::i;:::-;8522:129;;;:::o;8657:307::-;8718:4;8808:18;8800:6;8797:30;8794:56;;;8830:18;;:::i;:::-;8794:56;8868:29;8890:6;8868:29;:::i;:::-;8860:37;;8952:4;8946;8942:15;8934:23;;8657:307;;;:::o;8970:154::-;9054:6;9049:3;9044;9031:30;9116:1;9107:6;9102:3;9098:16;9091:27;8970:154;;;:::o;9130:410::-;9207:5;9232:65;9248:48;9289:6;9248:48;:::i;:::-;9232:65;:::i;:::-;9223:74;;9320:6;9313:5;9306:21;9358:4;9351:5;9347:16;9396:3;9387:6;9382:3;9378:16;9375:25;9372:112;;;9403:79;;:::i;:::-;9372:112;9493:41;9527:6;9522:3;9517;9493:41;:::i;:::-;9213:327;9130:410;;;;;:::o;9559:338::-;9614:5;9663:3;9656:4;9648:6;9644:17;9640:27;9630:122;;9671:79;;:::i;:::-;9630:122;9788:6;9775:20;9813:78;9887:3;9879:6;9872:4;9864:6;9860:17;9813:78;:::i;:::-;9804:87;;9620:277;9559:338;;;;:::o;9903:943::-;9998:6;10006;10014;10022;10071:3;10059:9;10050:7;10046:23;10042:33;10039:120;;;10078:79;;:::i;:::-;10039:120;10198:1;10223:53;10268:7;10259:6;10248:9;10244:22;10223:53;:::i;:::-;10213:63;;10169:117;10325:2;10351:53;10396:7;10387:6;10376:9;10372:22;10351:53;:::i;:::-;10341:63;;10296:118;10453:2;10479:53;10524:7;10515:6;10504:9;10500:22;10479:53;:::i;:::-;10469:63;;10424:118;10609:2;10598:9;10594:18;10581:32;10640:18;10632:6;10629:30;10626:117;;;10662:79;;:::i;:::-;10626:117;10767:62;10821:7;10812:6;10801:9;10797:22;10767:62;:::i;:::-;10757:72;;10552:287;9903:943;;;;;;;:::o;10852:474::-;10920:6;10928;10977:2;10965:9;10956:7;10952:23;10948:32;10945:119;;;10983:79;;:::i;:::-;10945:119;11103:1;11128:53;11173:7;11164:6;11153:9;11149:22;11128:53;:::i;:::-;11118:63;;11074:117;11230:2;11256:53;11301:7;11292:6;11281:9;11277:22;11256:53;:::i;:::-;11246:63;;11201:118;10852:474;;;;;:::o;11332:180::-;11380:77;11377:1;11370:88;11477:4;11474:1;11467:15;11501:4;11498:1;11491:15;11518:320;11562:6;11599:1;11593:4;11589:12;11579:22;;11646:1;11640:4;11636:12;11667:18;11657:81;;11723:4;11715:6;11711:17;11701:27;;11657:81;11785:2;11777:6;11774:14;11754:18;11751:38;11748:84;;11804:18;;:::i;:::-;11748:84;11569:269;11518:320;;;:::o;11844:220::-;11984:34;11980:1;11972:6;11968:14;11961:58;12053:3;12048:2;12040:6;12036:15;12029:28;11844:220;:::o;12070:366::-;12212:3;12233:67;12297:2;12292:3;12233:67;:::i;:::-;12226:74;;12309:93;12398:3;12309:93;:::i;:::-;12427:2;12422:3;12418:12;12411:19;;12070:366;;;:::o;12442:419::-;12608:4;12646:2;12635:9;12631:18;12623:26;;12695:9;12689:4;12685:20;12681:1;12670:9;12666:17;12659:47;12723:131;12849:4;12723:131;:::i;:::-;12715:139;;12442:419;;;:::o;12867:248::-;13007:34;13003:1;12995:6;12991:14;12984:58;13076:31;13071:2;13063:6;13059:15;13052:56;12867:248;:::o;13121:366::-;13263:3;13284:67;13348:2;13343:3;13284:67;:::i;:::-;13277:74;;13360:93;13449:3;13360:93;:::i;:::-;13478:2;13473:3;13469:12;13462:19;;13121:366;;;:::o;13493:419::-;13659:4;13697:2;13686:9;13682:18;13674:26;;13746:9;13740:4;13736:20;13732:1;13721:9;13717:17;13710:47;13774:131;13900:4;13774:131;:::i;:::-;13766:139;;13493:419;;;:::o;13918:232::-;14058:34;14054:1;14046:6;14042:14;14035:58;14127:15;14122:2;14114:6;14110:15;14103:40;13918:232;:::o;14156:366::-;14298:3;14319:67;14383:2;14378:3;14319:67;:::i;:::-;14312:74;;14395:93;14484:3;14395:93;:::i;:::-;14513:2;14508:3;14504:12;14497:19;;14156:366;;;:::o;14528:419::-;14694:4;14732:2;14721:9;14717:18;14709:26;;14781:9;14775:4;14771:20;14767:1;14756:9;14752:17;14745:47;14809:131;14935:4;14809:131;:::i;:::-;14801:139;;14528:419;;;:::o;14953:143::-;15010:5;15041:6;15035:13;15026:22;;15057:33;15084:5;15057:33;:::i;:::-;14953:143;;;;:::o;15102:351::-;15172:6;15221:2;15209:9;15200:7;15196:23;15192:32;15189:119;;;15227:79;;:::i;:::-;15189:119;15347:1;15372:64;15428:7;15419:6;15408:9;15404:22;15372:64;:::i;:::-;15362:74;;15318:128;15102:351;;;;:::o;15459:180::-;15507:77;15504:1;15497:88;15604:4;15601:1;15594:15;15628:4;15625:1;15618:15;15645:348;15685:7;15708:20;15726:1;15708:20;:::i;:::-;15703:25;;15742:20;15760:1;15742:20;:::i;:::-;15737:25;;15930:1;15862:66;15858:74;15855:1;15852:81;15847:1;15840:9;15833:17;15829:105;15826:131;;;15937:18;;:::i;:::-;15826:131;15985:1;15982;15978:9;15967:20;;15645:348;;;;:::o;15999:180::-;16047:77;16044:1;16037:88;16144:4;16141:1;16134:15;16168:4;16165:1;16158:15;16185:185;16225:1;16242:20;16260:1;16242:20;:::i;:::-;16237:25;;16276:20;16294:1;16276:20;:::i;:::-;16271:25;;16315:1;16305:35;;16320:18;;:::i;:::-;16305:35;16362:1;16359;16355:9;16350:14;;16185:185;;;;:::o;16376:230::-;16516:34;16512:1;16504:6;16500:14;16493:58;16585:13;16580:2;16572:6;16568:15;16561:38;16376:230;:::o;16612:366::-;16754:3;16775:67;16839:2;16834:3;16775:67;:::i;:::-;16768:74;;16851:93;16940:3;16851:93;:::i;:::-;16969:2;16964:3;16960:12;16953:19;;16612:366;;;:::o;16984:419::-;17150:4;17188:2;17177:9;17173:18;17165:26;;17237:9;17231:4;17227:20;17223:1;17212:9;17208:17;17201:47;17265:131;17391:4;17265:131;:::i;:::-;17257:139;;16984:419;;;:::o;17409:231::-;17549:34;17545:1;17537:6;17533:14;17526:58;17618:14;17613:2;17605:6;17601:15;17594:39;17409:231;:::o;17646:366::-;17788:3;17809:67;17873:2;17868:3;17809:67;:::i;:::-;17802:74;;17885:93;17974:3;17885:93;:::i;:::-;18003:2;17998:3;17994:12;17987:19;;17646:366;;;:::o;18018:419::-;18184:4;18222:2;18211:9;18207:18;18199:26;;18271:9;18265:4;18261:20;18257:1;18246:9;18242:17;18235:47;18299:131;18425:4;18299:131;:::i;:::-;18291:139;;18018:419;;;:::o;18443:180::-;18491:77;18488:1;18481:88;18588:4;18585:1;18578:15;18612:4;18609:1;18602:15;18629:174;18769:26;18765:1;18757:6;18753:14;18746:50;18629:174;:::o;18809:366::-;18951:3;18972:67;19036:2;19031:3;18972:67;:::i;:::-;18965:74;;19048:93;19137:3;19048:93;:::i;:::-;19166:2;19161:3;19157:12;19150:19;;18809:366;;;:::o;19181:419::-;19347:4;19385:2;19374:9;19370:18;19362:26;;19434:9;19428:4;19424:20;19420:1;19409:9;19405:17;19398:47;19462:131;19588:4;19462:131;:::i;:::-;19454:139;;19181:419;;;:::o;19606:228::-;19746:34;19742:1;19734:6;19730:14;19723:58;19815:11;19810:2;19802:6;19798:15;19791:36;19606:228;:::o;19840:366::-;19982:3;20003:67;20067:2;20062:3;20003:67;:::i;:::-;19996:74;;20079:93;20168:3;20079:93;:::i;:::-;20197:2;20192:3;20188:12;20181:19;;19840:366;;;:::o;20212:419::-;20378:4;20416:2;20405:9;20401:18;20393:26;;20465:9;20459:4;20455:20;20451:1;20440:9;20436:17;20429:47;20493:131;20619:4;20493:131;:::i;:::-;20485:139;;20212:419;;;:::o;20637:228::-;20777:34;20773:1;20765:6;20761:14;20754:58;20846:11;20841:2;20833:6;20829:15;20822:36;20637:228;:::o;20871:366::-;21013:3;21034:67;21098:2;21093:3;21034:67;:::i;:::-;21027:74;;21110:93;21199:3;21110:93;:::i;:::-;21228:2;21223:3;21219:12;21212:19;;20871:366;;;:::o;21243:419::-;21409:4;21447:2;21436:9;21432:18;21424:26;;21496:9;21490:4;21486:20;21482:1;21471:9;21467:17;21460:47;21524:131;21650:4;21524:131;:::i;:::-;21516:139;;21243:419;;;:::o;21668:137::-;21722:5;21753:6;21747:13;21738:22;;21769:30;21793:5;21769:30;:::i;:::-;21668:137;;;;:::o;21811:345::-;21878:6;21927:2;21915:9;21906:7;21902:23;21898:32;21895:119;;;21933:79;;:::i;:::-;21895:119;22053:1;22078:61;22131:7;22122:6;22111:9;22107:22;22078:61;:::i;:::-;22068:71;;22024:125;21811:345;;;;:::o;22162:170::-;22302:22;22298:1;22290:6;22286:14;22279:46;22162:170;:::o;22338:366::-;22480:3;22501:67;22565:2;22560:3;22501:67;:::i;:::-;22494:74;;22577:93;22666:3;22577:93;:::i;:::-;22695:2;22690:3;22686:12;22679:19;;22338:366;;;:::o;22710:419::-;22876:4;22914:2;22903:9;22899:18;22891:26;;22963:9;22957:4;22953:20;22949:1;22938:9;22934:17;22927:47;22991:131;23117:4;22991:131;:::i;:::-;22983:139;;22710:419;;;:::o;23135:174::-;23275:26;23271:1;23263:6;23259:14;23252:50;23135:174;:::o;23315:366::-;23457:3;23478:67;23542:2;23537:3;23478:67;:::i;:::-;23471:74;;23554:93;23643:3;23554:93;:::i;:::-;23672:2;23667:3;23663:12;23656:19;;23315:366;;;:::o;23687:419::-;23853:4;23891:2;23880:9;23876:18;23868:26;;23940:9;23934:4;23930:20;23926:1;23915:9;23911:17;23904:47;23968:131;24094:4;23968:131;:::i;:::-;23960:139;;23687:419;;;:::o;24112:171::-;24252:23;24248:1;24240:6;24236:14;24229:47;24112:171;:::o;24289:366::-;24431:3;24452:67;24516:2;24511:3;24452:67;:::i;:::-;24445:74;;24528:93;24617:3;24528:93;:::i;:::-;24646:2;24641:3;24637:12;24630:19;;24289:366;;;:::o;24661:419::-;24827:4;24865:2;24854:9;24850:18;24842:26;;24914:9;24908:4;24904:20;24900:1;24889:9;24885:17;24878:47;24942:131;25068:4;24942:131;:::i;:::-;24934:139;;24661:419;;;:::o;25086:177::-;25226:29;25222:1;25214:6;25210:14;25203:53;25086:177;:::o;25269:366::-;25411:3;25432:67;25496:2;25491:3;25432:67;:::i;:::-;25425:74;;25508:93;25597:3;25508:93;:::i;:::-;25626:2;25621:3;25617:12;25610:19;;25269:366;;;:::o;25641:419::-;25807:4;25845:2;25834:9;25830:18;25822:26;;25894:9;25888:4;25884:20;25880:1;25869:9;25865:17;25858:47;25922:131;26048:4;25922:131;:::i;:::-;25914:139;;25641:419;;;:::o;26066:143::-;26123:5;26154:6;26148:13;26139:22;;26170:33;26197:5;26170:33;:::i;:::-;26066:143;;;;:::o;26215:351::-;26285:6;26334:2;26322:9;26313:7;26309:23;26305:32;26302:119;;;26340:79;;:::i;:::-;26302:119;26460:1;26485:64;26541:7;26532:6;26521:9;26517:22;26485:64;:::i;:::-;26475:74;;26431:128;26215:351;;;;:::o;26572:191::-;26612:4;26632:20;26650:1;26632:20;:::i;:::-;26627:25;;26666:20;26684:1;26666:20;:::i;:::-;26661:25;;26705:1;26702;26699:8;26696:34;;;26710:18;;:::i;:::-;26696:34;26755:1;26752;26748:9;26740:17;;26572:191;;;;:::o;26769:305::-;26809:3;26828:20;26846:1;26828:20;:::i;:::-;26823:25;;26862:20;26880:1;26862:20;:::i;:::-;26857:25;;27016:1;26948:66;26944:74;26941:1;26938:81;26935:107;;;27022:18;;:::i;:::-;26935:107;27066:1;27063;27059:9;27052:16;;26769:305;;;;:::o;27080:86::-;27126:7;27155:5;27144:16;;27080:86;;;:::o;27172:::-;27207:7;27247:4;27240:5;27236:16;27225:27;;27172:86;;;:::o;27264:60::-;27292:3;27313:5;27306:12;;27264:60;;;:::o;27330:156::-;27387:9;27420:60;27436:43;27445:33;27472:5;27445:33;:::i;:::-;27436:43;:::i;:::-;27420:60;:::i;:::-;27407:73;;27330:156;;;:::o;27492:145::-;27586:44;27624:5;27586:44;:::i;:::-;27581:3;27574:57;27492:145;;:::o;27643:236::-;27743:4;27781:2;27770:9;27766:18;27758:26;;27794:78;27869:1;27858:9;27854:17;27845:6;27794:78;:::i;:::-;27643:236;;;;:::o;27885:98::-;27936:6;27970:5;27964:12;27954:22;;27885:98;;;:::o;27989:147::-;28090:11;28127:3;28112:18;;27989:147;;;;:::o;28142:373::-;28246:3;28274:38;28306:5;28274:38;:::i;:::-;28328:88;28409:6;28404:3;28328:88;:::i;:::-;28321:95;;28425:52;28470:6;28465:3;28458:4;28451:5;28447:16;28425:52;:::i;:::-;28502:6;28497:3;28493:16;28486:23;;28250:265;28142:373;;;;:::o;28521:271::-;28651:3;28673:93;28762:3;28753:6;28673:93;:::i;:::-;28666:100;;28783:3;28776:10;;28521:271;;;;:::o;28798:174::-;28938:26;28934:1;28926:6;28922:14;28915:50;28798:174;:::o;28978:366::-;29120:3;29141:67;29205:2;29200:3;29141:67;:::i;:::-;29134:74;;29217:93;29306:3;29217:93;:::i;:::-;29335:2;29330:3;29326:12;29319:19;;28978:366;;;:::o;29350:419::-;29516:4;29554:2;29543:9;29539:18;29531:26;;29603:9;29597:4;29593:20;29589:1;29578:9;29574:17;29567:47;29631:131;29757:4;29631:131;:::i;:::-;29623:139;;29350:419;;;:::o;29775:174::-;29915:26;29911:1;29903:6;29899:14;29892:50;29775:174;:::o;29955:366::-;30097:3;30118:67;30182:2;30177:3;30118:67;:::i;:::-;30111:74;;30194:93;30283:3;30194:93;:::i;:::-;30312:2;30307:3;30303:12;30296:19;;29955:366;;;:::o;30327:419::-;30493:4;30531:2;30520:9;30516:18;30508:26;;30580:9;30574:4;30570:20;30566:1;30555:9;30551:17;30544:47;30608:131;30734:4;30608:131;:::i;:::-;30600:139;;30327:419;;;:::o;30752:85::-;30797:7;30826:5;30815:16;;30752:85;;;:::o;30843:158::-;30901:9;30934:61;30952:42;30961:32;30987:5;30961:32;:::i;:::-;30952:42;:::i;:::-;30934:61;:::i;:::-;30921:74;;30843:158;;;:::o;31007:147::-;31102:45;31141:5;31102:45;:::i;:::-;31097:3;31090:58;31007:147;;:::o;31160:569::-;31345:4;31383:3;31372:9;31368:19;31360:27;;31397:71;31465:1;31454:9;31450:17;31441:6;31397:71;:::i;:::-;31478:72;31546:2;31535:9;31531:18;31522:6;31478:72;:::i;:::-;31560;31628:2;31617:9;31613:18;31604:6;31560:72;:::i;:::-;31642:80;31718:2;31707:9;31703:18;31694:6;31642:80;:::i;:::-;31160:569;;;;;;;:::o;31735:442::-;31884:4;31922:2;31911:9;31907:18;31899:26;;31935:71;32003:1;31992:9;31988:17;31979:6;31935:71;:::i;:::-;32016:72;32084:2;32073:9;32069:18;32060:6;32016:72;:::i;:::-;32098;32166:2;32155:9;32151:18;32142:6;32098:72;:::i;:::-;31735:442;;;;;;:::o;32183:166::-;32323:18;32319:1;32311:6;32307:14;32300:42;32183:166;:::o;32355:366::-;32497:3;32518:67;32582:2;32577:3;32518:67;:::i;:::-;32511:74;;32594:93;32683:3;32594:93;:::i;:::-;32712:2;32707:3;32703:12;32696:19;;32355:366;;;:::o;32727:419::-;32893:4;32931:2;32920:9;32916:18;32908:26;;32980:9;32974:4;32970:20;32966:1;32955:9;32951:17;32944:47;33008:131;33134:4;33008:131;:::i;:::-;33000:139;;32727:419;;;:::o;33152:177::-;33292:29;33288:1;33280:6;33276:14;33269:53;33152:177;:::o;33335:366::-;33477:3;33498:67;33562:2;33557:3;33498:67;:::i;:::-;33491:74;;33574:93;33663:3;33574:93;:::i;:::-;33692:2;33687:3;33683:12;33676:19;;33335:366;;;:::o;33707:419::-;33873:4;33911:2;33900:9;33896:18;33888:26;;33960:9;33954:4;33950:20;33946:1;33935:9;33931:17;33924:47;33988:131;34114:4;33988:131;:::i;:::-;33980:139;;33707:419;;;:::o;34132:234::-;34272:34;34268:1;34260:6;34256:14;34249:58;34341:17;34336:2;34328:6;34324:15;34317:42;34132:234;:::o;34372:366::-;34514:3;34535:67;34599:2;34594:3;34535:67;:::i;:::-;34528:74;;34611:93;34700:3;34611:93;:::i;:::-;34729:2;34724:3;34720:12;34713:19;;34372:366;;;:::o;34744:419::-;34910:4;34948:2;34937:9;34933:18;34925:26;;34997:9;34991:4;34987:20;34983:1;34972:9;34968:17;34961:47;35025:131;35151:4;35025:131;:::i;:::-;35017:139;;34744:419;;;:::o;35169:308::-;35231:4;35321:18;35313:6;35310:30;35307:56;;;35343:18;;:::i;:::-;35307:56;35381:29;35403:6;35381:29;:::i;:::-;35373:37;;35465:4;35459;35455:15;35447:23;;35169:308;;;:::o;35483:421::-;35572:5;35597:66;35613:49;35655:6;35613:49;:::i;:::-;35597:66;:::i;:::-;35588:75;;35686:6;35679:5;35672:21;35724:4;35717:5;35713:16;35762:3;35753:6;35748:3;35744:16;35741:25;35738:112;;;35769:79;;:::i;:::-;35738:112;35859:39;35891:6;35886:3;35881;35859:39;:::i;:::-;35578:326;35483:421;;;;;:::o;35924:355::-;35991:5;36040:3;36033:4;36025:6;36021:17;36017:27;36007:122;;36048:79;;:::i;:::-;36007:122;36158:6;36152:13;36183:90;36269:3;36261:6;36254:4;36246:6;36242:17;36183:90;:::i;:::-;36174:99;;35997:282;35924:355;;;;:::o;36285:524::-;36365:6;36414:2;36402:9;36393:7;36389:23;36385:32;36382:119;;;36420:79;;:::i;:::-;36382:119;36561:1;36550:9;36546:17;36540:24;36591:18;36583:6;36580:30;36577:117;;;36613:79;;:::i;:::-;36577:117;36718:74;36784:7;36775:6;36764:9;36760:22;36718:74;:::i;:::-;36708:84;;36511:291;36285:524;;;;:::o;36815:182::-;36955:34;36951:1;36943:6;36939:14;36932:58;36815:182;:::o;37003:366::-;37145:3;37166:67;37230:2;37225:3;37166:67;:::i;:::-;37159:74;;37242:93;37331:3;37242:93;:::i;:::-;37360:2;37355:3;37351:12;37344:19;;37003:366;;;:::o;37375:419::-;37541:4;37579:2;37568:9;37564:18;37556:26;;37628:9;37622:4;37618:20;37614:1;37603:9;37599:17;37592:47;37656:131;37782:4;37656:131;:::i;:::-;37648:139;;37375:419;;;:::o;37800:171::-;37940:23;37936:1;37928:6;37924:14;37917:47;37800:171;:::o;37977:366::-;38119:3;38140:67;38204:2;38199:3;38140:67;:::i;:::-;38133:74;;38216:93;38305:3;38216:93;:::i;:::-;38334:2;38329:3;38325:12;38318:19;;37977:366;;;:::o;38349:419::-;38515:4;38553:2;38542:9;38538:18;38530:26;;38602:9;38596:4;38592:20;38588:1;38577:9;38573:17;38566:47;38630:131;38756:4;38630:131;:::i;:::-;38622:139;;38349:419;;;:::o;38774:179::-;38914:31;38910:1;38902:6;38898:14;38891:55;38774:179;:::o;38959:366::-;39101:3;39122:67;39186:2;39181:3;39122:67;:::i;:::-;39115:74;;39198:93;39287:3;39198:93;:::i;:::-;39316:2;39311:3;39307:12;39300:19;;38959:366;;;:::o;39331:419::-;39497:4;39535:2;39524:9;39520:18;39512:26;;39584:9;39578:4;39574:20;39570:1;39559:9;39555:17;39548:47;39612:131;39738:4;39612:131;:::i;:::-;39604:139;;39331:419;;;:::o;39756:222::-;39896:34;39892:1;39884:6;39880:14;39873:58;39965:5;39960:2;39952:6;39948:15;39941:30;39756:222;:::o;39984:366::-;40126:3;40147:67;40211:2;40206:3;40147:67;:::i;:::-;40140:74;;40223:93;40312:3;40223:93;:::i;:::-;40341:2;40336:3;40332:12;40325:19;;39984:366;;;:::o;40356:419::-;40522:4;40560:2;40549:9;40545:18;40537:26;;40609:9;40603:4;40599:20;40595:1;40584:9;40580:17;40573:47;40637:131;40763:4;40637:131;:::i;:::-;40629:139;;40356:419;;;:::o;40781:553::-;40958:4;40996:3;40985:9;40981:19;40973:27;;41010:71;41078:1;41067:9;41063:17;41054:6;41010:71;:::i;:::-;41091:72;41159:2;41148:9;41144:18;41135:6;41091:72;:::i;:::-;41173;41241:2;41230:9;41226:18;41217:6;41173:72;:::i;:::-;41255;41323:2;41312:9;41308:18;41299:6;41255:72;:::i;:::-;40781:553;;;;;;;:::o;41340:175::-;41480:27;41476:1;41468:6;41464:14;41457:51;41340:175;:::o;41521:366::-;41663:3;41684:67;41748:2;41743:3;41684:67;:::i;:::-;41677:74;;41760:93;41849:3;41760:93;:::i;:::-;41878:2;41873:3;41869:12;41862:19;;41521:366;;;:::o;41893:419::-;42059:4;42097:2;42086:9;42082:18;42074:26;;42146:9;42140:4;42136:20;42132:1;42121:9;42117:17;42110:47;42174:131;42300:4;42174:131;:::i;:::-;42166:139;;41893:419;;;:::o;42318:237::-;42458:34;42454:1;42446:6;42442:14;42435:58;42527:20;42522:2;42514:6;42510:15;42503:45;42318:237;:::o;42561:366::-;42703:3;42724:67;42788:2;42783:3;42724:67;:::i;:::-;42717:74;;42800:93;42889:3;42800:93;:::i;:::-;42918:2;42913:3;42909:12;42902:19;;42561:366;;;:::o;42933:419::-;43099:4;43137:2;43126:9;43122:18;43114:26;;43186:9;43180:4;43176:20;43172:1;43161:9;43157:17;43150:47;43214:131;43340:4;43214:131;:::i;:::-;43206:139;;42933:419;;;:::o;43358:224::-;43498:34;43494:1;43486:6;43482:14;43475:58;43567:7;43562:2;43554:6;43550:15;43543:32;43358:224;:::o;43588:366::-;43730:3;43751:67;43815:2;43810:3;43751:67;:::i;:::-;43744:74;;43827:93;43916:3;43827:93;:::i;:::-;43945:2;43940:3;43936:12;43929:19;;43588:366;;;:::o;43960:419::-;44126:4;44164:2;44153:9;44149:18;44141:26;;44213:9;44207:4;44203:20;44199:1;44188:9;44184:17;44177:47;44241:131;44367:4;44241:131;:::i;:::-;44233:139;;43960:419;;;:::o;44385:223::-;44525:34;44521:1;44513:6;44509:14;44502:58;44594:6;44589:2;44581:6;44577:15;44570:31;44385:223;:::o;44614:366::-;44756:3;44777:67;44841:2;44836:3;44777:67;:::i;:::-;44770:74;;44853:93;44942:3;44853:93;:::i;:::-;44971:2;44966:3;44962:12;44955:19;;44614:366;;;:::o;44986:419::-;45152:4;45190:2;45179:9;45175:18;45167:26;;45239:9;45233:4;45229:20;45225:1;45214:9;45210:17;45203:47;45267:131;45393:4;45267:131;:::i;:::-;45259:139;;44986:419;;;:::o;45411:168::-;45494:11;45528:6;45523:3;45516:19;45568:4;45563:3;45559:14;45544:29;;45411:168;;;;:::o;45585:360::-;45671:3;45699:38;45731:5;45699:38;:::i;:::-;45753:70;45816:6;45811:3;45753:70;:::i;:::-;45746:77;;45832:52;45877:6;45872:3;45865:4;45858:5;45854:16;45832:52;:::i;:::-;45909:29;45931:6;45909:29;:::i;:::-;45904:3;45900:39;45893:46;;45675:270;45585:360;;;;:::o;45951:640::-;46146:4;46184:3;46173:9;46169:19;46161:27;;46198:71;46266:1;46255:9;46251:17;46242:6;46198:71;:::i;:::-;46279:72;46347:2;46336:9;46332:18;46323:6;46279:72;:::i;:::-;46361;46429:2;46418:9;46414:18;46405:6;46361:72;:::i;:::-;46480:9;46474:4;46470:20;46465:2;46454:9;46450:18;46443:48;46508:76;46579:4;46570:6;46508:76;:::i;:::-;46500:84;;45951:640;;;;;;;:::o;46597:141::-;46653:5;46684:6;46678:13;46669:22;;46700:32;46726:5;46700:32;:::i;:::-;46597:141;;;;:::o;46744:349::-;46813:6;46862:2;46850:9;46841:7;46837:23;46833:32;46830:119;;;46868:79;;:::i;:::-;46830:119;46988:1;47013:63;47068:7;47059:6;47048:9;47044:22;47013:63;:::i;:::-;47003:73;;46959:127;46744:349;;;;:::o;47099:240::-;47239:34;47235:1;47227:6;47223:14;47216:58;47308:23;47303:2;47295:6;47291:15;47284:48;47099:240;:::o;47345:366::-;47487:3;47508:67;47572:2;47567:3;47508:67;:::i;:::-;47501:74;;47584:93;47673:3;47584:93;:::i;:::-;47702:2;47697:3;47693:12;47686:19;;47345:366;;;:::o;47717:419::-;47883:4;47921:2;47910:9;47906:18;47898:26;;47970:9;47964:4;47960:20;47956:1;47945:9;47941:17;47934:47;47998:131;48124:4;47998:131;:::i;:::-;47990:139;;47717:419;;;:::o;48142:182::-;48282:34;48278:1;48270:6;48266:14;48259:58;48142:182;:::o;48330:366::-;48472:3;48493:67;48557:2;48552:3;48493:67;:::i;:::-;48486:74;;48569:93;48658:3;48569:93;:::i;:::-;48687:2;48682:3;48678:12;48671:19;;48330:366;;;:::o;48702:419::-;48868:4;48906:2;48895:9;48891:18;48883:26;;48955:9;48949:4;48945:20;48941:1;48930:9;48926:17;48919:47;48983:131;49109:4;48983:131;:::i;:::-;48975:139;;48702:419;;;:::o;49127:178::-;49267:30;49263:1;49255:6;49251:14;49244:54;49127:178;:::o;49311:366::-;49453:3;49474:67;49538:2;49533:3;49474:67;:::i;:::-;49467:74;;49550:93;49639:3;49550:93;:::i;:::-;49668:2;49663:3;49659:12;49652:19;;49311:366;;;:::o;49683:419::-;49849:4;49887:2;49876:9;49872:18;49864:26;;49936:9;49930:4;49926:20;49922:1;49911:9;49907:17;49900:47;49964:131;50090:4;49964:131;:::i;:::-;49956:139;;49683:419;;;:::o;50108:180::-;50156:77;50153:1;50146:88;50253:4;50250:1;50243:15;50277:4;50274:1;50267:15
Swarm Source
ipfs://88e35a0c7e5d173eb4a497967bd6aae426a427f43eedce8851395ca8844e38d6
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in S
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.