ERC-20
Overview
Max Total Supply
100,000,000,000 STONK
Holders
26
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 9 Decimals)
Balance
9,406,300,071.743538663 STONKValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
StonkToken
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-06-20 */ // SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.8.4; interface IswapPair { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; event Mint(address indexed sender, uint amount0, uint amount1); event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); function kLast() external view returns (uint); function mint(address to) external returns (uint liquidity); function burn(address to) external returns (uint amount0, uint amount1); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } // File: ISwapFactory.sol pragma solidity ^0.8.4; interface ISwapFactory { function createPair(address tokenA, address tokenB) external returns (address pair); function getPair(address tokenA, address tokenB) external returns (address pair); } // File: ISwapRouter.sol pragma solidity ^0.8.4; interface ISwapRouter { function factoryV2() external pure returns (address); function factory() external pure returns (address); function WETH() external pure returns (address); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to ) external; function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/utils/math/SignedMath.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol) pragma solidity ^0.8.0; /** * @dev Standard signed math utilities missing in the Solidity language. */ library SignedMath { /** * @dev Returns the largest of two signed numbers. */ function max(int256 a, int256 b) internal pure returns (int256) { return a > b ? a : b; } /** * @dev Returns the smallest of two signed numbers. */ function min(int256 a, int256 b) internal pure returns (int256) { return a < b ? a : b; } /** * @dev Returns the average of two signed numbers without overflow. * The result is rounded towards zero. */ function average(int256 a, int256 b) internal pure returns (int256) { // Formula from the book "Hacker's Delight" int256 x = (a & b) + ((a ^ b) >> 1); return x + (int256(uint256(x) >> 255) & (a ^ b)); } /** * @dev Returns the absolute unsigned value of a signed value. */ function abs(int256 n) internal pure returns (uint256) { unchecked { // must be unchecked in order to support `n = type(int256).min` return uint256(n >= 0 ? n : -n); } } } // File: @openzeppelin/contracts/utils/math/Math.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1, "Math: mulDiv overflow"); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10 ** 64) { value /= 10 ** 64; result += 64; } if (value >= 10 ** 32) { value /= 10 ** 32; result += 32; } if (value >= 10 ** 16) { value /= 10 ** 16; result += 16; } if (value >= 10 ** 8) { value /= 10 ** 8; result += 8; } if (value >= 10 ** 4) { value /= 10 ** 4; result += 4; } if (value >= 10 ** 2) { value /= 10 ** 2; result += 2; } if (value >= 10 ** 1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 256, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0); } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `int256` to its ASCII `string` decimal representation. */ function toString(int256 value) internal pure returns (string memory) { return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMath.abs(value)))); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } /** * @dev Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return keccak256(bytes(a)) == keccak256(bytes(b)); } } // File: @openzeppelin/contracts/access/IAccessControl.sol // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; } // File: @openzeppelin/contracts/utils/math/SafeMath.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/AccessControl.sol // OpenZeppelin Contracts (last updated v4.9.0) (access/AccessControl.sol) pragma solidity ^0.8.0; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ```solidity * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ```solidity * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules} * to enforce additional security measures for this role. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `_msgSender()` is missing `role`. * Overriding this function changes the behavior of the {onlyRole} modifier. * * Format of the revert message is described in {_checkRole}. * * _Available since v4.6._ */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(account), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleGranted} event. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleRevoked} event. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. * * May emit a {RoleRevoked} event. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * May emit a {RoleGranted} event. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. * * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); } // File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File: @openzeppelin/contracts/token/ERC20/ERC20.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * The default value of {decimals} is 18. To change this, you should override * this function so it returns a different value. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the default value returned by this function, unless * it's overridden. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `from` to `to`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer(address from, address to, uint256 amount) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by // decrementing then incrementing. _balances[to] += amount; } emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; unchecked { // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above. _balances[account] += amount; } emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; // Overflow not possible: amount <= accountBalance <= totalSupply. _totalSupply -= amount; } emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance(address owner, address spender, uint256 amount) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {} } // File: TOKEN\AutoBuyToken7.sol pragma solidity ^0.8.4; contract StonkToken is ERC20,Ownable,AccessControl { bytes32 private constant MANAGER_ROLE = keccak256("MANAGER_ROLE"); using SafeMath for uint256; ISwapRouter private uniswapV2Router; address public uniswapV2Pair; address public fundToken; uint256 public startTradeBlock; address admin; address fundAddr; mapping(address => bool) private whiteList; constructor()ERC20("STONK", "STONK") { admin=0xe8041DE7d6406d003d6d6b9F4892358762e33f7A; fundAddr=0x27cA8eB6bC165535eb47eE708da9C7646E6e4c5F; uint256 total=100000000000*10**decimals(); _mint(admin, total); _grantRole(DEFAULT_ADMIN_ROLE,admin); _grantRole(MANAGER_ROLE, admin); _grantRole(MANAGER_ROLE, address(this)); whiteList[admin] = true; whiteList[address(this)] = true; transferOwnership(admin); } function setPair(address _fundtoken, address _swap)external onlyRole(MANAGER_ROLE) { fundToken= _fundtoken; uniswapV2Router = ISwapRouter(_swap); uniswapV2Pair = ISwapFactory(uniswapV2Router.factory()).createPair(address(this), fundToken); ERC20(fundToken).approve(address(uniswapV2Router), type(uint256).max); _approve(address(this), address(uniswapV2Router),type(uint256).max); _approve(address(this), address(this),type(uint256).max); _approve(admin, address(uniswapV2Router),type(uint256).max); _approve(fundAddr, address(uniswapV2Router),type(uint256).max); } function decimals() public view virtual override returns (uint8) { return 9; } function _transfer( address from, address to, uint256 amount ) internal override { require(amount > 0, "amount must gt 0"); if(from != uniswapV2Pair && to != uniswapV2Pair) { super._transfer(from, to, amount); return; } if(from == uniswapV2Pair) { require(startTradeBlock > 0, "wait open"); super._transfer(from, to, amount); return; } if(to == uniswapV2Pair) { if(whiteList[from]){ super._transfer(from, to, amount); return; } swapFund(amount, fundAddr); super._transfer(from, to, amount); return; } } bool private inSwap; modifier lockTheSwap { inSwap = true; _; inSwap = false; } function autoBuy(uint256 _count) public { ERC20(fundToken).transferFrom(msg.sender, address(this), _count); swapToken(_count, fundAddr); } function swapToken(uint256 tokenAmount, address to) private lockTheSwap { address[] memory path = new address[](2); path[0] = address(fundToken); path[1] = address(this); uint256 balance = IERC20(fundToken).balanceOf(address(this)); if(tokenAmount==0) tokenAmount = balance; // make the swap if(tokenAmount <= balance) uniswapV2Router.swapExactTokensForTokensSupportingFeeOnTransferTokens( tokenAmount, 0, // accept any amount of CA path, to, block.timestamp ); } function swapFund(uint256 tokenAmount,address to) private lockTheSwap { uint256 balance = balanceOf(address(this)); if(balance < tokenAmount) tokenAmount = balance; if(tokenAmount>0){ address[] memory path = new address[](2); path[0] = address(this); path[1] = fundToken; uniswapV2Router.swapExactTokensForTokensSupportingFeeOnTransferTokens(tokenAmount,0,path,to,block.timestamp); } } function startTrade(address[] calldata adrs, uint[] calldata amounts) public onlyRole(MANAGER_ROLE) { require(adrs.length == amounts.length, "error num"); startTradeBlock = block.number; for(uint i=0;i < adrs.length;i++) { ERC20(fundToken).transferFrom(msg.sender, address(this), amounts[i]); swapToken(amounts[i] ,adrs[i]); } } function errorToken(address _token) external onlyRole(MANAGER_ROLE){ ERC20(_token).transfer(msg.sender, IERC20(_token).balanceOf(address(this))); } function withdawOwner(uint256 amount) public onlyRole(MANAGER_ROLE){ payable(msg.sender).transfer(amount); } receive () external payable { } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","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":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"autoBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"errorToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fundToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_fundtoken","type":"address"},{"internalType":"address","name":"_swap","type":"address"}],"name":"setPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"adrs","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"startTrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTradeBlock","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":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdawOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040518060400160405280600581526020017f53544f4e4b0000000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f53544f4e4b00000000000000000000000000000000000000000000000000000081525081600390816200008f919062000b15565b508060049081620000a1919062000b15565b505050620000c4620000b86200039f60201b60201c565b620003a760201b60201c565b73e8041de7d6406d003d6d6b9f4892358762e33f7a600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507327ca8eb6bc165535eb47ee708da9c7646e6e4c5f600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000620001806200046d60201b60201c565b600a6200018e919062000d8c565b64174876e800620001a0919062000ddd565b9050620001d6600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826200047660201b60201c565b6200020d6000801b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16620005e360201b60201c565b620002617f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b08600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16620005e360201b60201c565b620002937f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b0830620005e360201b60201c565b6001600d6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600d60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555062000398600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16620006d560201b60201c565b506200101e565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006009905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620004e8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004df9062000e89565b60405180910390fd5b620004fc600083836200076b60201b60201c565b806002600082825462000510919062000eab565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620005c3919062000ef7565b60405180910390a3620005df600083836200077060201b60201c565b5050565b620005f582826200077560201b60201c565b620006d15760016006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620006766200039f60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b620006e5620007e060201b60201c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160362000757576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200074e9062000f8a565b60405180910390fd5b6200076881620003a760201b60201c565b50565b505050565b505050565b60006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b620007f06200039f60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620008166200087160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200086f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008669062000ffc565b60405180910390fd5b565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200091d57607f821691505b602082108103620009335762000932620008d5565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200099d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200095e565b620009a986836200095e565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620009f6620009f0620009ea84620009c1565b620009cb565b620009c1565b9050919050565b6000819050919050565b62000a1283620009d5565b62000a2a62000a2182620009fd565b8484546200096b565b825550505050565b600090565b62000a4162000a32565b62000a4e81848462000a07565b505050565b5b8181101562000a765762000a6a60008262000a37565b60018101905062000a54565b5050565b601f82111562000ac55762000a8f8162000939565b62000a9a846200094e565b8101602085101562000aaa578190505b62000ac262000ab9856200094e565b83018262000a53565b50505b505050565b600082821c905092915050565b600062000aea6000198460080262000aca565b1980831691505092915050565b600062000b05838362000ad7565b9150826002028217905092915050565b62000b20826200089b565b67ffffffffffffffff81111562000b3c5762000b3b620008a6565b5b62000b48825462000904565b62000b5582828562000a7a565b600060209050601f83116001811462000b8d576000841562000b78578287015190505b62000b84858262000af7565b86555062000bf4565b601f19841662000b9d8662000939565b60005b8281101562000bc75784890151825560018201915060208501945060208101905062000ba0565b8683101562000be7578489015162000be3601f89168262000ad7565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b600185111562000c8a5780860481111562000c625762000c6162000bfc565b5b600185161562000c725780820291505b808102905062000c828562000c2b565b945062000c42565b94509492505050565b60008262000ca5576001905062000d78565b8162000cb5576000905062000d78565b816001811462000cce576002811462000cd95762000d0f565b600191505062000d78565b60ff84111562000cee5762000ced62000bfc565b5b8360020a91508482111562000d085762000d0762000bfc565b5b5062000d78565b5060208310610133831016604e8410600b841016171562000d495782820a90508381111562000d435762000d4262000bfc565b5b62000d78565b62000d58848484600162000c38565b9250905081840481111562000d725762000d7162000bfc565b5b81810290505b9392505050565b600060ff82169050919050565b600062000d9982620009c1565b915062000da68362000d7f565b925062000dd57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000c93565b905092915050565b600062000dea82620009c1565b915062000df783620009c1565b925082820262000e0781620009c1565b9150828204841483151762000e215762000e2062000bfc565b5b5092915050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062000e71601f8362000e28565b915062000e7e8262000e39565b602082019050919050565b6000602082019050818103600083015262000ea48162000e62565b9050919050565b600062000eb882620009c1565b915062000ec583620009c1565b925082820190508082111562000ee05762000edf62000bfc565b5b92915050565b62000ef181620009c1565b82525050565b600060208201905062000f0e600083018462000ee6565b92915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600062000f7260268362000e28565b915062000f7f8262000f14565b604082019050919050565b6000602082019050818103600083015262000fa58162000f63565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062000fe460208362000e28565b915062000ff18262000fac565b602082019050919050565b60006020820190508181036000830152620010178162000fd5565b9050919050565b613b08806200102e6000396000f3fe6080604052600436106101c65760003560e01c80635f27de99116100f75780639c3a59f211610095578063d547741f11610064578063d547741f14610687578063d9927448146106b0578063dd62ed3e146106d9578063f2fde38b14610716576101cd565b80639c3a59f2146105b9578063a217fddf146105e2578063a457c2d71461060d578063a9059cbb1461064a576101cd565b80638da5cb5b116100d15780638da5cb5b146104fd57806391d148541461052857806395c5c5e31461056557806395d89b411461058e576101cd565b80635f27de991461048057806370a08231146104a9578063715018a6146104e6576101cd565b80632f2ff15d11610164578063395093511161013e57806339509351146103c257806349bd5a5e146103ff57806350adcdb71461042a578063553193ca14610455576101cd565b80632f2ff15d14610345578063313ce5671461036e57806336568abe14610399576101cd565b806318160ddd116101a057806318160ddd146102775780631c6a0c4c146102a257806323b872dd146102cb578063248a9ca314610308576101cd565b806301ffc9a7146101d257806306fdde031461020f578063095ea7b31461023a576101cd565b366101cd57005b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f491906128ab565b61073f565b60405161020691906128f3565b60405180910390f35b34801561021b57600080fd5b506102246107b9565b604051610231919061299e565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c9190612a54565b61084b565b60405161026e91906128f3565b60405180910390f35b34801561028357600080fd5b5061028c61086e565b6040516102999190612aa3565b60405180910390f35b3480156102ae57600080fd5b506102c960048036038101906102c49190612abe565b610878565b005b3480156102d757600080fd5b506102f260048036038101906102ed9190612aeb565b6108ed565b6040516102ff91906128f3565b60405180910390f35b34801561031457600080fd5b5061032f600480360381019061032a9190612b74565b61091c565b60405161033c9190612bb0565b60405180910390f35b34801561035157600080fd5b5061036c60048036038101906103679190612bcb565b61093c565b005b34801561037a57600080fd5b5061038361095d565b6040516103909190612c27565b60405180910390f35b3480156103a557600080fd5b506103c060048036038101906103bb9190612bcb565b610966565b005b3480156103ce57600080fd5b506103e960048036038101906103e49190612a54565b6109e9565b6040516103f691906128f3565b60405180910390f35b34801561040b57600080fd5b50610414610a20565b6040516104219190612c51565b60405180910390f35b34801561043657600080fd5b5061043f610a46565b60405161044c9190612c51565b60405180910390f35b34801561046157600080fd5b5061046a610a6c565b6040516104779190612aa3565b60405180910390f35b34801561048c57600080fd5b506104a760048036038101906104a29190612abe565b610a72565b005b3480156104b557600080fd5b506104d060048036038101906104cb9190612c6c565b610b44565b6040516104dd9190612aa3565b60405180910390f35b3480156104f257600080fd5b506104fb610b8c565b005b34801561050957600080fd5b50610512610ba0565b60405161051f9190612c51565b60405180910390f35b34801561053457600080fd5b5061054f600480360381019061054a9190612bcb565b610bca565b60405161055c91906128f3565b60405180910390f35b34801561057157600080fd5b5061058c60048036038101906105879190612c99565b610c35565b005b34801561059a57600080fd5b506105a361108f565b6040516105b0919061299e565b60405180910390f35b3480156105c557600080fd5b506105e060048036038101906105db9190612d94565b611121565b005b3480156105ee57600080fd5b506105f76112c9565b6040516106049190612bb0565b60405180910390f35b34801561061957600080fd5b50610634600480360381019061062f9190612a54565b6112d0565b60405161064191906128f3565b60405180910390f35b34801561065657600080fd5b50610671600480360381019061066c9190612a54565b611347565b60405161067e91906128f3565b60405180910390f35b34801561069357600080fd5b506106ae60048036038101906106a99190612bcb565b61136a565b005b3480156106bc57600080fd5b506106d760048036038101906106d29190612c6c565b61138b565b005b3480156106e557600080fd5b5061070060048036038101906106fb9190612c99565b6114b1565b60405161070d9190612aa3565b60405180910390f35b34801561072257600080fd5b5061073d60048036038101906107389190612c6c565b611538565b005b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107b257506107b1826115bb565b5b9050919050565b6060600380546107c890612e44565b80601f01602080910402602001604051908101604052809291908181526020018280546107f490612e44565b80156108415780601f1061081657610100808354040283529160200191610841565b820191906000526020600020905b81548152906001019060200180831161082457829003601f168201915b5050505050905090565b600080610856611625565b905061086381858561162d565b600191505092915050565b6000600254905090565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b086108a2816117f6565b3373ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f193505050501580156108e8573d6000803e3d6000fd5b505050565b6000806108f8611625565b905061090585828561180a565b610910858585611896565b60019150509392505050565b600060066000838152602001908152602001600020600101549050919050565b6109458261091c565b61094e816117f6565b6109588383611b3d565b505050565b60006009905090565b61096e611625565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d290612ee7565b60405180910390fd5b6109e58282611c1e565b5050565b6000806109f4611625565b9050610a15818585610a0685896114b1565b610a109190612f36565b61162d565b600191505092915050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a5481565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b8152600401610ad193929190612f6a565b6020604051808303816000875af1158015610af0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b149190612fcd565b50610b4181600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611d00565b50565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610b94611f94565b610b9e6000612012565b565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b08610c5f816117f6565b82600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d72919061300f565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b8152600401610dce92919061303c565b6020604051808303816000875af1158015610ded573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e11919061300f565b600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401610ef0929190613065565b6020604051808303816000875af1158015610f0f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f339190612fcd565b50610f8130600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61162d565b610fac30307fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61162d565b61101b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61162d565b61108a600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61162d565b505050565b60606004805461109e90612e44565b80601f01602080910402602001604051908101604052809291908181526020018280546110ca90612e44565b80156111175780601f106110ec57610100808354040283529160200191611117565b820191906000526020600020905b8154815290600101906020018083116110fa57829003601f168201915b5050505050905090565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b0861114b816117f6565b828290508585905014611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118a906130da565b60405180910390fd5b43600a8190555060005b858590508110156112c157600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33308787868181106111fb576111fa6130fa565b5b905060200201356040518463ffffffff1660e01b815260040161122093929190612f6a565b6020604051808303816000875af115801561123f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112639190612fcd565b506112ae84848381811061127a576112796130fa565b5b90506020020135878784818110611294576112936130fa565b5b90506020020160208101906112a99190612c6c565b611d00565b80806112b990613129565b91505061119d565b505050505050565b6000801b81565b6000806112db611625565b905060006112e982866114b1565b90508381101561132e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611325906131e3565b60405180910390fd5b61133b828686840361162d565b60019250505092915050565b600080611352611625565b905061135f818585611896565b600191505092915050565b6113738261091c565b61137c816117f6565b6113868383611c1e565b505050565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b086113b5816117f6565b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb338473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161140b9190612c51565b602060405180830381865afa158015611428573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061144c9190613218565b6040518363ffffffff1660e01b8152600401611469929190613065565b6020604051808303816000875af1158015611488573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ac9190612fcd565b505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611540611f94565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036115af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a6906132b7565b60405180910390fd5b6115b881612012565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361169c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169390613349565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361170b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611702906133db565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516117e99190612aa3565b60405180910390a3505050565b61180781611802611625565b6120d8565b50565b600061181684846114b1565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146118905781811015611882576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187990613447565b60405180910390fd5b61188f848484840361162d565b5b50505050565b600081116118d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d0906134b3565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156119855750600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b1561199a5761199583838361215d565b611b38565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611a44576000600a5411611a34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2b9061351f565b60405180910390fd5b611a3f83838361215d565b611b38565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611b3757600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611afb57611af683838361215d565b611b38565b611b2781600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166123d3565b611b3283838361215d565b611b38565b5b505050565b611b478282610bca565b611c1a5760016006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611bbf611625565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b611c288282610bca565b15611cfc5760006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611ca1611625565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6001600e60006101000a81548160ff0219169083151502179055506000600267ffffffffffffffff811115611d3857611d3761353f565b5b604051908082528060200260200182016040528015611d665781602001602082028036833780820191505090505b509050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600081518110611da057611d9f6130fa565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250503081600181518110611def57611dee6130fa565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611e869190612c51565b602060405180830381865afa158015611ea3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ec79190613218565b905060008403611ed5578093505b808411611f7357600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c11d7958560008587426040518663ffffffff1660e01b8152600401611f40959493929190613671565b600060405180830381600087803b158015611f5a57600080fd5b505af1158015611f6e573d6000803e3d6000fd5b505050505b50506000600e60006101000a81548160ff0219169083151502179055505050565b611f9c611625565b73ffffffffffffffffffffffffffffffffffffffff16611fba610ba0565b73ffffffffffffffffffffffffffffffffffffffff1614612010576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200790613717565b60405180910390fd5b565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6120e28282610bca565b612159576120ef816125d6565b6120fd8360001c6020612603565b60405160200161210e92919061380b565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612150919061299e565b60405180910390fd5b5050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036121cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c3906138b7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361223b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223290613949565b60405180910390fd5b61224683838361283f565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156122cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c3906139db565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516123ba9190612aa3565b60405180910390a36123cd848484612844565b50505050565b6001600e60006101000a81548160ff02191690831515021790555060006123f930610b44565b905082811015612407578092505b60008311156125b6576000600267ffffffffffffffff81111561242d5761242c61353f565b5b60405190808252806020026020018201604052801561245b5781602001602082028036833780820191505090505b5090503081600081518110612473576124726130fa565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16816001815181106124e4576124e36130fa565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c11d7958560008487426040518663ffffffff1660e01b8152600401612582959493929190613671565b600060405180830381600087803b15801561259c57600080fd5b505af11580156125b0573d6000803e3d6000fd5b50505050505b506000600e60006101000a81548160ff0219169083151502179055505050565b60606125fc8273ffffffffffffffffffffffffffffffffffffffff16601460ff16612603565b9050919050565b60606000600283600261261691906139fb565b6126209190612f36565b67ffffffffffffffff8111156126395761263861353f565b5b6040519080825280601f01601f19166020018201604052801561266b5781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106126a3576126a26130fa565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612707576127066130fa565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000600184600261274791906139fb565b6127519190612f36565b90505b60018111156127f1577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612793576127926130fa565b5b1a60f81b8282815181106127aa576127a96130fa565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806127ea90613a3d565b9050612754565b5060008414612835576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282c90613ab2565b60405180910390fd5b8091505092915050565b505050565b505050565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61288881612853565b811461289357600080fd5b50565b6000813590506128a58161287f565b92915050565b6000602082840312156128c1576128c0612849565b5b60006128cf84828501612896565b91505092915050565b60008115159050919050565b6128ed816128d8565b82525050565b600060208201905061290860008301846128e4565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561294857808201518184015260208101905061292d565b60008484015250505050565b6000601f19601f8301169050919050565b60006129708261290e565b61297a8185612919565b935061298a81856020860161292a565b61299381612954565b840191505092915050565b600060208201905081810360008301526129b88184612965565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006129eb826129c0565b9050919050565b6129fb816129e0565b8114612a0657600080fd5b50565b600081359050612a18816129f2565b92915050565b6000819050919050565b612a3181612a1e565b8114612a3c57600080fd5b50565b600081359050612a4e81612a28565b92915050565b60008060408385031215612a6b57612a6a612849565b5b6000612a7985828601612a09565b9250506020612a8a85828601612a3f565b9150509250929050565b612a9d81612a1e565b82525050565b6000602082019050612ab86000830184612a94565b92915050565b600060208284031215612ad457612ad3612849565b5b6000612ae284828501612a3f565b91505092915050565b600080600060608486031215612b0457612b03612849565b5b6000612b1286828701612a09565b9350506020612b2386828701612a09565b9250506040612b3486828701612a3f565b9150509250925092565b6000819050919050565b612b5181612b3e565b8114612b5c57600080fd5b50565b600081359050612b6e81612b48565b92915050565b600060208284031215612b8a57612b89612849565b5b6000612b9884828501612b5f565b91505092915050565b612baa81612b3e565b82525050565b6000602082019050612bc56000830184612ba1565b92915050565b60008060408385031215612be257612be1612849565b5b6000612bf085828601612b5f565b9250506020612c0185828601612a09565b9150509250929050565b600060ff82169050919050565b612c2181612c0b565b82525050565b6000602082019050612c3c6000830184612c18565b92915050565b612c4b816129e0565b82525050565b6000602082019050612c666000830184612c42565b92915050565b600060208284031215612c8257612c81612849565b5b6000612c9084828501612a09565b91505092915050565b60008060408385031215612cb057612caf612849565b5b6000612cbe85828601612a09565b9250506020612ccf85828601612a09565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f840112612cfe57612cfd612cd9565b5b8235905067ffffffffffffffff811115612d1b57612d1a612cde565b5b602083019150836020820283011115612d3757612d36612ce3565b5b9250929050565b60008083601f840112612d5457612d53612cd9565b5b8235905067ffffffffffffffff811115612d7157612d70612cde565b5b602083019150836020820283011115612d8d57612d8c612ce3565b5b9250929050565b60008060008060408587031215612dae57612dad612849565b5b600085013567ffffffffffffffff811115612dcc57612dcb61284e565b5b612dd887828801612ce8565b9450945050602085013567ffffffffffffffff811115612dfb57612dfa61284e565b5b612e0787828801612d3e565b925092505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612e5c57607f821691505b602082108103612e6f57612e6e612e15565b5b50919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000612ed1602f83612919565b9150612edc82612e75565b604082019050919050565b60006020820190508181036000830152612f0081612ec4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612f4182612a1e565b9150612f4c83612a1e565b9250828201905080821115612f6457612f63612f07565b5b92915050565b6000606082019050612f7f6000830186612c42565b612f8c6020830185612c42565b612f996040830184612a94565b949350505050565b612faa816128d8565b8114612fb557600080fd5b50565b600081519050612fc781612fa1565b92915050565b600060208284031215612fe357612fe2612849565b5b6000612ff184828501612fb8565b91505092915050565b600081519050613009816129f2565b92915050565b60006020828403121561302557613024612849565b5b600061303384828501612ffa565b91505092915050565b60006040820190506130516000830185612c42565b61305e6020830184612c42565b9392505050565b600060408201905061307a6000830185612c42565b6130876020830184612a94565b9392505050565b7f6572726f72206e756d0000000000000000000000000000000000000000000000600082015250565b60006130c4600983612919565b91506130cf8261308e565b602082019050919050565b600060208201905081810360008301526130f3816130b7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061313482612a1e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361316657613165612f07565b5b600182019050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006131cd602583612919565b91506131d882613171565b604082019050919050565b600060208201905081810360008301526131fc816131c0565b9050919050565b60008151905061321281612a28565b92915050565b60006020828403121561322e5761322d612849565b5b600061323c84828501613203565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006132a1602683612919565b91506132ac82613245565b604082019050919050565b600060208201905081810360008301526132d081613294565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613333602483612919565b915061333e826132d7565b604082019050919050565b6000602082019050818103600083015261336281613326565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006133c5602283612919565b91506133d082613369565b604082019050919050565b600060208201905081810360008301526133f4816133b8565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000613431601d83612919565b915061343c826133fb565b602082019050919050565b6000602082019050818103600083015261346081613424565b9050919050565b7f616d6f756e74206d757374206774203000000000000000000000000000000000600082015250565b600061349d601083612919565b91506134a882613467565b602082019050919050565b600060208201905081810360008301526134cc81613490565b9050919050565b7f77616974206f70656e0000000000000000000000000000000000000000000000600082015250565b6000613509600983612919565b9150613514826134d3565b602082019050919050565b60006020820190508181036000830152613538816134fc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000819050919050565b6000819050919050565b600061359d6135986135938461356e565b613578565b612a1e565b9050919050565b6135ad81613582565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6135e8816129e0565b82525050565b60006135fa83836135df565b60208301905092915050565b6000602082019050919050565b600061361e826135b3565b61362881856135be565b9350613633836135cf565b8060005b8381101561366457815161364b88826135ee565b975061365683613606565b925050600181019050613637565b5085935050505092915050565b600060a0820190506136866000830188612a94565b61369360208301876135a4565b81810360408301526136a58186613613565b90506136b46060830185612c42565b6136c16080830184612a94565b9695505050505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613701602083612919565b915061370c826136cb565b602082019050919050565b60006020820190508181036000830152613730816136f4565b9050919050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000613778601783613737565b915061378382613742565b601782019050919050565b60006137998261290e565b6137a38185613737565b93506137b381856020860161292a565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b60006137f5601183613737565b9150613800826137bf565b601182019050919050565b60006138168261376b565b9150613822828561378e565b915061382d826137e8565b9150613839828461378e565b91508190509392505050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006138a1602583612919565b91506138ac82613845565b604082019050919050565b600060208201905081810360008301526138d081613894565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000613933602383612919565b915061393e826138d7565b604082019050919050565b6000602082019050818103600083015261396281613926565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006139c5602683612919565b91506139d082613969565b604082019050919050565b600060208201905081810360008301526139f4816139b8565b9050919050565b6000613a0682612a1e565b9150613a1183612a1e565b9250828202613a1f81612a1e565b91508282048414831517613a3657613a35612f07565b5b5092915050565b6000613a4882612a1e565b915060008203613a5b57613a5a612f07565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000613a9c602083612919565b9150613aa782613a66565b602082019050919050565b60006020820190508181036000830152613acb81613a8f565b905091905056fea2646970667358221220a2842f0ab57208ab11edd84da8b0c8112152fa0f68129cd79a0fe4774302384464736f6c63430008120033
Deployed Bytecode
0x6080604052600436106101c65760003560e01c80635f27de99116100f75780639c3a59f211610095578063d547741f11610064578063d547741f14610687578063d9927448146106b0578063dd62ed3e146106d9578063f2fde38b14610716576101cd565b80639c3a59f2146105b9578063a217fddf146105e2578063a457c2d71461060d578063a9059cbb1461064a576101cd565b80638da5cb5b116100d15780638da5cb5b146104fd57806391d148541461052857806395c5c5e31461056557806395d89b411461058e576101cd565b80635f27de991461048057806370a08231146104a9578063715018a6146104e6576101cd565b80632f2ff15d11610164578063395093511161013e57806339509351146103c257806349bd5a5e146103ff57806350adcdb71461042a578063553193ca14610455576101cd565b80632f2ff15d14610345578063313ce5671461036e57806336568abe14610399576101cd565b806318160ddd116101a057806318160ddd146102775780631c6a0c4c146102a257806323b872dd146102cb578063248a9ca314610308576101cd565b806301ffc9a7146101d257806306fdde031461020f578063095ea7b31461023a576101cd565b366101cd57005b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f491906128ab565b61073f565b60405161020691906128f3565b60405180910390f35b34801561021b57600080fd5b506102246107b9565b604051610231919061299e565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c9190612a54565b61084b565b60405161026e91906128f3565b60405180910390f35b34801561028357600080fd5b5061028c61086e565b6040516102999190612aa3565b60405180910390f35b3480156102ae57600080fd5b506102c960048036038101906102c49190612abe565b610878565b005b3480156102d757600080fd5b506102f260048036038101906102ed9190612aeb565b6108ed565b6040516102ff91906128f3565b60405180910390f35b34801561031457600080fd5b5061032f600480360381019061032a9190612b74565b61091c565b60405161033c9190612bb0565b60405180910390f35b34801561035157600080fd5b5061036c60048036038101906103679190612bcb565b61093c565b005b34801561037a57600080fd5b5061038361095d565b6040516103909190612c27565b60405180910390f35b3480156103a557600080fd5b506103c060048036038101906103bb9190612bcb565b610966565b005b3480156103ce57600080fd5b506103e960048036038101906103e49190612a54565b6109e9565b6040516103f691906128f3565b60405180910390f35b34801561040b57600080fd5b50610414610a20565b6040516104219190612c51565b60405180910390f35b34801561043657600080fd5b5061043f610a46565b60405161044c9190612c51565b60405180910390f35b34801561046157600080fd5b5061046a610a6c565b6040516104779190612aa3565b60405180910390f35b34801561048c57600080fd5b506104a760048036038101906104a29190612abe565b610a72565b005b3480156104b557600080fd5b506104d060048036038101906104cb9190612c6c565b610b44565b6040516104dd9190612aa3565b60405180910390f35b3480156104f257600080fd5b506104fb610b8c565b005b34801561050957600080fd5b50610512610ba0565b60405161051f9190612c51565b60405180910390f35b34801561053457600080fd5b5061054f600480360381019061054a9190612bcb565b610bca565b60405161055c91906128f3565b60405180910390f35b34801561057157600080fd5b5061058c60048036038101906105879190612c99565b610c35565b005b34801561059a57600080fd5b506105a361108f565b6040516105b0919061299e565b60405180910390f35b3480156105c557600080fd5b506105e060048036038101906105db9190612d94565b611121565b005b3480156105ee57600080fd5b506105f76112c9565b6040516106049190612bb0565b60405180910390f35b34801561061957600080fd5b50610634600480360381019061062f9190612a54565b6112d0565b60405161064191906128f3565b60405180910390f35b34801561065657600080fd5b50610671600480360381019061066c9190612a54565b611347565b60405161067e91906128f3565b60405180910390f35b34801561069357600080fd5b506106ae60048036038101906106a99190612bcb565b61136a565b005b3480156106bc57600080fd5b506106d760048036038101906106d29190612c6c565b61138b565b005b3480156106e557600080fd5b5061070060048036038101906106fb9190612c99565b6114b1565b60405161070d9190612aa3565b60405180910390f35b34801561072257600080fd5b5061073d60048036038101906107389190612c6c565b611538565b005b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107b257506107b1826115bb565b5b9050919050565b6060600380546107c890612e44565b80601f01602080910402602001604051908101604052809291908181526020018280546107f490612e44565b80156108415780601f1061081657610100808354040283529160200191610841565b820191906000526020600020905b81548152906001019060200180831161082457829003601f168201915b5050505050905090565b600080610856611625565b905061086381858561162d565b600191505092915050565b6000600254905090565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b086108a2816117f6565b3373ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f193505050501580156108e8573d6000803e3d6000fd5b505050565b6000806108f8611625565b905061090585828561180a565b610910858585611896565b60019150509392505050565b600060066000838152602001908152602001600020600101549050919050565b6109458261091c565b61094e816117f6565b6109588383611b3d565b505050565b60006009905090565b61096e611625565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d290612ee7565b60405180910390fd5b6109e58282611c1e565b5050565b6000806109f4611625565b9050610a15818585610a0685896114b1565b610a109190612f36565b61162d565b600191505092915050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a5481565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b8152600401610ad193929190612f6a565b6020604051808303816000875af1158015610af0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b149190612fcd565b50610b4181600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611d00565b50565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610b94611f94565b610b9e6000612012565b565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b08610c5f816117f6565b82600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d72919061300f565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b8152600401610dce92919061303c565b6020604051808303816000875af1158015610ded573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e11919061300f565b600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401610ef0929190613065565b6020604051808303816000875af1158015610f0f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f339190612fcd565b50610f8130600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61162d565b610fac30307fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61162d565b61101b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61162d565b61108a600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61162d565b505050565b60606004805461109e90612e44565b80601f01602080910402602001604051908101604052809291908181526020018280546110ca90612e44565b80156111175780601f106110ec57610100808354040283529160200191611117565b820191906000526020600020905b8154815290600101906020018083116110fa57829003601f168201915b5050505050905090565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b0861114b816117f6565b828290508585905014611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118a906130da565b60405180910390fd5b43600a8190555060005b858590508110156112c157600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33308787868181106111fb576111fa6130fa565b5b905060200201356040518463ffffffff1660e01b815260040161122093929190612f6a565b6020604051808303816000875af115801561123f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112639190612fcd565b506112ae84848381811061127a576112796130fa565b5b90506020020135878784818110611294576112936130fa565b5b90506020020160208101906112a99190612c6c565b611d00565b80806112b990613129565b91505061119d565b505050505050565b6000801b81565b6000806112db611625565b905060006112e982866114b1565b90508381101561132e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611325906131e3565b60405180910390fd5b61133b828686840361162d565b60019250505092915050565b600080611352611625565b905061135f818585611896565b600191505092915050565b6113738261091c565b61137c816117f6565b6113868383611c1e565b505050565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b086113b5816117f6565b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb338473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161140b9190612c51565b602060405180830381865afa158015611428573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061144c9190613218565b6040518363ffffffff1660e01b8152600401611469929190613065565b6020604051808303816000875af1158015611488573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ac9190612fcd565b505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611540611f94565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036115af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a6906132b7565b60405180910390fd5b6115b881612012565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361169c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169390613349565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361170b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611702906133db565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516117e99190612aa3565b60405180910390a3505050565b61180781611802611625565b6120d8565b50565b600061181684846114b1565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146118905781811015611882576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187990613447565b60405180910390fd5b61188f848484840361162d565b5b50505050565b600081116118d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d0906134b3565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156119855750600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b1561199a5761199583838361215d565b611b38565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611a44576000600a5411611a34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2b9061351f565b60405180910390fd5b611a3f83838361215d565b611b38565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611b3757600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611afb57611af683838361215d565b611b38565b611b2781600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166123d3565b611b3283838361215d565b611b38565b5b505050565b611b478282610bca565b611c1a5760016006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611bbf611625565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b611c288282610bca565b15611cfc5760006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611ca1611625565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6001600e60006101000a81548160ff0219169083151502179055506000600267ffffffffffffffff811115611d3857611d3761353f565b5b604051908082528060200260200182016040528015611d665781602001602082028036833780820191505090505b509050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600081518110611da057611d9f6130fa565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250503081600181518110611def57611dee6130fa565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611e869190612c51565b602060405180830381865afa158015611ea3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ec79190613218565b905060008403611ed5578093505b808411611f7357600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c11d7958560008587426040518663ffffffff1660e01b8152600401611f40959493929190613671565b600060405180830381600087803b158015611f5a57600080fd5b505af1158015611f6e573d6000803e3d6000fd5b505050505b50506000600e60006101000a81548160ff0219169083151502179055505050565b611f9c611625565b73ffffffffffffffffffffffffffffffffffffffff16611fba610ba0565b73ffffffffffffffffffffffffffffffffffffffff1614612010576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200790613717565b60405180910390fd5b565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6120e28282610bca565b612159576120ef816125d6565b6120fd8360001c6020612603565b60405160200161210e92919061380b565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612150919061299e565b60405180910390fd5b5050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036121cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c3906138b7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361223b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223290613949565b60405180910390fd5b61224683838361283f565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156122cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c3906139db565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516123ba9190612aa3565b60405180910390a36123cd848484612844565b50505050565b6001600e60006101000a81548160ff02191690831515021790555060006123f930610b44565b905082811015612407578092505b60008311156125b6576000600267ffffffffffffffff81111561242d5761242c61353f565b5b60405190808252806020026020018201604052801561245b5781602001602082028036833780820191505090505b5090503081600081518110612473576124726130fa565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16816001815181106124e4576124e36130fa565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c11d7958560008487426040518663ffffffff1660e01b8152600401612582959493929190613671565b600060405180830381600087803b15801561259c57600080fd5b505af11580156125b0573d6000803e3d6000fd5b50505050505b506000600e60006101000a81548160ff0219169083151502179055505050565b60606125fc8273ffffffffffffffffffffffffffffffffffffffff16601460ff16612603565b9050919050565b60606000600283600261261691906139fb565b6126209190612f36565b67ffffffffffffffff8111156126395761263861353f565b5b6040519080825280601f01601f19166020018201604052801561266b5781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106126a3576126a26130fa565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612707576127066130fa565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000600184600261274791906139fb565b6127519190612f36565b90505b60018111156127f1577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612793576127926130fa565b5b1a60f81b8282815181106127aa576127a96130fa565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806127ea90613a3d565b9050612754565b5060008414612835576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282c90613ab2565b60405180910390fd5b8091505092915050565b505050565b505050565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61288881612853565b811461289357600080fd5b50565b6000813590506128a58161287f565b92915050565b6000602082840312156128c1576128c0612849565b5b60006128cf84828501612896565b91505092915050565b60008115159050919050565b6128ed816128d8565b82525050565b600060208201905061290860008301846128e4565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561294857808201518184015260208101905061292d565b60008484015250505050565b6000601f19601f8301169050919050565b60006129708261290e565b61297a8185612919565b935061298a81856020860161292a565b61299381612954565b840191505092915050565b600060208201905081810360008301526129b88184612965565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006129eb826129c0565b9050919050565b6129fb816129e0565b8114612a0657600080fd5b50565b600081359050612a18816129f2565b92915050565b6000819050919050565b612a3181612a1e565b8114612a3c57600080fd5b50565b600081359050612a4e81612a28565b92915050565b60008060408385031215612a6b57612a6a612849565b5b6000612a7985828601612a09565b9250506020612a8a85828601612a3f565b9150509250929050565b612a9d81612a1e565b82525050565b6000602082019050612ab86000830184612a94565b92915050565b600060208284031215612ad457612ad3612849565b5b6000612ae284828501612a3f565b91505092915050565b600080600060608486031215612b0457612b03612849565b5b6000612b1286828701612a09565b9350506020612b2386828701612a09565b9250506040612b3486828701612a3f565b9150509250925092565b6000819050919050565b612b5181612b3e565b8114612b5c57600080fd5b50565b600081359050612b6e81612b48565b92915050565b600060208284031215612b8a57612b89612849565b5b6000612b9884828501612b5f565b91505092915050565b612baa81612b3e565b82525050565b6000602082019050612bc56000830184612ba1565b92915050565b60008060408385031215612be257612be1612849565b5b6000612bf085828601612b5f565b9250506020612c0185828601612a09565b9150509250929050565b600060ff82169050919050565b612c2181612c0b565b82525050565b6000602082019050612c3c6000830184612c18565b92915050565b612c4b816129e0565b82525050565b6000602082019050612c666000830184612c42565b92915050565b600060208284031215612c8257612c81612849565b5b6000612c9084828501612a09565b91505092915050565b60008060408385031215612cb057612caf612849565b5b6000612cbe85828601612a09565b9250506020612ccf85828601612a09565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f840112612cfe57612cfd612cd9565b5b8235905067ffffffffffffffff811115612d1b57612d1a612cde565b5b602083019150836020820283011115612d3757612d36612ce3565b5b9250929050565b60008083601f840112612d5457612d53612cd9565b5b8235905067ffffffffffffffff811115612d7157612d70612cde565b5b602083019150836020820283011115612d8d57612d8c612ce3565b5b9250929050565b60008060008060408587031215612dae57612dad612849565b5b600085013567ffffffffffffffff811115612dcc57612dcb61284e565b5b612dd887828801612ce8565b9450945050602085013567ffffffffffffffff811115612dfb57612dfa61284e565b5b612e0787828801612d3e565b925092505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612e5c57607f821691505b602082108103612e6f57612e6e612e15565b5b50919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000612ed1602f83612919565b9150612edc82612e75565b604082019050919050565b60006020820190508181036000830152612f0081612ec4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612f4182612a1e565b9150612f4c83612a1e565b9250828201905080821115612f6457612f63612f07565b5b92915050565b6000606082019050612f7f6000830186612c42565b612f8c6020830185612c42565b612f996040830184612a94565b949350505050565b612faa816128d8565b8114612fb557600080fd5b50565b600081519050612fc781612fa1565b92915050565b600060208284031215612fe357612fe2612849565b5b6000612ff184828501612fb8565b91505092915050565b600081519050613009816129f2565b92915050565b60006020828403121561302557613024612849565b5b600061303384828501612ffa565b91505092915050565b60006040820190506130516000830185612c42565b61305e6020830184612c42565b9392505050565b600060408201905061307a6000830185612c42565b6130876020830184612a94565b9392505050565b7f6572726f72206e756d0000000000000000000000000000000000000000000000600082015250565b60006130c4600983612919565b91506130cf8261308e565b602082019050919050565b600060208201905081810360008301526130f3816130b7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061313482612a1e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361316657613165612f07565b5b600182019050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006131cd602583612919565b91506131d882613171565b604082019050919050565b600060208201905081810360008301526131fc816131c0565b9050919050565b60008151905061321281612a28565b92915050565b60006020828403121561322e5761322d612849565b5b600061323c84828501613203565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006132a1602683612919565b91506132ac82613245565b604082019050919050565b600060208201905081810360008301526132d081613294565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613333602483612919565b915061333e826132d7565b604082019050919050565b6000602082019050818103600083015261336281613326565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006133c5602283612919565b91506133d082613369565b604082019050919050565b600060208201905081810360008301526133f4816133b8565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000613431601d83612919565b915061343c826133fb565b602082019050919050565b6000602082019050818103600083015261346081613424565b9050919050565b7f616d6f756e74206d757374206774203000000000000000000000000000000000600082015250565b600061349d601083612919565b91506134a882613467565b602082019050919050565b600060208201905081810360008301526134cc81613490565b9050919050565b7f77616974206f70656e0000000000000000000000000000000000000000000000600082015250565b6000613509600983612919565b9150613514826134d3565b602082019050919050565b60006020820190508181036000830152613538816134fc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000819050919050565b6000819050919050565b600061359d6135986135938461356e565b613578565b612a1e565b9050919050565b6135ad81613582565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6135e8816129e0565b82525050565b60006135fa83836135df565b60208301905092915050565b6000602082019050919050565b600061361e826135b3565b61362881856135be565b9350613633836135cf565b8060005b8381101561366457815161364b88826135ee565b975061365683613606565b925050600181019050613637565b5085935050505092915050565b600060a0820190506136866000830188612a94565b61369360208301876135a4565b81810360408301526136a58186613613565b90506136b46060830185612c42565b6136c16080830184612a94565b9695505050505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613701602083612919565b915061370c826136cb565b602082019050919050565b60006020820190508181036000830152613730816136f4565b9050919050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000613778601783613737565b915061378382613742565b601782019050919050565b60006137998261290e565b6137a38185613737565b93506137b381856020860161292a565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b60006137f5601183613737565b9150613800826137bf565b601182019050919050565b60006138168261376b565b9150613822828561378e565b915061382d826137e8565b9150613839828461378e565b91508190509392505050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006138a1602583612919565b91506138ac82613845565b604082019050919050565b600060208201905081810360008301526138d081613894565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000613933602383612919565b915061393e826138d7565b604082019050919050565b6000602082019050818103600083015261396281613926565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006139c5602683612919565b91506139d082613969565b604082019050919050565b600060208201905081810360008301526139f4816139b8565b9050919050565b6000613a0682612a1e565b9150613a1183612a1e565b9250828202613a1f81612a1e565b91508282048414831517613a3657613a35612f07565b5b5092915050565b6000613a4882612a1e565b915060008203613a5b57613a5a612f07565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000613a9c602083612919565b9150613aa782613a66565b602082019050919050565b60006020820190508181036000830152613acb81613a8f565b905091905056fea2646970667358221220a2842f0ab57208ab11edd84da8b0c8112152fa0f68129cd79a0fe4774302384464736f6c63430008120033
Deployed Bytecode Sourcemap
62777:4620:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37629:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51719:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54079:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52848:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67229:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54860:261;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39452:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39893:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64356:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41037:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55530:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62982:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63017:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63048:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65369:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53019:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45174:103;;;;;;;;;;;;;:::i;:::-;;44533:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37925:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63699:645;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51938:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66653:395;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37030:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56271:436;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53352:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40333:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67056:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53608:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45432:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37629:204;37714:4;37753:32;37738:47;;;:11;:47;;;;:87;;;;37789:36;37813:11;37789:23;:36::i;:::-;37738:87;37731:94;;37629:204;;;:::o;51719:100::-;51773:13;51806:5;51799:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51719:100;:::o;54079:201::-;54162:4;54179:13;54195:12;:10;:12::i;:::-;54179:28;;54218:32;54227:5;54234:7;54243:6;54218:8;:32::i;:::-;54268:4;54261:11;;;54079:201;;;;:::o;52848:108::-;52909:7;52936:12;;52929:19;;52848:108;:::o;67229:122::-;62875:25;37521:16;37532:4;37521:10;:16::i;:::-;67315:10:::1;67307:28;;:36;67336:6;67307:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;67229:122:::0;;:::o;54860:261::-;54957:4;54974:15;54992:12;:10;:12::i;:::-;54974:30;;55015:38;55031:4;55037:7;55046:6;55015:15;:38::i;:::-;55064:27;55074:4;55080:2;55084:6;55064:9;:27::i;:::-;55109:4;55102:11;;;54860:261;;;;;:::o;39452:131::-;39526:7;39553:6;:12;39560:4;39553:12;;;;;;;;;;;:22;;;39546:29;;39452:131;;;:::o;39893:147::-;39976:18;39989:4;39976:12;:18::i;:::-;37521:16;37532:4;37521:10;:16::i;:::-;40007:25:::1;40018:4;40024:7;40007:10;:25::i;:::-;39893:147:::0;;;:::o;64356:92::-;64414:5;64439:1;64432:8;;64356:92;:::o;41037:218::-;41144:12;:10;:12::i;:::-;41133:23;;:7;:23;;;41125:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;41221:26;41233:4;41239:7;41221:11;:26::i;:::-;41037:218;;:::o;55530:238::-;55618:4;55635:13;55651:12;:10;:12::i;:::-;55635:28;;55674:64;55683:5;55690:7;55727:10;55699:25;55709:5;55716:7;55699:9;:25::i;:::-;:38;;;;:::i;:::-;55674:8;:64::i;:::-;55756:4;55749:11;;;55530:238;;;;:::o;62982:28::-;;;;;;;;;;;;;:::o;63017:24::-;;;;;;;;;;;;;:::o;63048:30::-;;;;:::o;65369:162::-;65426:9;;;;;;;;;;;65420:29;;;65450:10;65470:4;65477:6;65420:64;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;65495:28;65505:6;65514:8;;;;;;;;;;;65495:9;:28::i;:::-;65369:162;:::o;53019:127::-;53093:7;53120:9;:18;53130:7;53120:18;;;;;;;;;;;;;;;;53113:25;;53019:127;;;:::o;45174:103::-;44419:13;:11;:13::i;:::-;45239:30:::1;45266:1;45239:18;:30::i;:::-;45174:103::o:0;44533:87::-;44579:7;44606:6;;;;;;;;;;;44599:13;;44533:87;:::o;37925:147::-;38011:4;38035:6;:12;38042:4;38035:12;;;;;;;;;;;:20;;:29;38056:7;38035:29;;;;;;;;;;;;;;;;;;;;;;;;;38028:36;;37925:147;;;;:::o;63699:645::-;62875:25;37521:16;37532:4;37521:10;:16::i;:::-;63804:10:::1;63793:9;;:21;;;;;;;;;;;;;;;;;;63855:5;63825:15;;:36;;;;;;;;;;;;;;;;;;63901:15;;;;;;;;;;;:23;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63888:50;;;63947:4;63954:9;;;;;;;;;;;63888:76;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63872:13;;:92;;;;;;;;;;;;;;;;;;63983:9;;;;;;;;;;;63977:24;;;64010:15;;;;;;;;;;;64028:17;63977:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;64059:67;64076:4;64091:15;;;;;;;;;;;64108:17;64059:8;:67::i;:::-;64137:56;64154:4;64169;64175:17;64137:8;:56::i;:::-;64204:59;64213:5;;;;;;;;;;;64228:15;;;;;;;;;;;64245:17;64204:8;:59::i;:::-;64274:62;64283:8;;;;;;;;;;;64301:15;;;;;;;;;;;64318:17;64274:8;:62::i;:::-;63699:645:::0;;;:::o;51938:104::-;51994:13;52027:7;52020:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51938:104;:::o;66653:395::-;62875:25;37521:16;37532:4;37521:10;:16::i;:::-;66787:7:::1;;:14;;66772:4;;:11;;:29;66764:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;66844:12;66826:15;:30;;;;66871:6;66867:174;66884:4;;:11;;66880:1;:15;66867:174;;;66922:9;;;;;;;;;;;66916:29;;;66946:10;66966:4;66973:7;;66981:1;66973:10;;;;;;;:::i;:::-;;;;;;;;66916:68;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;66999:30;67009:7;;67017:1;67009:10;;;;;;;:::i;:::-;;;;;;;;67021:4;;67026:1;67021:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;66999:9;:30::i;:::-;66896:3;;;;;:::i;:::-;;;;66867:174;;;;66653:395:::0;;;;;:::o;37030:49::-;37075:4;37030:49;;;:::o;56271:436::-;56364:4;56381:13;56397:12;:10;:12::i;:::-;56381:28;;56420:24;56447:25;56457:5;56464:7;56447:9;:25::i;:::-;56420:52;;56511:15;56491:16;:35;;56483:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;56604:60;56613:5;56620:7;56648:15;56629:16;:34;56604:8;:60::i;:::-;56695:4;56688:11;;;;56271:436;;;;:::o;53352:193::-;53431:4;53448:13;53464:12;:10;:12::i;:::-;53448:28;;53487;53497:5;53504:2;53508:6;53487:9;:28::i;:::-;53533:4;53526:11;;;53352:193;;;;:::o;40333:149::-;40417:18;40430:4;40417:12;:18::i;:::-;37521:16;37532:4;37521:10;:16::i;:::-;40448:26:::1;40460:4;40466:7;40448:11;:26::i;:::-;40333:149:::0;;;:::o;67056:161::-;62875:25;37521:16;37532:4;37521:10;:16::i;:::-;67140:6:::1;67134:22;;;67157:10;67176:6;67169:24;;;67202:4;67169:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67134:75;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;67056:161:::0;;:::o;53608:151::-;53697:7;53724:11;:18;53736:5;53724:18;;;;;;;;;;;;;;;:27;53743:7;53724:27;;;;;;;;;;;;;;;;53717:34;;53608:151;;;;:::o;45432:201::-;44419:13;:11;:13::i;:::-;45541:1:::1;45521:22;;:8;:22;;::::0;45513:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;45597:28;45616:8;45597:18;:28::i;:::-;45432:201:::0;:::o;6574:157::-;6659:4;6698:25;6683:40;;;:11;:40;;;;6676:47;;6574:157;;;:::o;34719:98::-;34772:7;34799:10;34792:17;;34719:98;:::o;60264:346::-;60383:1;60366:19;;:5;:19;;;60358:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60464:1;60445:21;;:7;:21;;;60437:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60548:6;60518:11;:18;60530:5;60518:18;;;;;;;;;;;;;;;:27;60537:7;60518:27;;;;;;;;;;;;;;;:36;;;;60586:7;60570:32;;60579:5;60570:32;;;60595:6;60570:32;;;;;;:::i;:::-;;;;;;;;60264:346;;;:::o;38376:105::-;38443:30;38454:4;38460:12;:10;:12::i;:::-;38443:10;:30::i;:::-;38376:105;:::o;60901:419::-;61002:24;61029:25;61039:5;61046:7;61029:9;:25::i;:::-;61002:52;;61089:17;61069:16;:37;61065:248;;61151:6;61131:16;:26;;61123:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61235:51;61244:5;61251:7;61279:6;61260:16;:25;61235:8;:51::i;:::-;61065:248;60991:329;60901:419;;;:::o;64459:776::-;64600:1;64591:6;:10;64583:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;64654:13;;;;;;;;;;;64646:21;;:4;:21;;;;:44;;;;;64677:13;;;;;;;;;;;64671:19;;:2;:19;;;;64646:44;64643:130;;;64707:33;64723:4;64729:2;64733:6;64707:15;:33::i;:::-;64755:7;;64643:130;64794:13;;;;;;;;;;;64786:21;;:4;:21;;;64783:163;;64850:1;64832:15;;:19;64824:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;64880:33;64896:4;64902:2;64906:6;64880:15;:33::i;:::-;64928:7;;64783:163;64965:13;;;;;;;;;;;64959:19;;:2;:19;;;64956:272;;64998:9;:15;65008:4;64998:15;;;;;;;;;;;;;;;;;;;;;;;;;64995:112;;;65033:33;65049:4;65055:2;65059:6;65033:15;:33::i;:::-;65085:7;;64995:112;65121:26;65130:6;65138:8;;;;;;;;;;;65121;:26::i;:::-;65162:33;65178:4;65184:2;65188:6;65162:15;:33::i;:::-;65210:7;;64956:272;64459:776;;;;:::o;42634:238::-;42718:22;42726:4;42732:7;42718;:22::i;:::-;42713:152;;42789:4;42757:6;:12;42764:4;42757:12;;;;;;;;;;;:20;;:29;42778:7;42757:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;42840:12;:10;:12::i;:::-;42813:40;;42831:7;42813:40;;42825:4;42813:40;;;;;;;;;;42713:152;42634:238;;:::o;43052:239::-;43136:22;43144:4;43150:7;43136;:22::i;:::-;43132:152;;;43207:5;43175:6;:12;43182:4;43175:12;;;;;;;;;;;:20;;:29;43196:7;43175:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;43259:12;:10;:12::i;:::-;43232:40;;43250:7;43232:40;;43244:4;43232:40;;;;;;;;;;43132:152;43052:239;;:::o;65539:614::-;65310:4;65301:6;;:13;;;;;;;;;;;;;;;;;;65622:21:::1;65660:1;65646:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65622:40;;65691:9;;;;;;;;;;;65673:4;65678:1;65673:7;;;;;;;;:::i;:::-;;;;;;;:28;;;;;;;;;::::0;::::1;65730:4;65712;65717:1;65712:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;::::0;::::1;65746:15;65771:9;;;;;;;;;;;65764:27;;;65800:4;65764:42;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65746:60;;65833:1;65820:11;:14:::0;65817:40:::1;;65850:7;65836:21;;65817:40;65912:7;65897:11;:22;65894:251;;65930:15;;;;;;;;;;;:69;;;66014:11;66040:1;66083:4;66102:2;66119:15;65930:215;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;65894:251;65611:542;;65346:5:::0;65337:6;;:14;;;;;;;;;;;;;;;;;;65539:614;;:::o;44698:132::-;44773:12;:10;:12::i;:::-;44762:23;;:7;:5;:7::i;:::-;:23;;;44754:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44698:132::o;45793:191::-;45867:16;45886:6;;;;;;;;;;;45867:25;;45912:8;45903:6;;:17;;;;;;;;;;;;;;;;;;45967:8;45936:40;;45957:8;45936:40;;;;;;;;;;;;45856:128;45793:191;:::o;38771:492::-;38860:22;38868:4;38874:7;38860;:22::i;:::-;38855:401;;39048:28;39068:7;39048:19;:28::i;:::-;39149:38;39177:4;39169:13;;39184:2;39149:19;:38::i;:::-;38953:257;;;;;;;;;:::i;:::-;;;;;;;;;;;;;38899:345;;;;;;;;;;;:::i;:::-;;;;;;;;38855:401;38771:492;;:::o;57177:806::-;57290:1;57274:18;;:4;:18;;;57266:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57367:1;57353:16;;:2;:16;;;57345:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;57422:38;57443:4;57449:2;57453:6;57422:20;:38::i;:::-;57473:19;57495:9;:15;57505:4;57495:15;;;;;;;;;;;;;;;;57473:37;;57544:6;57529:11;:21;;57521:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;57661:6;57647:11;:20;57629:9;:15;57639:4;57629:15;;;;;;;;;;;;;;;:38;;;;57864:6;57847:9;:13;57857:2;57847:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;57914:2;57899:26;;57908:4;57899:26;;;57918:6;57899:26;;;;;;:::i;:::-;;;;;;;;57938:37;57958:4;57964:2;57968:6;57938:19;:37::i;:::-;57255:728;57177:806;;;:::o;66167:478::-;65310:4;65301:6;;:13;;;;;;;;;;;;;;;;;;66248:15:::1;66266:24;66284:4;66266:9;:24::i;:::-;66248:42;;66314:11;66304:7;:21;66301:47;;;66341:7;66327:21;;66301:47;66374:1;66362:11;:13;66359:279;;;66391:21;66429:1;66415:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66391:40;;66464:4;66446;66451:1;66446:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;::::0;::::1;66494:9;;;;;;;;;;;66484:4;66489:1;66484:7;;;;;;;;:::i;:::-;;;;;;;:19;;;;;;;;;::::0;::::1;66518:15;;;;;;;;;;;:69;;;66588:11;66600:1;66602:4;66607:2;66610:15;66518:108;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;66376:262;66359:279;66237:408;65346:5:::0;65337:6;;:14;;;;;;;;;;;;;;;;;;66167:478;;:::o;23674:151::-;23732:13;23765:52;23793:4;23777:22;;21549:2;23765:52;;:11;:52::i;:::-;23758:59;;23674:151;;;:::o;23070:447::-;23145:13;23171:19;23216:1;23207:6;23203:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;23193:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23171:47;;23229:15;:6;23236:1;23229:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;23255;:6;23262:1;23255:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;23286:9;23311:1;23302:6;23298:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;23286:26;;23281:131;23318:1;23314;:5;23281:131;;;23353:8;23370:3;23362:5;:11;23353:21;;;;;;;:::i;:::-;;;;;23341:6;23348:1;23341:9;;;;;;;;:::i;:::-;;;;;:33;;;;;;;;;;;23399:1;23389:11;;;;;23321:3;;;;:::i;:::-;;;23281:131;;;;23439:1;23430:5;:10;23422:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;23502:6;23488:21;;;23070:447;;;;:::o;61920:91::-;;;;:::o;62615:90::-;;;;:::o;88:117:1:-;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:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:126::-;2897:7;2937:42;2930:5;2926:54;2915:65;;2860:126;;;:::o;2992:96::-;3029:7;3058:24;3076:5;3058:24;:::i;:::-;3047:35;;2992:96;;;:::o;3094:122::-;3167:24;3185:5;3167:24;:::i;:::-;3160:5;3157:35;3147:63;;3206:1;3203;3196:12;3147:63;3094:122;:::o;3222:139::-;3268:5;3306:6;3293:20;3284:29;;3322:33;3349:5;3322:33;:::i;:::-;3222:139;;;;:::o;3367:77::-;3404:7;3433:5;3422:16;;3367:77;;;:::o;3450:122::-;3523:24;3541:5;3523:24;:::i;:::-;3516:5;3513:35;3503:63;;3562:1;3559;3552:12;3503:63;3450:122;:::o;3578:139::-;3624:5;3662:6;3649:20;3640:29;;3678:33;3705:5;3678:33;:::i;:::-;3578:139;;;;:::o;3723:474::-;3791:6;3799;3848:2;3836:9;3827:7;3823:23;3819:32;3816:119;;;3854:79;;:::i;:::-;3816:119;3974:1;3999:53;4044:7;4035:6;4024:9;4020:22;3999:53;:::i;:::-;3989:63;;3945:117;4101:2;4127:53;4172:7;4163:6;4152:9;4148:22;4127:53;:::i;:::-;4117:63;;4072:118;3723:474;;;;;:::o;4203:118::-;4290:24;4308:5;4290:24;:::i;:::-;4285:3;4278:37;4203:118;;:::o;4327:222::-;4420:4;4458:2;4447:9;4443:18;4435:26;;4471:71;4539:1;4528:9;4524:17;4515:6;4471:71;:::i;:::-;4327:222;;;;:::o;4555:329::-;4614:6;4663:2;4651:9;4642:7;4638:23;4634:32;4631:119;;;4669:79;;:::i;:::-;4631:119;4789:1;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4760:117;4555:329;;;;:::o;4890:619::-;4967:6;4975;4983;5032:2;5020:9;5011:7;5007:23;5003:32;5000:119;;;5038:79;;:::i;:::-;5000:119;5158:1;5183:53;5228:7;5219:6;5208:9;5204:22;5183:53;:::i;:::-;5173:63;;5129:117;5285:2;5311:53;5356:7;5347:6;5336:9;5332:22;5311:53;:::i;:::-;5301:63;;5256:118;5413:2;5439:53;5484:7;5475:6;5464:9;5460:22;5439:53;:::i;:::-;5429:63;;5384:118;4890:619;;;;;:::o;5515:77::-;5552:7;5581:5;5570:16;;5515:77;;;:::o;5598:122::-;5671:24;5689:5;5671:24;:::i;:::-;5664:5;5661:35;5651:63;;5710:1;5707;5700:12;5651:63;5598:122;:::o;5726:139::-;5772:5;5810:6;5797:20;5788:29;;5826:33;5853:5;5826:33;:::i;:::-;5726:139;;;;:::o;5871:329::-;5930:6;5979:2;5967:9;5958:7;5954:23;5950:32;5947:119;;;5985:79;;:::i;:::-;5947:119;6105:1;6130:53;6175:7;6166:6;6155:9;6151:22;6130:53;:::i;:::-;6120:63;;6076:117;5871:329;;;;:::o;6206:118::-;6293:24;6311:5;6293:24;:::i;:::-;6288:3;6281:37;6206:118;;:::o;6330:222::-;6423:4;6461:2;6450:9;6446:18;6438:26;;6474:71;6542:1;6531:9;6527:17;6518:6;6474:71;:::i;:::-;6330:222;;;;:::o;6558:474::-;6626:6;6634;6683:2;6671:9;6662:7;6658:23;6654:32;6651:119;;;6689:79;;:::i;:::-;6651:119;6809:1;6834:53;6879:7;6870:6;6859:9;6855:22;6834:53;:::i;:::-;6824:63;;6780:117;6936:2;6962:53;7007:7;6998:6;6987:9;6983:22;6962:53;:::i;:::-;6952:63;;6907:118;6558:474;;;;;:::o;7038:86::-;7073:7;7113:4;7106:5;7102:16;7091:27;;7038:86;;;:::o;7130:112::-;7213:22;7229:5;7213:22;:::i;:::-;7208:3;7201:35;7130:112;;:::o;7248:214::-;7337:4;7375:2;7364:9;7360:18;7352:26;;7388:67;7452:1;7441:9;7437:17;7428:6;7388:67;:::i;:::-;7248:214;;;;:::o;7468:118::-;7555:24;7573:5;7555:24;:::i;:::-;7550:3;7543:37;7468:118;;:::o;7592:222::-;7685:4;7723:2;7712:9;7708:18;7700:26;;7736:71;7804:1;7793:9;7789:17;7780:6;7736:71;:::i;:::-;7592:222;;;;:::o;7820:329::-;7879:6;7928:2;7916:9;7907:7;7903:23;7899:32;7896:119;;;7934:79;;:::i;:::-;7896:119;8054:1;8079:53;8124:7;8115:6;8104:9;8100:22;8079:53;:::i;:::-;8069:63;;8025:117;7820:329;;;;:::o;8155:474::-;8223:6;8231;8280:2;8268:9;8259:7;8255:23;8251:32;8248:119;;;8286:79;;:::i;:::-;8248:119;8406:1;8431:53;8476:7;8467:6;8456:9;8452:22;8431:53;:::i;:::-;8421:63;;8377:117;8533:2;8559:53;8604:7;8595:6;8584:9;8580:22;8559:53;:::i;:::-;8549:63;;8504:118;8155:474;;;;;:::o;8635:117::-;8744:1;8741;8734:12;8758:117;8867:1;8864;8857:12;8881:117;8990:1;8987;8980:12;9021:568;9094:8;9104:6;9154:3;9147:4;9139:6;9135:17;9131:27;9121:122;;9162:79;;:::i;:::-;9121:122;9275:6;9262:20;9252:30;;9305:18;9297:6;9294:30;9291:117;;;9327:79;;:::i;:::-;9291:117;9441:4;9433:6;9429:17;9417:29;;9495:3;9487:4;9479:6;9475:17;9465:8;9461:32;9458:41;9455:128;;;9502:79;;:::i;:::-;9455:128;9021:568;;;;;:::o;9612:::-;9685:8;9695:6;9745:3;9738:4;9730:6;9726:17;9722:27;9712:122;;9753:79;;:::i;:::-;9712:122;9866:6;9853:20;9843:30;;9896:18;9888:6;9885:30;9882:117;;;9918:79;;:::i;:::-;9882:117;10032:4;10024:6;10020:17;10008:29;;10086:3;10078:4;10070:6;10066:17;10056:8;10052:32;10049:41;10046:128;;;10093:79;;:::i;:::-;10046:128;9612:568;;;;;:::o;10186:934::-;10308:6;10316;10324;10332;10381:2;10369:9;10360:7;10356:23;10352:32;10349:119;;;10387:79;;:::i;:::-;10349:119;10535:1;10524:9;10520:17;10507:31;10565:18;10557:6;10554:30;10551:117;;;10587:79;;:::i;:::-;10551:117;10700:80;10772:7;10763:6;10752:9;10748:22;10700:80;:::i;:::-;10682:98;;;;10478:312;10857:2;10846:9;10842:18;10829:32;10888:18;10880:6;10877:30;10874:117;;;10910:79;;:::i;:::-;10874:117;11023:80;11095:7;11086:6;11075:9;11071:22;11023:80;:::i;:::-;11005:98;;;;10800:313;10186:934;;;;;;;:::o;11126:180::-;11174:77;11171:1;11164:88;11271:4;11268:1;11261:15;11295:4;11292:1;11285:15;11312:320;11356:6;11393:1;11387:4;11383:12;11373:22;;11440:1;11434:4;11430:12;11461:18;11451:81;;11517:4;11509:6;11505:17;11495:27;;11451:81;11579:2;11571:6;11568:14;11548:18;11545:38;11542:84;;11598:18;;:::i;:::-;11542:84;11363:269;11312:320;;;:::o;11638:234::-;11778:34;11774:1;11766:6;11762:14;11755:58;11847:17;11842:2;11834:6;11830:15;11823:42;11638:234;:::o;11878:366::-;12020:3;12041:67;12105:2;12100:3;12041:67;:::i;:::-;12034:74;;12117:93;12206:3;12117:93;:::i;:::-;12235:2;12230:3;12226:12;12219:19;;11878:366;;;:::o;12250:419::-;12416:4;12454:2;12443:9;12439:18;12431:26;;12503:9;12497:4;12493:20;12489:1;12478:9;12474:17;12467:47;12531:131;12657:4;12531:131;:::i;:::-;12523:139;;12250:419;;;:::o;12675:180::-;12723:77;12720:1;12713:88;12820:4;12817:1;12810:15;12844:4;12841:1;12834:15;12861:191;12901:3;12920:20;12938:1;12920:20;:::i;:::-;12915:25;;12954:20;12972:1;12954:20;:::i;:::-;12949:25;;12997:1;12994;12990:9;12983:16;;13018:3;13015:1;13012:10;13009:36;;;13025:18;;:::i;:::-;13009:36;12861:191;;;;:::o;13058:442::-;13207:4;13245:2;13234:9;13230:18;13222:26;;13258:71;13326:1;13315:9;13311:17;13302:6;13258:71;:::i;:::-;13339:72;13407:2;13396:9;13392:18;13383:6;13339:72;:::i;:::-;13421;13489:2;13478:9;13474:18;13465:6;13421:72;:::i;:::-;13058:442;;;;;;:::o;13506:116::-;13576:21;13591:5;13576:21;:::i;:::-;13569:5;13566:32;13556:60;;13612:1;13609;13602:12;13556:60;13506:116;:::o;13628:137::-;13682:5;13713:6;13707:13;13698:22;;13729:30;13753:5;13729:30;:::i;:::-;13628:137;;;;:::o;13771:345::-;13838:6;13887:2;13875:9;13866:7;13862:23;13858:32;13855:119;;;13893:79;;:::i;:::-;13855:119;14013:1;14038:61;14091:7;14082:6;14071:9;14067:22;14038:61;:::i;:::-;14028:71;;13984:125;13771:345;;;;:::o;14122:143::-;14179:5;14210:6;14204:13;14195:22;;14226:33;14253:5;14226:33;:::i;:::-;14122:143;;;;:::o;14271:351::-;14341:6;14390:2;14378:9;14369:7;14365:23;14361:32;14358:119;;;14396:79;;:::i;:::-;14358:119;14516:1;14541:64;14597:7;14588:6;14577:9;14573:22;14541:64;:::i;:::-;14531:74;;14487:128;14271:351;;;;:::o;14628:332::-;14749:4;14787:2;14776:9;14772:18;14764:26;;14800:71;14868:1;14857:9;14853:17;14844:6;14800:71;:::i;:::-;14881:72;14949:2;14938:9;14934:18;14925:6;14881:72;:::i;:::-;14628:332;;;;;:::o;14966:::-;15087:4;15125:2;15114:9;15110:18;15102:26;;15138:71;15206:1;15195:9;15191:17;15182:6;15138:71;:::i;:::-;15219:72;15287:2;15276:9;15272:18;15263:6;15219:72;:::i;:::-;14966:332;;;;;:::o;15304:159::-;15444:11;15440:1;15432:6;15428:14;15421:35;15304:159;:::o;15469:365::-;15611:3;15632:66;15696:1;15691:3;15632:66;:::i;:::-;15625:73;;15707:93;15796:3;15707:93;:::i;:::-;15825:2;15820:3;15816:12;15809:19;;15469:365;;;:::o;15840:419::-;16006:4;16044:2;16033:9;16029:18;16021:26;;16093:9;16087:4;16083:20;16079:1;16068:9;16064:17;16057:47;16121:131;16247:4;16121:131;:::i;:::-;16113:139;;15840:419;;;:::o;16265:180::-;16313:77;16310:1;16303:88;16410:4;16407:1;16400:15;16434:4;16431:1;16424:15;16451:233;16490:3;16513:24;16531:5;16513:24;:::i;:::-;16504:33;;16559:66;16552:5;16549:77;16546:103;;16629:18;;:::i;:::-;16546:103;16676:1;16669:5;16665:13;16658:20;;16451:233;;;:::o;16690:224::-;16830:34;16826:1;16818:6;16814:14;16807:58;16899:7;16894:2;16886:6;16882:15;16875:32;16690:224;:::o;16920:366::-;17062:3;17083:67;17147:2;17142:3;17083:67;:::i;:::-;17076:74;;17159:93;17248:3;17159:93;:::i;:::-;17277:2;17272:3;17268:12;17261:19;;16920:366;;;:::o;17292:419::-;17458:4;17496:2;17485:9;17481:18;17473:26;;17545:9;17539:4;17535:20;17531:1;17520:9;17516:17;17509:47;17573:131;17699:4;17573:131;:::i;:::-;17565:139;;17292:419;;;:::o;17717:143::-;17774:5;17805:6;17799:13;17790:22;;17821:33;17848:5;17821:33;:::i;:::-;17717:143;;;;:::o;17866:351::-;17936:6;17985:2;17973:9;17964:7;17960:23;17956:32;17953:119;;;17991:79;;:::i;:::-;17953:119;18111:1;18136:64;18192:7;18183:6;18172:9;18168:22;18136:64;:::i;:::-;18126:74;;18082:128;17866:351;;;;:::o;18223:225::-;18363:34;18359:1;18351:6;18347:14;18340:58;18432:8;18427:2;18419:6;18415:15;18408:33;18223:225;:::o;18454:366::-;18596:3;18617:67;18681:2;18676:3;18617:67;:::i;:::-;18610:74;;18693:93;18782:3;18693:93;:::i;:::-;18811:2;18806:3;18802:12;18795:19;;18454:366;;;:::o;18826:419::-;18992:4;19030:2;19019:9;19015:18;19007:26;;19079:9;19073:4;19069:20;19065:1;19054:9;19050:17;19043:47;19107:131;19233:4;19107:131;:::i;:::-;19099:139;;18826:419;;;:::o;19251:223::-;19391:34;19387:1;19379:6;19375:14;19368:58;19460:6;19455:2;19447:6;19443:15;19436:31;19251:223;:::o;19480:366::-;19622:3;19643:67;19707:2;19702:3;19643:67;:::i;:::-;19636:74;;19719:93;19808:3;19719:93;:::i;:::-;19837:2;19832:3;19828:12;19821:19;;19480:366;;;:::o;19852:419::-;20018:4;20056:2;20045:9;20041:18;20033:26;;20105:9;20099:4;20095:20;20091:1;20080:9;20076:17;20069:47;20133:131;20259:4;20133:131;:::i;:::-;20125:139;;19852:419;;;:::o;20277:221::-;20417:34;20413:1;20405:6;20401:14;20394:58;20486:4;20481:2;20473:6;20469:15;20462:29;20277:221;:::o;20504:366::-;20646:3;20667:67;20731:2;20726:3;20667:67;:::i;:::-;20660:74;;20743:93;20832:3;20743:93;:::i;:::-;20861:2;20856:3;20852:12;20845:19;;20504:366;;;:::o;20876:419::-;21042:4;21080:2;21069:9;21065:18;21057:26;;21129:9;21123:4;21119:20;21115:1;21104:9;21100:17;21093:47;21157:131;21283:4;21157:131;:::i;:::-;21149:139;;20876:419;;;:::o;21301:179::-;21441:31;21437:1;21429:6;21425:14;21418:55;21301:179;:::o;21486:366::-;21628:3;21649:67;21713:2;21708:3;21649:67;:::i;:::-;21642:74;;21725:93;21814:3;21725:93;:::i;:::-;21843:2;21838:3;21834:12;21827:19;;21486:366;;;:::o;21858:419::-;22024:4;22062:2;22051:9;22047:18;22039:26;;22111:9;22105:4;22101:20;22097:1;22086:9;22082:17;22075:47;22139:131;22265:4;22139:131;:::i;:::-;22131:139;;21858:419;;;:::o;22283:166::-;22423:18;22419:1;22411:6;22407:14;22400:42;22283:166;:::o;22455:366::-;22597:3;22618:67;22682:2;22677:3;22618:67;:::i;:::-;22611:74;;22694:93;22783:3;22694:93;:::i;:::-;22812:2;22807:3;22803:12;22796:19;;22455:366;;;:::o;22827:419::-;22993:4;23031:2;23020:9;23016:18;23008:26;;23080:9;23074:4;23070:20;23066:1;23055:9;23051:17;23044:47;23108:131;23234:4;23108:131;:::i;:::-;23100:139;;22827:419;;;:::o;23252:159::-;23392:11;23388:1;23380:6;23376:14;23369:35;23252:159;:::o;23417:365::-;23559:3;23580:66;23644:1;23639:3;23580:66;:::i;:::-;23573:73;;23655:93;23744:3;23655:93;:::i;:::-;23773:2;23768:3;23764:12;23757:19;;23417:365;;;:::o;23788:419::-;23954:4;23992:2;23981:9;23977:18;23969:26;;24041:9;24035:4;24031:20;24027:1;24016:9;24012:17;24005:47;24069:131;24195:4;24069:131;:::i;:::-;24061:139;;23788:419;;;:::o;24213:180::-;24261:77;24258:1;24251:88;24358:4;24355:1;24348:15;24382:4;24379:1;24372:15;24399:85;24444:7;24473:5;24462:16;;24399:85;;;:::o;24490:60::-;24518:3;24539:5;24532:12;;24490:60;;;:::o;24556:158::-;24614:9;24647:61;24665:42;24674:32;24700:5;24674:32;:::i;:::-;24665:42;:::i;:::-;24647:61;:::i;:::-;24634:74;;24556:158;;;:::o;24720:147::-;24815:45;24854:5;24815:45;:::i;:::-;24810:3;24803:58;24720:147;;:::o;24873:114::-;24940:6;24974:5;24968:12;24958:22;;24873:114;;;:::o;24993:184::-;25092:11;25126:6;25121:3;25114:19;25166:4;25161:3;25157:14;25142:29;;24993:184;;;;:::o;25183:132::-;25250:4;25273:3;25265:11;;25303:4;25298:3;25294:14;25286:22;;25183:132;;;:::o;25321:108::-;25398:24;25416:5;25398:24;:::i;:::-;25393:3;25386:37;25321:108;;:::o;25435:179::-;25504:10;25525:46;25567:3;25559:6;25525:46;:::i;:::-;25603:4;25598:3;25594:14;25580:28;;25435:179;;;;:::o;25620:113::-;25690:4;25722;25717:3;25713:14;25705:22;;25620:113;;;:::o;25769:732::-;25888:3;25917:54;25965:5;25917:54;:::i;:::-;25987:86;26066:6;26061:3;25987:86;:::i;:::-;25980:93;;26097:56;26147:5;26097:56;:::i;:::-;26176:7;26207:1;26192:284;26217:6;26214:1;26211:13;26192:284;;;26293:6;26287:13;26320:63;26379:3;26364:13;26320:63;:::i;:::-;26313:70;;26406:60;26459:6;26406:60;:::i;:::-;26396:70;;26252:224;26239:1;26236;26232:9;26227:14;;26192:284;;;26196:14;26492:3;26485:10;;25893:608;;;25769:732;;;;:::o;26507:831::-;26770:4;26808:3;26797:9;26793:19;26785:27;;26822:71;26890:1;26879:9;26875:17;26866:6;26822:71;:::i;:::-;26903:80;26979:2;26968:9;26964:18;26955:6;26903:80;:::i;:::-;27030:9;27024:4;27020:20;27015:2;27004:9;27000:18;26993:48;27058:108;27161:4;27152:6;27058:108;:::i;:::-;27050:116;;27176:72;27244:2;27233:9;27229:18;27220:6;27176:72;:::i;:::-;27258:73;27326:3;27315:9;27311:19;27302:6;27258:73;:::i;:::-;26507:831;;;;;;;;:::o;27344:182::-;27484:34;27480:1;27472:6;27468:14;27461:58;27344:182;:::o;27532:366::-;27674:3;27695:67;27759:2;27754:3;27695:67;:::i;:::-;27688:74;;27771:93;27860:3;27771:93;:::i;:::-;27889:2;27884:3;27880:12;27873:19;;27532:366;;;:::o;27904:419::-;28070:4;28108:2;28097:9;28093:18;28085:26;;28157:9;28151:4;28147:20;28143:1;28132:9;28128:17;28121:47;28185:131;28311:4;28185:131;:::i;:::-;28177:139;;27904:419;;;:::o;28329:148::-;28431:11;28468:3;28453:18;;28329:148;;;;:::o;28483:173::-;28623:25;28619:1;28611:6;28607:14;28600:49;28483:173;:::o;28662:402::-;28822:3;28843:85;28925:2;28920:3;28843:85;:::i;:::-;28836:92;;28937:93;29026:3;28937:93;:::i;:::-;29055:2;29050:3;29046:12;29039:19;;28662:402;;;:::o;29070:390::-;29176:3;29204:39;29237:5;29204:39;:::i;:::-;29259:89;29341:6;29336:3;29259:89;:::i;:::-;29252:96;;29357:65;29415:6;29410:3;29403:4;29396:5;29392:16;29357:65;:::i;:::-;29447:6;29442:3;29438:16;29431:23;;29180:280;29070:390;;;;:::o;29466:167::-;29606:19;29602:1;29594:6;29590:14;29583:43;29466:167;:::o;29639:402::-;29799:3;29820:85;29902:2;29897:3;29820:85;:::i;:::-;29813:92;;29914:93;30003:3;29914:93;:::i;:::-;30032:2;30027:3;30023:12;30016:19;;29639:402;;;:::o;30047:967::-;30429:3;30451:148;30595:3;30451:148;:::i;:::-;30444:155;;30616:95;30707:3;30698:6;30616:95;:::i;:::-;30609:102;;30728:148;30872:3;30728:148;:::i;:::-;30721:155;;30893:95;30984:3;30975:6;30893:95;:::i;:::-;30886:102;;31005:3;30998:10;;30047:967;;;;;:::o;31020:224::-;31160:34;31156:1;31148:6;31144:14;31137:58;31229:7;31224:2;31216:6;31212:15;31205:32;31020:224;:::o;31250:366::-;31392:3;31413:67;31477:2;31472:3;31413:67;:::i;:::-;31406:74;;31489:93;31578:3;31489:93;:::i;:::-;31607:2;31602:3;31598:12;31591:19;;31250:366;;;:::o;31622:419::-;31788:4;31826:2;31815:9;31811:18;31803:26;;31875:9;31869:4;31865:20;31861:1;31850:9;31846:17;31839:47;31903:131;32029:4;31903:131;:::i;:::-;31895:139;;31622:419;;;:::o;32047:222::-;32187:34;32183:1;32175:6;32171:14;32164:58;32256:5;32251:2;32243:6;32239:15;32232:30;32047:222;:::o;32275:366::-;32417:3;32438:67;32502:2;32497:3;32438:67;:::i;:::-;32431:74;;32514:93;32603:3;32514:93;:::i;:::-;32632:2;32627:3;32623:12;32616:19;;32275:366;;;:::o;32647:419::-;32813:4;32851:2;32840:9;32836:18;32828:26;;32900:9;32894:4;32890:20;32886:1;32875:9;32871:17;32864:47;32928:131;33054:4;32928:131;:::i;:::-;32920:139;;32647:419;;;:::o;33072:225::-;33212:34;33208:1;33200:6;33196:14;33189:58;33281:8;33276:2;33268:6;33264:15;33257:33;33072:225;:::o;33303:366::-;33445:3;33466:67;33530:2;33525:3;33466:67;:::i;:::-;33459:74;;33542:93;33631:3;33542:93;:::i;:::-;33660:2;33655:3;33651:12;33644:19;;33303:366;;;:::o;33675:419::-;33841:4;33879:2;33868:9;33864:18;33856:26;;33928:9;33922:4;33918:20;33914:1;33903:9;33899:17;33892:47;33956:131;34082:4;33956:131;:::i;:::-;33948:139;;33675:419;;;:::o;34100:410::-;34140:7;34163:20;34181:1;34163:20;:::i;:::-;34158:25;;34197:20;34215:1;34197:20;:::i;:::-;34192:25;;34252:1;34249;34245:9;34274:30;34292:11;34274:30;:::i;:::-;34263:41;;34453:1;34444:7;34440:15;34437:1;34434:22;34414:1;34407:9;34387:83;34364:139;;34483:18;;:::i;:::-;34364:139;34148:362;34100:410;;;;:::o;34516:171::-;34555:3;34578:24;34596:5;34578:24;:::i;:::-;34569:33;;34624:4;34617:5;34614:15;34611:41;;34632:18;;:::i;:::-;34611:41;34679:1;34672:5;34668:13;34661:20;;34516:171;;;:::o;34693:182::-;34833:34;34829:1;34821:6;34817:14;34810:58;34693:182;:::o;34881:366::-;35023:3;35044:67;35108:2;35103:3;35044:67;:::i;:::-;35037:74;;35120:93;35209:3;35120:93;:::i;:::-;35238:2;35233:3;35229:12;35222:19;;34881:366;;;:::o;35253:419::-;35419:4;35457:2;35446:9;35442:18;35434:26;;35506:9;35500:4;35496:20;35492:1;35481:9;35477:17;35470:47;35534:131;35660:4;35534:131;:::i;:::-;35526:139;;35253:419;;;:::o
Swarm Source
ipfs://a2842f0ab57208ab11edd84da8b0c8112152fa0f68129cd79a0fe47743023844
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.