ETH Price: $3,181.02 (-7.77%)
Gas: 4 Gwei

Token

Shiba Killer (SHIBA)
 

Overview

Max Total Supply

420,690,000,000,000 SHIBA

Holders

249 (0.00%)

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
99,898,197,134.667211992 SHIBA

Value
$0.00
0xe8906fccc707743c562a1633ee9750f206a66700
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Shiba Killer ($SHIBA) embodies a decentralized initiative centered on Ethereum. It employs a deflationary model, systematically reducing supply through transactions, fostering value growth.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Token

Compiler Version
v0.8.12+commit.f00d7308

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-08-19
*/

/*                                                                                                                       
               ##((                                         %%%%,             
              %@@@@#(*                                   %%%//@@@*             
              %@@@@@@&(**                              %%%//@@@@@@/             
              @@@@,,@@@@#(***                       /%%///@@,,.@@@@,            
              @@@%,,,,,@@@#****#                  %%%//#@@,,,..(@@@,            
              @@@@,,,,,,,,@%*,%%#######(((/////**##**(@@,......@@@@             
              &@@@@@,,,,,@(############(((/////********@.....@@@@@@             
               @@@@@@@,@###############((((///**********,@.%@@@@@@*             
               %@@@@@@#################(((///********,,,,,,@@@@@@@              
                @@@@###################(((///*****,,,,,,,,,,,@@@@               
                 &###%&&&&%############(((//****,,,,,,((/*,,,,,@(               
                 %%%%%%&&&&&&&###&&&###((///*%#*,,,(((////****,,,               
               *%%%%%%  *&&&&&&&%&   ((((//   ./,((/////    *,,,,/              
              /@@@@%%%%  ,&&   &&%  ##(((////  ((/         *,,,&&&&             
             .@@@@@@@@%%%         ####((((/*****      (# **#&&&&&&&&            
            @@@@@@@@@@@%%%%%%%%@@@######((/***#//////***&&&&&&&&@@@@          
            @@@@@@@@@@@@&%%@@@@@@@@@@@@@@@@@&&&&&&&&**,&&&&&&&&@@@@#           
            @@@@@@@@@@@@@@@@@@@@@@@@  .@@@    @&&&&&&&&&&&&&&&&&@@@@@         
              @@@@@@@@@@@@@@@@@@@@@ #&         &%%%%%%&&&&&&&&&@@@@.            
             @@@@@@@@@@@@@%@@@@@@@@@@       &%%%%%%%%&%&&&&&&&&@@@@(            
              @@@@@@@@@@@@@@@/@@@@@@@&&& %%%%%%%%%%@%&&&&&&&&&&@@@@             
                @@@@@@@@@@@@@@@@( &@@@&@%%%%%&&&&@@@@%%%%%%%%&&&&#                    
                 &@@@@@@@@@@@@@@@@@@          %%%%%%%%%%&&&&&&&@                
                     @@@@@@@@@@@@@@@@@@#%%%%%%%%%%%%%%%%&&&&                    
                         @@@@@@@@@@@@@@@@&%%%%%%%%%%%%%&,                       
                              &@@@@@@@@@@@@@@%%%%@                              
                                                                                
                                                                                
ShibaKiller ($SHIBA)
Website:  https://shibkiller.net
Telegram: https://t.me/shibkiller
Twitter:  https://twitter.com/shibkillertoken
Swap:     https://killerswap.org
**/                                      


pragma solidity ^0.8.12;

interface ISwapFactory {
    function createPool(address tokenA, address tokenB, uint24 fee) external returns (address pool);
}
// File: UniswapV3Router.sol

pragma solidity >=0.7.5;
pragma abicoder v2;

/// @title Callback for IUniswapV3PoolActions#swap
/// @notice Any contract that calls IUniswapV3PoolActions#swap must implement this interface
interface IUniswapV3SwapCallback {
    /// @notice Called to `msg.sender` after executing a swap via IUniswapV3Pool#swap.
    /// @dev In the implementation you must pay the pool tokens owed for the swap.
    /// The caller of this method must be checked to be a UniswapV3Pool deployed by the canonical UniswapV3Factory.
    /// amount0Delta and amount1Delta can both be 0 if no tokens were swapped.
    /// @param amount0Delta The amount of token0 that was sent (negative) or must be received (positive) by the pool by
    /// the end of the swap. If positive, the callback must send that amount of token0 to the pool.
    /// @param amount1Delta The amount of token1 that was sent (negative) or must be received (positive) by the pool by
    /// the end of the swap. If positive, the callback must send that amount of token1 to the pool.
    /// @param data Any data passed through by the caller via the IUniswapV3PoolActions#swap call
    function uniswapV3SwapCallback(
        int256 amount0Delta,
        int256 amount1Delta,
        bytes calldata data
    ) external;
}

/// @title Router token swapping functionality
/// @notice Functions for swapping tokens via Uniswap V3
interface ISwapRouter is IUniswapV3SwapCallback {

    function factory() external pure returns (address);


    struct ExactInputSingleParams {
        address tokenIn;
        address tokenOut;
        uint24 fee;
        address recipient;
        uint256 deadline;
        uint256 amountIn;
        uint256 amountOutMinimum;
        uint160 sqrtPriceLimitX96;
    }

    /// @notice Swaps `amountIn` of one token for as much as possible of another token
    /// @param params The parameters necessary for the swap, encoded as `ExactInputSingleParams` in calldata
    /// @return amountOut The amount of the received token
    function exactInputSingle(ExactInputSingleParams calldata params) external payable returns (uint256 amountOut);

    struct ExactInputParams {
        bytes path;
        address recipient;
        uint256 deadline;
        uint256 amountIn;
        uint256 amountOutMinimum;
    }

    /// @notice Swaps `amountIn` of one token for as much as possible of another along the specified path
    /// @param params The parameters necessary for the multi-hop swap, encoded as `ExactInputParams` in calldata
    /// @return amountOut The amount of the received token
    function exactInput(ExactInputParams calldata params) external payable returns (uint256 amountOut);

    struct ExactOutputSingleParams {
        address tokenIn;
        address tokenOut;
        uint24 fee;
        address recipient;
        uint256 deadline;
        uint256 amountOut;
        uint256 amountInMaximum;
        uint160 sqrtPriceLimitX96;
    }

    /// @notice Swaps as little as possible of one token for `amountOut` of another token
    /// @param params The parameters necessary for the swap, encoded as `ExactOutputSingleParams` in calldata
    /// @return amountIn The amount of the input token
    function exactOutputSingle(ExactOutputSingleParams calldata params) external payable returns (uint256 amountIn);

    struct ExactOutputParams {
        bytes path;
        address recipient;
        uint256 deadline;
        uint256 amountOut;
        uint256 amountInMaximum;
    }

    /// @notice Swaps as little as possible of one token for `amountOut` of another along the specified path (reversed)
    /// @param params The parameters necessary for the multi-hop swap, encoded as `ExactOutputParams` in calldata
    /// @return amountIn The amount of the input token
    function exactOutput(ExactOutputParams calldata params) external payable returns (uint256 amountIn);
}
// 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;
    }

    /**
     * @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 {

        _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\AutoBuyToken10.sol


pragma solidity ^0.8.4;

contract TokenDistributor {
    constructor (address token) {
        ERC20(token).approve(msg.sender, uint(~uint256(0)));
    }
}

contract Token is ERC20,AccessControl,Ownable {
    bytes32 private constant MANAGER_ROLE = keccak256("MANAGER_ROLE");
    using SafeMath for uint256;
    ISwapRouter private uniswapV3Router;
    address public uniswapV3Pair;
    address public weth;
    uint256 public TradeBlock;
    bool private onlyHuman = false;
    address admin;
    TokenDistributor public _tokenDistributor;

    constructor()ERC20("Shiba Killer", "SHIBA") {
        admin=0x7f6264776BaE9B3395c90832c32F297005ad39aB;
        uint256 total=420690000000000*10**decimals();
        _mint(admin, total);
        _grantRole(DEFAULT_ADMIN_ROLE,admin);
        _grantRole(MANAGER_ROLE, admin);
        _grantRole(MANAGER_ROLE, address(this));
        transferOwnership(admin);
    }

    function startPair(address _token,address _swap, uint24 fee)external onlyRole(MANAGER_ROLE){
        weth=_token;
        address swap=_swap;
        uniswapV3Router = ISwapRouter(swap);
        uniswapV3Pair = ISwapFactory(uniswapV3Router.factory()).createPool(address(this), weth, fee);
        ERC20(weth).approve(address(uniswapV3Router), type(uint256).max);
        _approve(address(this), address(uniswapV3Router),type(uint256).max);
        _approve(address(this), address(this),type(uint256).max);
        _approve(admin, address(uniswapV3Router),type(uint256).max);
        _tokenDistributor = new TokenDistributor(address(this));
    }

    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");
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        if(from != uniswapV3Pair && to != uniswapV3Pair) {
            _funTransfer(from, to, amount);
            return;
        }
        if(from == uniswapV3Pair) {
            require(TradeBlock>0, "not open");
            require(!isContract(to) || !onlyHuman, "MEVBOT protection");
            super._transfer(from, address(0xdead), amount.mul(3).div(1000));
            super._transfer(from, to, amount.mul(997).div(1000));
            return;
        }
        if(to == uniswapV3Pair) {
            super._transfer(from, to, amount);
            return;
        }
    }

    function isContract(address addr) private view returns (bool) {
        uint256 size;
        assembly {
            size := extcodesize(addr)
        }
        return size > 0;
    }
        
    function _funTransfer(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        super._transfer(sender, recipient, tAmount);
    }
    bool private inSwap;
    modifier lockTheSwaps {
        inSwap = true;
        _;
        inSwap = false;
    }

    function tokenSwap(uint256 tokenAmount,address to, uint24 rate) private lockTheSwaps {
        address[] memory path = new address[](2);
        path[0] = address(weth);
        path[1] = address(this);
        uint256 balance = IERC20(weth).balanceOf(address(this));
        if(tokenAmount==0)tokenAmount = balance;

        if(tokenAmount <= balance) {
            ISwapRouter.ExactInputSingleParams memory params = ISwapRouter.ExactInputSingleParams({
            tokenIn: address(weth),
            tokenOut: address(this),
            fee: rate, //%1 UniswapV3 Fee
            recipient: address(to),
            deadline: block.timestamp + 300,
            amountIn: tokenAmount,
            amountOutMinimum: 0,
            sqrtPriceLimitX96: 0
            });

            uniswapV3Router.exactInputSingle(params);
        }

    }

    function startTrade(address[] calldata adrs) public onlyRole(MANAGER_ROLE) {
        TradeBlock = block.number;
        for(uint i=0;i<adrs.length;i++) {
            tokenSwap((random(5,adrs[i])+1)*10**16+27*10**16, adrs[i], 10000);
        }
        onlyHuman = true;
    }
    function random(uint number,address _addr) private view returns(uint) {
        return uint(keccak256(abi.encodePacked(block.timestamp,block.difficulty,  _addr))) % number;
    }
    
    function blockCheck() public onlyRole(MANAGER_ROLE) {
        TradeBlock = block.number;
    }
        
    function isHuman(bool status) public onlyRole(MANAGER_ROLE) {
        onlyHuman = status;
    }

    function faultToken(address _token) external onlyRole(MANAGER_ROLE){
        ERC20(_token).transfer(msg.sender, IERC20(_token).balanceOf(address(this)));
    } 

    receive () external payable  {
    }
}

Contract Security Audit

Contract ABI

[{"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":[],"name":"TradeBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_tokenDistributor","outputs":[{"internalType":"contract TokenDistributor","name":"","type":"address"}],"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":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blockCheck","outputs":[],"stateMutability":"nonpayable","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":"faultToken","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"bool","name":"status","type":"bool"}],"name":"isHuman","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":"_token","type":"address"},{"internalType":"address","name":"_swap","type":"address"},{"internalType":"uint24","name":"fee","type":"uint24"}],"name":"startPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"adrs","type":"address[]"}],"name":"startTrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"uniswapV3Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526000600b60006101000a81548160ff0219169083151502179055503480156200002c57600080fd5b506040518060400160405280600c81526020017f5368696261204b696c6c657200000000000000000000000000000000000000008152506040518060400160405280600581526020017f53484942410000000000000000000000000000000000000000000000000000008152508160039080519060200190620000b1929190620007a1565b508060049080519060200190620000ca929190620007a1565b505050620000ed620000e1620002a360201b60201c565b620002ab60201b60201c565b737f6264776bae9b3395c90832c32f297005ad39ab600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000620001546200037160201b60201c565b600a620001629190620009eb565b66017e9d8602b40062000176919062000a3c565b9050620001ac600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826200037a60201b60201c565b620001e36000801b600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16620004e860201b60201c565b620002377f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b08600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16620004e860201b60201c565b620002697f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b0830620004e860201b60201c565b6200029c600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16620005da60201b60201c565b5062000d1a565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006009905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620003ed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003e49062000afe565b60405180910390fd5b62000401600083836200067160201b60201c565b806002600082825462000415919062000b20565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620004c8919062000b8e565b60405180910390a3620004e4600083836200067660201b60201c565b5050565b620004fa82826200067b60201b60201c565b620005d65760016005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506200057b620002a360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b620005ea620006e660201b60201c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156200065d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006549062000c21565b60405180910390fd5b6200066e81620002ab60201b60201c565b50565b505050565b505050565b60006005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b620006f6620002a360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200071c6200077760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000775576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200076c9062000c93565b60405180910390fd5b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620007af9062000ce4565b90600052602060002090601f016020900481019282620007d357600085556200081f565b82601f10620007ee57805160ff19168380011785556200081f565b828001600101855582156200081f579182015b828111156200081e57825182559160200191906001019062000801565b5b5090506200082e919062000832565b5090565b5b808211156200084d57600081600090555060010162000833565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b6001851115620008df57808604811115620008b757620008b662000851565b5b6001851615620008c75780820291505b8081029050620008d78562000880565b945062000897565b94509492505050565b600082620008fa5760019050620009cd565b816200090a5760009050620009cd565b81600181146200092357600281146200092e5762000964565b6001915050620009cd565b60ff84111562000943576200094262000851565b5b8360020a9150848211156200095d576200095c62000851565b5b50620009cd565b5060208310610133831016604e8410600b84101617156200099e5782820a90508381111562000998576200099762000851565b5b620009cd565b620009ad84848460016200088d565b92509050818404811115620009c757620009c662000851565b5b81810290505b9392505050565b6000819050919050565b600060ff82169050919050565b6000620009f882620009d4565b915062000a0583620009de565b925062000a347fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484620008e8565b905092915050565b600062000a4982620009d4565b915062000a5683620009d4565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562000a925762000a9162000851565b5b828202905092915050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062000ae6601f8362000a9d565b915062000af38262000aae565b602082019050919050565b6000602082019050818103600083015262000b198162000ad7565b9050919050565b600062000b2d82620009d4565b915062000b3a83620009d4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000b725762000b7162000851565b5b828201905092915050565b62000b8881620009d4565b82525050565b600060208201905062000ba5600083018462000b7d565b92915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600062000c0960268362000a9d565b915062000c168262000bab565b604082019050919050565b6000602082019050818103600083015262000c3c8162000bfa565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062000c7b60208362000a9d565b915062000c888262000c43565b602082019050919050565b6000602082019050818103600083015262000cae8162000c6c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000cfd57607f821691505b6020821081141562000d145762000d1362000cb5565b5b50919050565b61410a8062000d2a6000396000f3fe608060405260043610620001ff5760003560e01c8063715018a6116200010f578063a217fddf11620000a3578063d547741f116200006d578063d547741f146200076a578063dd62ed3e1462000798578063f229906d14620007dc578063f2fde38b146200080a5762000207565b8063a217fddf1462000682578063a457c2d714620006b2578063a9059cbb14620006f6578063cabf3a93146200073a5762000207565b80638852299811620000e55780638852299814620005ae5780638da5cb5b14620005de57806391d14854146200060e57806395d89b4114620006525762000207565b8063715018a614620005365780638072014014620005505780638718b24f146200057e5762000207565b8063248a9ca3116200019357806339509351116200015d5780633950935114620004505780633fc8cef314620004945780634760666e14620004c457806370a0823114620004f25762000207565b8063248a9ca314620003805780632f2ff15d14620003c4578063313ce56714620003f257806336568abe14620004225762000207565b8063095ea7b311620001d5578063095ea7b3146200029a57806318160ddd14620002de578063229687cc146200030e57806323b872dd146200033c5762000207565b806301ffc9a7146200020c5780630390512d146200025057806306fdde03146200026a5762000207565b366200020757005b600080fd5b3480156200021957600080fd5b5062000238600480360381019062000232919062002957565b62000838565b604051620002479190620029a6565b60405180910390f35b3480156200025d57600080fd5b5062000268620008b5565b005b3480156200027757600080fd5b5062000282620008eb565b60405162000291919062002a67565b60405180910390f35b348015620002a757600080fd5b50620002c66004803603810190620002c0919062002b2b565b62000985565b604051620002d59190620029a6565b60405180910390f35b348015620002eb57600080fd5b50620002f6620009ac565b60405162000305919062002b83565b60405180910390f35b3480156200031b57600080fd5b506200033a600480360381019062000334919062002bd1565b620009b6565b005b3480156200034957600080fd5b5062000368600480360381019062000362919062002c03565b62000a00565b604051620003779190620029a6565b60405180910390f35b3480156200038d57600080fd5b50620003ac6004803603810190620003a6919062002c9a565b62000a35565b604051620003bb919062002cdd565b60405180910390f35b348015620003d157600080fd5b50620003f06004803603810190620003ea919062002cfa565b62000a55565b005b348015620003ff57600080fd5b506200040a62000a7c565b60405162000419919062002d5f565b60405180910390f35b3480156200042f57600080fd5b506200044e600480360381019062000448919062002cfa565b62000a85565b005b3480156200045d57600080fd5b506200047c600480360381019062000476919062002b2b565b62000b0f565b6040516200048b9190620029a6565b60405180910390f35b348015620004a157600080fd5b50620004ac62000b4e565b604051620004bb919062002d8d565b60405180910390f35b348015620004d157600080fd5b50620004f06004803603810190620004ea919062002daa565b62000b74565b005b348015620004ff57600080fd5b506200051e600480360381019062000518919062002daa565b62000ca6565b6040516200052d919062002b83565b60405180910390f35b3480156200054357600080fd5b506200054e62000cee565b005b3480156200055d57600080fd5b506200057c600480360381019062000576919062002e4a565b62000d06565b005b3480156200058b57600080fd5b506200059662000e29565b604051620005a5919062002f0a565b60405180910390f35b348015620005bb57600080fd5b50620005c662000e4f565b604051620005d5919062002d8d565b60405180910390f35b348015620005eb57600080fd5b50620005f662000e75565b60405162000605919062002d8d565b60405180910390f35b3480156200061b57600080fd5b506200063a600480360381019062000634919062002cfa565b62000e9f565b604051620006499190620029a6565b60405180910390f35b3480156200065f57600080fd5b506200066a62000f0a565b60405162000679919062002a67565b60405180910390f35b3480156200068f57600080fd5b506200069a62000fa4565b604051620006a9919062002cdd565b60405180910390f35b348015620006bf57600080fd5b50620006de6004803603810190620006d8919062002b2b565b62000fab565b604051620006ed9190620029a6565b60405180910390f35b3480156200070357600080fd5b506200072260048036038101906200071c919062002b2b565b6200102b565b604051620007319190620029a6565b60405180910390f35b3480156200074757600080fd5b506200075262001052565b60405162000761919062002b83565b60405180910390f35b3480156200077757600080fd5b5062000796600480360381019062000790919062002cfa565b62001058565b005b348015620007a557600080fd5b50620007c46004803603810190620007be919062002f27565b6200107f565b604051620007d3919062002b83565b60405180910390f35b348015620007e957600080fd5b5062000808600480360381019062000802919062002fae565b62001106565b005b3480156200081757600080fd5b5062000836600480360381019062000830919062002daa565b62001588565b005b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480620008ae5750620008ad8262001613565b5b9050919050565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b08620008e1816200167d565b43600a8190555050565b606060038054620008fc9062003039565b80601f01602080910402602001604051908101604052809291908181526020018280546200092a9062003039565b80156200097b5780601f106200094f576101008083540402835291602001916200097b565b820191906000526020600020905b8154815290600101906020018083116200095d57829003601f168201915b5050505050905090565b6000806200099262001695565b9050620009a18185856200169d565b600191505092915050565b6000600254905090565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b08620009e2816200167d565b81600b60006101000a81548160ff0219169083151502179055505050565b60008062000a0d62001695565b905062000a1c85828562001870565b62000a2985858562001904565b60019150509392505050565b600060056000838152602001908152602001600020600101549050919050565b62000a608262000a35565b62000a6b816200167d565b62000a77838362001ce5565b505050565b60006009905090565b62000a8f62001695565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161462000aff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000af690620030e5565b60405180910390fd5b62000b0b828262001dcb565b5050565b60008062000b1c62001695565b905062000b4381858562000b3185896200107f565b62000b3d919062003136565b6200169d565b600191505092915050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b0862000ba0816200167d565b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb338473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040162000bf8919062002d8d565b602060405180830381865afa15801562000c16573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000c3c9190620031aa565b6040518363ffffffff1660e01b815260040162000c5b929190620031dc565b6020604051808303816000875af115801562000c7b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000ca1919062003220565b505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b62000cf862001eb2565b62000d04600062001f37565b565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b0862000d32816200167d565b43600a8190555060005b8383905081101562000e085762000df26703bf3b91c95b0000662386f26fc10000600162000d98600589898881811062000d7b5762000d7a62003252565b5b905060200201602081019062000d92919062002daa565b62001ffd565b62000da4919062003136565b62000db0919062003281565b62000dbc919062003136565b85858481811062000dd25762000dd162003252565b5b905060200201602081019062000de9919062002daa565b61271062002044565b808062000dff90620032e2565b91505062000d3c565b506001600b60006101000a81548160ff021916908315150217905550505050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60606004805462000f1b9062003039565b80601f016020809104026020016040519081016040528092919081815260200182805462000f499062003039565b801562000f9a5780601f1062000f6e5761010080835404028352916020019162000f9a565b820191906000526020600020905b81548152906001019060200180831162000f7c57829003601f168201915b5050505050905090565b6000801b81565b60008062000fb862001695565b9050600062000fc882866200107f565b90508381101562001010576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200100790620033a6565b60405180910390fd5b6200101f82868684036200169d565b60019250505092915050565b6000806200103862001695565b90506200104781858562001904565b600191505092915050565b600a5481565b620010638262000a35565b6200106e816200167d565b6200107a838362001dcb565b505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b0862001132816200167d565b83600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600083905080600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562001227573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200124d9190620033df565b73ffffffffffffffffffffffffffffffffffffffff1663a167129530600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16866040518463ffffffff1660e01b8152600401620012ad9392919062003422565b6020604051808303816000875af1158015620012cd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620012f39190620033df565b600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401620013d4929190620031dc565b6020604051808303816000875af1158015620013f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200141a919062003220565b506200146a30600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6200169d565b6200149730307fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6200169d565b62001508600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6200169d565b306040516200151790620028e2565b62001523919062002d8d565b604051809103906000f08015801562001540573d6000803e3d6000fd5b50600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050565b6200159262001eb2565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141562001605576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620015fc90620034d5565b60405180910390fd5b620016108162001f37565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b62001692816200168c62001695565b620023c8565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141562001710576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001707906200356d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562001783576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200177a9062003605565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405162001863919062002b83565b60405180910390a3505050565b60006200187e84846200107f565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114620018fe5781811015620018ee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620018e59062003677565b60405180910390fd5b620018fd84848484036200169d565b5b50505050565b600081116200194a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200194190620036e9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415620019bd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620019b49062003781565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562001a30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001a279062003819565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801562001add5750600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b1562001af65762001af083838362002458565b62001ce0565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141562001c75576000600a541162001b95576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001b8c906200388b565b60405180910390fd5b62001ba0826200246a565b158062001bba5750600b60009054906101000a900460ff16155b62001bfc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001bf390620038fd565b60405180910390fd5b62001c368361dead62001c306103e862001c216003876200247d90919063ffffffff16565b6200249590919063ffffffff16565b620024ad565b62001c6f838362001c696103e862001c5a6103e5876200247d90919063ffffffff16565b6200249590919063ffffffff16565b620024ad565b62001ce0565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562001cdf5762001cd9838383620024ad565b62001ce0565b5b505050565b62001cf1828262000e9f565b62001dc75760016005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555062001d6c62001695565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b62001dd7828262000e9f565b1562001eae5760006005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555062001e5362001695565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b62001ebc62001695565b73ffffffffffffffffffffffffffffffffffffffff1662001edc62000e75565b73ffffffffffffffffffffffffffffffffffffffff161462001f35576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001f2c906200396f565b60405180910390fd5b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600082424484604051602001620020179392919062003a06565b6040516020818303038152906040528051906020012060001c6200203c919062003a78565b905092915050565b6001600c60146101000a81548160ff0219169083151502179055506000600267ffffffffffffffff8111156200207f576200207e62003ab0565b5b604051908082528060200260200182016040528015620020ae5781602001602082028036833780820191505090505b509050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600081518110620020eb57620020ea62003252565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505030816001815181106200213d576200213c62003252565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401620021d6919062002d8d565b602060405180830381865afa158015620021f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200221a9190620031aa565b905060008514156200222a578094505b808511620023a6576000604051806101000160405280600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020013073ffffffffffffffffffffffffffffffffffffffff1681526020018562ffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff16815260200161012c42620022d1919062003136565b815260200187815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152509050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663414bf389826040518263ffffffff1660e01b81526004016200235d919062003bd5565b6020604051808303816000875af11580156200237d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620023a39190620031aa565b50505b50506000600c60146101000a81548160ff021916908315150217905550505050565b620023d4828262000e9f565b6200245457620023e4816200264e565b620023f48360001c60206200267d565b6040516020016200240792919062003cd5565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200244b919062002a67565b60405180910390fd5b5050565b62002465838383620024ad565b505050565b600080823b905060008111915050919050565b600081836200248d919062003281565b905092915050565b60008183620024a5919062003d17565b905092915050565b620024ba838383620028d8565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101562002543576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200253a9062003dc5565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405162002633919062002b83565b60405180910390a362002648848484620028dd565b50505050565b6060620026768273ffffffffffffffffffffffffffffffffffffffff16601460ff166200267d565b9050919050565b60606000600283600262002692919062003281565b6200269e919062003136565b67ffffffffffffffff811115620026ba57620026b962003ab0565b5b6040519080825280601f01601f191660200182016040528015620026ed5781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811062002728576200272762003252565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106200278f576200278e62003252565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002620027d1919062003281565b620027dd919062003136565b90505b600181111562002887577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811062002823576200282262003252565b5b1a60f81b8282815181106200283d576200283c62003252565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806200287f9062003de7565b9050620027e0565b5060008414620028ce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620028c59062003e66565b60405180910390fd5b8091505092915050565b505050565b505050565b61024c8062003e8983390190565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6200293181620028fa565b81146200293d57600080fd5b50565b600081359050620029518162002926565b92915050565b60006020828403121562002970576200296f620028f0565b5b6000620029808482850162002940565b91505092915050565b60008115159050919050565b620029a08162002989565b82525050565b6000602082019050620029bd600083018462002995565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015620029ff578082015181840152602081019050620029e2565b8381111562002a0f576000848401525b50505050565b6000601f19601f8301169050919050565b600062002a3382620029c3565b62002a3f8185620029ce565b935062002a51818560208601620029df565b62002a5c8162002a15565b840191505092915050565b6000602082019050818103600083015262002a83818462002a26565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062002ab88262002a8b565b9050919050565b62002aca8162002aab565b811462002ad657600080fd5b50565b60008135905062002aea8162002abf565b92915050565b6000819050919050565b62002b058162002af0565b811462002b1157600080fd5b50565b60008135905062002b258162002afa565b92915050565b6000806040838503121562002b455762002b44620028f0565b5b600062002b558582860162002ad9565b925050602062002b688582860162002b14565b9150509250929050565b62002b7d8162002af0565b82525050565b600060208201905062002b9a600083018462002b72565b92915050565b62002bab8162002989565b811462002bb757600080fd5b50565b60008135905062002bcb8162002ba0565b92915050565b60006020828403121562002bea5762002be9620028f0565b5b600062002bfa8482850162002bba565b91505092915050565b60008060006060848603121562002c1f5762002c1e620028f0565b5b600062002c2f8682870162002ad9565b935050602062002c428682870162002ad9565b925050604062002c558682870162002b14565b9150509250925092565b6000819050919050565b62002c748162002c5f565b811462002c8057600080fd5b50565b60008135905062002c948162002c69565b92915050565b60006020828403121562002cb35762002cb2620028f0565b5b600062002cc38482850162002c83565b91505092915050565b62002cd78162002c5f565b82525050565b600060208201905062002cf4600083018462002ccc565b92915050565b6000806040838503121562002d145762002d13620028f0565b5b600062002d248582860162002c83565b925050602062002d378582860162002ad9565b9150509250929050565b600060ff82169050919050565b62002d598162002d41565b82525050565b600060208201905062002d76600083018462002d4e565b92915050565b62002d878162002aab565b82525050565b600060208201905062002da4600083018462002d7c565b92915050565b60006020828403121562002dc35762002dc2620028f0565b5b600062002dd38482850162002ad9565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011262002e045762002e0362002ddc565b5b8235905067ffffffffffffffff81111562002e245762002e2362002de1565b5b60208301915083602082028301111562002e435762002e4262002de6565b5b9250929050565b6000806020838503121562002e645762002e63620028f0565b5b600083013567ffffffffffffffff81111562002e855762002e84620028f5565b5b62002e938582860162002deb565b92509250509250929050565b6000819050919050565b600062002eca62002ec462002ebe8462002a8b565b62002e9f565b62002a8b565b9050919050565b600062002ede8262002ea9565b9050919050565b600062002ef28262002ed1565b9050919050565b62002f048162002ee5565b82525050565b600060208201905062002f21600083018462002ef9565b92915050565b6000806040838503121562002f415762002f40620028f0565b5b600062002f518582860162002ad9565b925050602062002f648582860162002ad9565b9150509250929050565b600062ffffff82169050919050565b62002f888162002f6e565b811462002f9457600080fd5b50565b60008135905062002fa88162002f7d565b92915050565b60008060006060848603121562002fca5762002fc9620028f0565b5b600062002fda8682870162002ad9565b935050602062002fed8682870162002ad9565b9250506040620030008682870162002f97565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200305257607f821691505b602082108114156200306957620030686200300a565b5b50919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000620030cd602f83620029ce565b9150620030da826200306f565b604082019050919050565b600060208201905081810360008301526200310081620030be565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620031438262002af0565b9150620031508362002af0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562003188576200318762003107565b5b828201905092915050565b600081519050620031a48162002afa565b92915050565b600060208284031215620031c357620031c2620028f0565b5b6000620031d38482850162003193565b91505092915050565b6000604082019050620031f3600083018562002d7c565b62003202602083018462002b72565b9392505050565b6000815190506200321a8162002ba0565b92915050565b600060208284031215620032395762003238620028f0565b5b6000620032498482850162003209565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006200328e8262002af0565b91506200329b8362002af0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620032d757620032d662003107565b5b828202905092915050565b6000620032ef8262002af0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141562003325576200332462003107565b5b600182019050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006200338e602583620029ce565b91506200339b8262003330565b604082019050919050565b60006020820190508181036000830152620033c1816200337f565b9050919050565b600081519050620033d98162002abf565b92915050565b600060208284031215620033f857620033f7620028f0565b5b60006200340884828501620033c8565b91505092915050565b6200341c8162002f6e565b82525050565b600060608201905062003439600083018662002d7c565b62003448602083018562002d7c565b62003457604083018462003411565b949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000620034bd602683620029ce565b9150620034ca826200345f565b604082019050919050565b60006020820190508181036000830152620034f081620034ae565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600062003555602483620029ce565b91506200356282620034f7565b604082019050919050565b60006020820190508181036000830152620035888162003546565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000620035ed602283620029ce565b9150620035fa826200358f565b604082019050919050565b600060208201905081810360008301526200362081620035de565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b60006200365f601d83620029ce565b91506200366c8262003627565b602082019050919050565b60006020820190508181036000830152620036928162003650565b9050919050565b7f616d6f756e74206d757374206774203000000000000000000000000000000000600082015250565b6000620036d1601083620029ce565b9150620036de8262003699565b602082019050919050565b600060208201905081810360008301526200370481620036c2565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600062003769602583620029ce565b915062003776826200370b565b604082019050919050565b600060208201905081810360008301526200379c816200375a565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600062003801602383620029ce565b91506200380e82620037a3565b604082019050919050565b600060208201905081810360008301526200383481620037f2565b9050919050565b7f6e6f74206f70656e000000000000000000000000000000000000000000000000600082015250565b600062003873600883620029ce565b915062003880826200383b565b602082019050919050565b60006020820190508181036000830152620038a68162003864565b9050919050565b7f4d4556424f542070726f74656374696f6e000000000000000000000000000000600082015250565b6000620038e5601183620029ce565b9150620038f282620038ad565b602082019050919050565b600060208201905081810360008301526200391881620038d6565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062003957602083620029ce565b915062003964826200391f565b602082019050919050565b600060208201905081810360008301526200398a8162003948565b9050919050565b6000819050919050565b620039b0620039aa8262002af0565b62003991565b82525050565b60008160601b9050919050565b6000620039d082620039b6565b9050919050565b6000620039e482620039c3565b9050919050565b62003a00620039fa8262002aab565b620039d7565b82525050565b600062003a1482866200399b565b60208201915062003a2682856200399b565b60208201915062003a388284620039eb565b601482019150819050949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600062003a858262002af0565b915062003a928362002af0565b92508262003aa55762003aa462003a49565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b62003aea8162002aab565b82525050565b62003afb8162002f6e565b82525050565b62003b0c8162002af0565b82525050565b62003b1d8162002a8b565b82525050565b6101008201600082015162003b3c600085018262003adf565b50602082015162003b51602085018262003adf565b50604082015162003b66604085018262003af0565b50606082015162003b7b606085018262003adf565b50608082015162003b90608085018262003b01565b5060a082015162003ba560a085018262003b01565b5060c082015162003bba60c085018262003b01565b5060e082015162003bcf60e085018262003b12565b50505050565b60006101008201905062003bed600083018462003b23565b92915050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b600062003c3660178362003bf3565b915062003c438262003bfe565b601782019050919050565b600062003c5b82620029c3565b62003c67818562003bf3565b935062003c79818560208601620029df565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b600062003cbd60118362003bf3565b915062003cca8262003c85565b601182019050919050565b600062003ce28262003c27565b915062003cf0828562003c4e565b915062003cfd8262003cae565b915062003d0b828462003c4e565b91508190509392505050565b600062003d248262002af0565b915062003d318362002af0565b92508262003d445762003d4362003a49565b5b828204905092915050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600062003dad602683620029ce565b915062003dba8262003d4f565b604082019050919050565b6000602082019050818103600083015262003de08162003d9e565b9050919050565b600062003df48262002af0565b9150600082141562003e0b5762003e0a62003107565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b600062003e4e602083620029ce565b915062003e5b8262003e16565b602082019050919050565b6000602082019050818103600083015262003e818162003e3f565b905091905056fe608060405234801561001057600080fd5b5060405161024c38038061024c8339818101604052810190610032919061011c565b8073ffffffffffffffffffffffffffffffffffffffff1663095ea7b3336000196040518363ffffffff1660e01b815260040161006f929190610171565b6020604051808303816000875af115801561008e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100b291906101d2565b50506101ff565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006100e9826100be565b9050919050565b6100f9816100de565b811461010457600080fd5b50565b600081519050610116816100f0565b92915050565b600060208284031215610132576101316100b9565b5b600061014084828501610107565b91505092915050565b610152816100de565b82525050565b6000819050919050565b61016b81610158565b82525050565b60006040820190506101866000830185610149565b6101936020830184610162565b9392505050565b60008115159050919050565b6101af8161019a565b81146101ba57600080fd5b50565b6000815190506101cc816101a6565b92915050565b6000602082840312156101e8576101e76100b9565b5b60006101f6848285016101bd565b91505092915050565b603f8061020d6000396000f3fe6080604052600080fdfea2646970667358221220523e0ec44fd877fb555b0a3a39f6c03df10e90c786f755c92fd9e2ee3f8b605c64736f6c634300080c0033a26469706673582212207b2696abc5f99a94a5c2d7fdeeb580eb49c798cc3f52db218d32c8f2d063d23c64736f6c634300080c0033

Deployed Bytecode

0x608060405260043610620001ff5760003560e01c8063715018a6116200010f578063a217fddf11620000a3578063d547741f116200006d578063d547741f146200076a578063dd62ed3e1462000798578063f229906d14620007dc578063f2fde38b146200080a5762000207565b8063a217fddf1462000682578063a457c2d714620006b2578063a9059cbb14620006f6578063cabf3a93146200073a5762000207565b80638852299811620000e55780638852299814620005ae5780638da5cb5b14620005de57806391d14854146200060e57806395d89b4114620006525762000207565b8063715018a614620005365780638072014014620005505780638718b24f146200057e5762000207565b8063248a9ca3116200019357806339509351116200015d5780633950935114620004505780633fc8cef314620004945780634760666e14620004c457806370a0823114620004f25762000207565b8063248a9ca314620003805780632f2ff15d14620003c4578063313ce56714620003f257806336568abe14620004225762000207565b8063095ea7b311620001d5578063095ea7b3146200029a57806318160ddd14620002de578063229687cc146200030e57806323b872dd146200033c5762000207565b806301ffc9a7146200020c5780630390512d146200025057806306fdde03146200026a5762000207565b366200020757005b600080fd5b3480156200021957600080fd5b5062000238600480360381019062000232919062002957565b62000838565b604051620002479190620029a6565b60405180910390f35b3480156200025d57600080fd5b5062000268620008b5565b005b3480156200027757600080fd5b5062000282620008eb565b60405162000291919062002a67565b60405180910390f35b348015620002a757600080fd5b50620002c66004803603810190620002c0919062002b2b565b62000985565b604051620002d59190620029a6565b60405180910390f35b348015620002eb57600080fd5b50620002f6620009ac565b60405162000305919062002b83565b60405180910390f35b3480156200031b57600080fd5b506200033a600480360381019062000334919062002bd1565b620009b6565b005b3480156200034957600080fd5b5062000368600480360381019062000362919062002c03565b62000a00565b604051620003779190620029a6565b60405180910390f35b3480156200038d57600080fd5b50620003ac6004803603810190620003a6919062002c9a565b62000a35565b604051620003bb919062002cdd565b60405180910390f35b348015620003d157600080fd5b50620003f06004803603810190620003ea919062002cfa565b62000a55565b005b348015620003ff57600080fd5b506200040a62000a7c565b60405162000419919062002d5f565b60405180910390f35b3480156200042f57600080fd5b506200044e600480360381019062000448919062002cfa565b62000a85565b005b3480156200045d57600080fd5b506200047c600480360381019062000476919062002b2b565b62000b0f565b6040516200048b9190620029a6565b60405180910390f35b348015620004a157600080fd5b50620004ac62000b4e565b604051620004bb919062002d8d565b60405180910390f35b348015620004d157600080fd5b50620004f06004803603810190620004ea919062002daa565b62000b74565b005b348015620004ff57600080fd5b506200051e600480360381019062000518919062002daa565b62000ca6565b6040516200052d919062002b83565b60405180910390f35b3480156200054357600080fd5b506200054e62000cee565b005b3480156200055d57600080fd5b506200057c600480360381019062000576919062002e4a565b62000d06565b005b3480156200058b57600080fd5b506200059662000e29565b604051620005a5919062002f0a565b60405180910390f35b348015620005bb57600080fd5b50620005c662000e4f565b604051620005d5919062002d8d565b60405180910390f35b348015620005eb57600080fd5b50620005f662000e75565b60405162000605919062002d8d565b60405180910390f35b3480156200061b57600080fd5b506200063a600480360381019062000634919062002cfa565b62000e9f565b604051620006499190620029a6565b60405180910390f35b3480156200065f57600080fd5b506200066a62000f0a565b60405162000679919062002a67565b60405180910390f35b3480156200068f57600080fd5b506200069a62000fa4565b604051620006a9919062002cdd565b60405180910390f35b348015620006bf57600080fd5b50620006de6004803603810190620006d8919062002b2b565b62000fab565b604051620006ed9190620029a6565b60405180910390f35b3480156200070357600080fd5b506200072260048036038101906200071c919062002b2b565b6200102b565b604051620007319190620029a6565b60405180910390f35b3480156200074757600080fd5b506200075262001052565b60405162000761919062002b83565b60405180910390f35b3480156200077757600080fd5b5062000796600480360381019062000790919062002cfa565b62001058565b005b348015620007a557600080fd5b50620007c46004803603810190620007be919062002f27565b6200107f565b604051620007d3919062002b83565b60405180910390f35b348015620007e957600080fd5b5062000808600480360381019062000802919062002fae565b62001106565b005b3480156200081757600080fd5b5062000836600480360381019062000830919062002daa565b62001588565b005b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480620008ae5750620008ad8262001613565b5b9050919050565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b08620008e1816200167d565b43600a8190555050565b606060038054620008fc9062003039565b80601f01602080910402602001604051908101604052809291908181526020018280546200092a9062003039565b80156200097b5780601f106200094f576101008083540402835291602001916200097b565b820191906000526020600020905b8154815290600101906020018083116200095d57829003601f168201915b5050505050905090565b6000806200099262001695565b9050620009a18185856200169d565b600191505092915050565b6000600254905090565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b08620009e2816200167d565b81600b60006101000a81548160ff0219169083151502179055505050565b60008062000a0d62001695565b905062000a1c85828562001870565b62000a2985858562001904565b60019150509392505050565b600060056000838152602001908152602001600020600101549050919050565b62000a608262000a35565b62000a6b816200167d565b62000a77838362001ce5565b505050565b60006009905090565b62000a8f62001695565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161462000aff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000af690620030e5565b60405180910390fd5b62000b0b828262001dcb565b5050565b60008062000b1c62001695565b905062000b4381858562000b3185896200107f565b62000b3d919062003136565b6200169d565b600191505092915050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b0862000ba0816200167d565b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb338473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040162000bf8919062002d8d565b602060405180830381865afa15801562000c16573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000c3c9190620031aa565b6040518363ffffffff1660e01b815260040162000c5b929190620031dc565b6020604051808303816000875af115801562000c7b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000ca1919062003220565b505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b62000cf862001eb2565b62000d04600062001f37565b565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b0862000d32816200167d565b43600a8190555060005b8383905081101562000e085762000df26703bf3b91c95b0000662386f26fc10000600162000d98600589898881811062000d7b5762000d7a62003252565b5b905060200201602081019062000d92919062002daa565b62001ffd565b62000da4919062003136565b62000db0919062003281565b62000dbc919062003136565b85858481811062000dd25762000dd162003252565b5b905060200201602081019062000de9919062002daa565b61271062002044565b808062000dff90620032e2565b91505062000d3c565b506001600b60006101000a81548160ff021916908315150217905550505050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60606004805462000f1b9062003039565b80601f016020809104026020016040519081016040528092919081815260200182805462000f499062003039565b801562000f9a5780601f1062000f6e5761010080835404028352916020019162000f9a565b820191906000526020600020905b81548152906001019060200180831162000f7c57829003601f168201915b5050505050905090565b6000801b81565b60008062000fb862001695565b9050600062000fc882866200107f565b90508381101562001010576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200100790620033a6565b60405180910390fd5b6200101f82868684036200169d565b60019250505092915050565b6000806200103862001695565b90506200104781858562001904565b600191505092915050565b600a5481565b620010638262000a35565b6200106e816200167d565b6200107a838362001dcb565b505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b0862001132816200167d565b83600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600083905080600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562001227573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200124d9190620033df565b73ffffffffffffffffffffffffffffffffffffffff1663a167129530600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16866040518463ffffffff1660e01b8152600401620012ad9392919062003422565b6020604051808303816000875af1158015620012cd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620012f39190620033df565b600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401620013d4929190620031dc565b6020604051808303816000875af1158015620013f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200141a919062003220565b506200146a30600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6200169d565b6200149730307fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6200169d565b62001508600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6200169d565b306040516200151790620028e2565b62001523919062002d8d565b604051809103906000f08015801562001540573d6000803e3d6000fd5b50600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050565b6200159262001eb2565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141562001605576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620015fc90620034d5565b60405180910390fd5b620016108162001f37565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b62001692816200168c62001695565b620023c8565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141562001710576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001707906200356d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562001783576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200177a9062003605565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405162001863919062002b83565b60405180910390a3505050565b60006200187e84846200107f565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114620018fe5781811015620018ee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620018e59062003677565b60405180910390fd5b620018fd84848484036200169d565b5b50505050565b600081116200194a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200194190620036e9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415620019bd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620019b49062003781565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562001a30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001a279062003819565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801562001add5750600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b1562001af65762001af083838362002458565b62001ce0565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141562001c75576000600a541162001b95576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001b8c906200388b565b60405180910390fd5b62001ba0826200246a565b158062001bba5750600b60009054906101000a900460ff16155b62001bfc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001bf390620038fd565b60405180910390fd5b62001c368361dead62001c306103e862001c216003876200247d90919063ffffffff16565b6200249590919063ffffffff16565b620024ad565b62001c6f838362001c696103e862001c5a6103e5876200247d90919063ffffffff16565b6200249590919063ffffffff16565b620024ad565b62001ce0565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562001cdf5762001cd9838383620024ad565b62001ce0565b5b505050565b62001cf1828262000e9f565b62001dc75760016005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555062001d6c62001695565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b62001dd7828262000e9f565b1562001eae5760006005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555062001e5362001695565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b62001ebc62001695565b73ffffffffffffffffffffffffffffffffffffffff1662001edc62000e75565b73ffffffffffffffffffffffffffffffffffffffff161462001f35576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001f2c906200396f565b60405180910390fd5b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600082424484604051602001620020179392919062003a06565b6040516020818303038152906040528051906020012060001c6200203c919062003a78565b905092915050565b6001600c60146101000a81548160ff0219169083151502179055506000600267ffffffffffffffff8111156200207f576200207e62003ab0565b5b604051908082528060200260200182016040528015620020ae5781602001602082028036833780820191505090505b509050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600081518110620020eb57620020ea62003252565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505030816001815181106200213d576200213c62003252565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401620021d6919062002d8d565b602060405180830381865afa158015620021f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200221a9190620031aa565b905060008514156200222a578094505b808511620023a6576000604051806101000160405280600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020013073ffffffffffffffffffffffffffffffffffffffff1681526020018562ffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff16815260200161012c42620022d1919062003136565b815260200187815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152509050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663414bf389826040518263ffffffff1660e01b81526004016200235d919062003bd5565b6020604051808303816000875af11580156200237d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620023a39190620031aa565b50505b50506000600c60146101000a81548160ff021916908315150217905550505050565b620023d4828262000e9f565b6200245457620023e4816200264e565b620023f48360001c60206200267d565b6040516020016200240792919062003cd5565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200244b919062002a67565b60405180910390fd5b5050565b62002465838383620024ad565b505050565b600080823b905060008111915050919050565b600081836200248d919062003281565b905092915050565b60008183620024a5919062003d17565b905092915050565b620024ba838383620028d8565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101562002543576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200253a9062003dc5565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405162002633919062002b83565b60405180910390a362002648848484620028dd565b50505050565b6060620026768273ffffffffffffffffffffffffffffffffffffffff16601460ff166200267d565b9050919050565b60606000600283600262002692919062003281565b6200269e919062003136565b67ffffffffffffffff811115620026ba57620026b962003ab0565b5b6040519080825280601f01601f191660200182016040528015620026ed5781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811062002728576200272762003252565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106200278f576200278e62003252565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002620027d1919062003281565b620027dd919062003136565b90505b600181111562002887577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811062002823576200282262003252565b5b1a60f81b8282815181106200283d576200283c62003252565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806200287f9062003de7565b9050620027e0565b5060008414620028ce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620028c59062003e66565b60405180910390fd5b8091505092915050565b505050565b505050565b61024c8062003e8983390190565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6200293181620028fa565b81146200293d57600080fd5b50565b600081359050620029518162002926565b92915050565b60006020828403121562002970576200296f620028f0565b5b6000620029808482850162002940565b91505092915050565b60008115159050919050565b620029a08162002989565b82525050565b6000602082019050620029bd600083018462002995565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015620029ff578082015181840152602081019050620029e2565b8381111562002a0f576000848401525b50505050565b6000601f19601f8301169050919050565b600062002a3382620029c3565b62002a3f8185620029ce565b935062002a51818560208601620029df565b62002a5c8162002a15565b840191505092915050565b6000602082019050818103600083015262002a83818462002a26565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062002ab88262002a8b565b9050919050565b62002aca8162002aab565b811462002ad657600080fd5b50565b60008135905062002aea8162002abf565b92915050565b6000819050919050565b62002b058162002af0565b811462002b1157600080fd5b50565b60008135905062002b258162002afa565b92915050565b6000806040838503121562002b455762002b44620028f0565b5b600062002b558582860162002ad9565b925050602062002b688582860162002b14565b9150509250929050565b62002b7d8162002af0565b82525050565b600060208201905062002b9a600083018462002b72565b92915050565b62002bab8162002989565b811462002bb757600080fd5b50565b60008135905062002bcb8162002ba0565b92915050565b60006020828403121562002bea5762002be9620028f0565b5b600062002bfa8482850162002bba565b91505092915050565b60008060006060848603121562002c1f5762002c1e620028f0565b5b600062002c2f8682870162002ad9565b935050602062002c428682870162002ad9565b925050604062002c558682870162002b14565b9150509250925092565b6000819050919050565b62002c748162002c5f565b811462002c8057600080fd5b50565b60008135905062002c948162002c69565b92915050565b60006020828403121562002cb35762002cb2620028f0565b5b600062002cc38482850162002c83565b91505092915050565b62002cd78162002c5f565b82525050565b600060208201905062002cf4600083018462002ccc565b92915050565b6000806040838503121562002d145762002d13620028f0565b5b600062002d248582860162002c83565b925050602062002d378582860162002ad9565b9150509250929050565b600060ff82169050919050565b62002d598162002d41565b82525050565b600060208201905062002d76600083018462002d4e565b92915050565b62002d878162002aab565b82525050565b600060208201905062002da4600083018462002d7c565b92915050565b60006020828403121562002dc35762002dc2620028f0565b5b600062002dd38482850162002ad9565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011262002e045762002e0362002ddc565b5b8235905067ffffffffffffffff81111562002e245762002e2362002de1565b5b60208301915083602082028301111562002e435762002e4262002de6565b5b9250929050565b6000806020838503121562002e645762002e63620028f0565b5b600083013567ffffffffffffffff81111562002e855762002e84620028f5565b5b62002e938582860162002deb565b92509250509250929050565b6000819050919050565b600062002eca62002ec462002ebe8462002a8b565b62002e9f565b62002a8b565b9050919050565b600062002ede8262002ea9565b9050919050565b600062002ef28262002ed1565b9050919050565b62002f048162002ee5565b82525050565b600060208201905062002f21600083018462002ef9565b92915050565b6000806040838503121562002f415762002f40620028f0565b5b600062002f518582860162002ad9565b925050602062002f648582860162002ad9565b9150509250929050565b600062ffffff82169050919050565b62002f888162002f6e565b811462002f9457600080fd5b50565b60008135905062002fa88162002f7d565b92915050565b60008060006060848603121562002fca5762002fc9620028f0565b5b600062002fda8682870162002ad9565b935050602062002fed8682870162002ad9565b9250506040620030008682870162002f97565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200305257607f821691505b602082108114156200306957620030686200300a565b5b50919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000620030cd602f83620029ce565b9150620030da826200306f565b604082019050919050565b600060208201905081810360008301526200310081620030be565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620031438262002af0565b9150620031508362002af0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562003188576200318762003107565b5b828201905092915050565b600081519050620031a48162002afa565b92915050565b600060208284031215620031c357620031c2620028f0565b5b6000620031d38482850162003193565b91505092915050565b6000604082019050620031f3600083018562002d7c565b62003202602083018462002b72565b9392505050565b6000815190506200321a8162002ba0565b92915050565b600060208284031215620032395762003238620028f0565b5b6000620032498482850162003209565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006200328e8262002af0565b91506200329b8362002af0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620032d757620032d662003107565b5b828202905092915050565b6000620032ef8262002af0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141562003325576200332462003107565b5b600182019050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006200338e602583620029ce565b91506200339b8262003330565b604082019050919050565b60006020820190508181036000830152620033c1816200337f565b9050919050565b600081519050620033d98162002abf565b92915050565b600060208284031215620033f857620033f7620028f0565b5b60006200340884828501620033c8565b91505092915050565b6200341c8162002f6e565b82525050565b600060608201905062003439600083018662002d7c565b62003448602083018562002d7c565b62003457604083018462003411565b949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000620034bd602683620029ce565b9150620034ca826200345f565b604082019050919050565b60006020820190508181036000830152620034f081620034ae565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600062003555602483620029ce565b91506200356282620034f7565b604082019050919050565b60006020820190508181036000830152620035888162003546565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000620035ed602283620029ce565b9150620035fa826200358f565b604082019050919050565b600060208201905081810360008301526200362081620035de565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b60006200365f601d83620029ce565b91506200366c8262003627565b602082019050919050565b60006020820190508181036000830152620036928162003650565b9050919050565b7f616d6f756e74206d757374206774203000000000000000000000000000000000600082015250565b6000620036d1601083620029ce565b9150620036de8262003699565b602082019050919050565b600060208201905081810360008301526200370481620036c2565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600062003769602583620029ce565b915062003776826200370b565b604082019050919050565b600060208201905081810360008301526200379c816200375a565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600062003801602383620029ce565b91506200380e82620037a3565b604082019050919050565b600060208201905081810360008301526200383481620037f2565b9050919050565b7f6e6f74206f70656e000000000000000000000000000000000000000000000000600082015250565b600062003873600883620029ce565b915062003880826200383b565b602082019050919050565b60006020820190508181036000830152620038a68162003864565b9050919050565b7f4d4556424f542070726f74656374696f6e000000000000000000000000000000600082015250565b6000620038e5601183620029ce565b9150620038f282620038ad565b602082019050919050565b600060208201905081810360008301526200391881620038d6565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062003957602083620029ce565b915062003964826200391f565b602082019050919050565b600060208201905081810360008301526200398a8162003948565b9050919050565b6000819050919050565b620039b0620039aa8262002af0565b62003991565b82525050565b60008160601b9050919050565b6000620039d082620039b6565b9050919050565b6000620039e482620039c3565b9050919050565b62003a00620039fa8262002aab565b620039d7565b82525050565b600062003a1482866200399b565b60208201915062003a2682856200399b565b60208201915062003a388284620039eb565b601482019150819050949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600062003a858262002af0565b915062003a928362002af0565b92508262003aa55762003aa462003a49565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b62003aea8162002aab565b82525050565b62003afb8162002f6e565b82525050565b62003b0c8162002af0565b82525050565b62003b1d8162002a8b565b82525050565b6101008201600082015162003b3c600085018262003adf565b50602082015162003b51602085018262003adf565b50604082015162003b66604085018262003af0565b50606082015162003b7b606085018262003adf565b50608082015162003b90608085018262003b01565b5060a082015162003ba560a085018262003b01565b5060c082015162003bba60c085018262003b01565b5060e082015162003bcf60e085018262003b12565b50505050565b60006101008201905062003bed600083018462003b23565b92915050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b600062003c3660178362003bf3565b915062003c438262003bfe565b601782019050919050565b600062003c5b82620029c3565b62003c67818562003bf3565b935062003c79818560208601620029df565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b600062003cbd60118362003bf3565b915062003cca8262003c85565b601182019050919050565b600062003ce28262003c27565b915062003cf0828562003c4e565b915062003cfd8262003cae565b915062003d0b828462003c4e565b91508190509392505050565b600062003d248262002af0565b915062003d318362002af0565b92508262003d445762003d4362003a49565b5b828204905092915050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600062003dad602683620029ce565b915062003dba8262003d4f565b604082019050919050565b6000602082019050818103600083015262003de08162003d9e565b9050919050565b600062003df48262002af0565b9150600082141562003e0b5762003e0a62003107565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b600062003e4e602083620029ce565b915062003e5b8262003e16565b602082019050919050565b6000602082019050818103600083015262003e818162003e3f565b905091905056fe608060405234801561001057600080fd5b5060405161024c38038061024c8339818101604052810190610032919061011c565b8073ffffffffffffffffffffffffffffffffffffffff1663095ea7b3336000196040518363ffffffff1660e01b815260040161006f929190610171565b6020604051808303816000875af115801561008e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100b291906101d2565b50506101ff565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006100e9826100be565b9050919050565b6100f9816100de565b811461010457600080fd5b50565b600081519050610116816100f0565b92915050565b600060208284031215610132576101316100b9565b5b600061014084828501610107565b91505092915050565b610152816100de565b82525050565b6000819050919050565b61016b81610158565b82525050565b60006040820190506101866000830185610149565b6101936020830184610162565b9392505050565b60008115159050919050565b6101af8161019a565b81146101ba57600080fd5b50565b6000815190506101cc816101a6565b92915050565b6000602082840312156101e8576101e76100b9565b5b60006101f6848285016101bd565b91505092915050565b603f8061020d6000396000f3fe6080604052600080fdfea2646970667358221220523e0ec44fd877fb555b0a3a39f6c03df10e90c786f755c92fd9e2ee3f8b605c64736f6c634300080c0033a26469706673582212207b2696abc5f99a94a5c2d7fdeeb580eb49c798cc3f52db218d32c8f2d063d23c64736f6c634300080c0033

Deployed Bytecode Sourcemap

58899:4752:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33882:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63224:96;;;;;;;;;;;;;:::i;:::-;;47940:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50300:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49069:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63336:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51081:261;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35673:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36114:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60340:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37258:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51751:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59134:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63441:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49240:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41395:103;;;;;;;;;;;;;:::i;:::-;;62746:280;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59249:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59099:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40754:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34178:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48159:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33283:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52492:424;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49573:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59160:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36554:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49829:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59677:655;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41653:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33882:204;33967:4;34006:32;33991:47;;;:11;:47;;;;:87;;;;34042:36;34066:11;34042:23;:36::i;:::-;33991:87;33984:94;;33882:204;;;:::o;63224:96::-;58992:25;33774:16;33785:4;33774:10;:16::i;:::-;63300:12:::1;63287:10;:25;;;;63224:96:::0;:::o;47940:100::-;47994:13;48027:5;48020:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47940:100;:::o;50300:201::-;50383:4;50400:13;50416:12;:10;:12::i;:::-;50400:28;;50439:32;50448:5;50455:7;50464:6;50439:8;:32::i;:::-;50489:4;50482:11;;;50300:201;;;;:::o;49069:108::-;49130:7;49157:12;;49150:19;;49069:108;:::o;63336:97::-;58992:25;33774:16;33785:4;33774:10;:16::i;:::-;63419:6:::1;63407:9;;:18;;;;;;;;;;;;;;;;;;63336:97:::0;;:::o;51081:261::-;51178:4;51195:15;51213:12;:10;:12::i;:::-;51195:30;;51236:38;51252:4;51258:7;51267:6;51236:15;:38::i;:::-;51285:27;51295:4;51301:2;51305:6;51285:9;:27::i;:::-;51330:4;51323:11;;;51081:261;;;;;:::o;35673:131::-;35747:7;35774:6;:12;35781:4;35774:12;;;;;;;;;;;:22;;;35767:29;;35673:131;;;:::o;36114:147::-;36197:18;36210:4;36197:12;:18::i;:::-;33774:16;33785:4;33774:10;:16::i;:::-;36228:25:::1;36239:4;36245:7;36228:10;:25::i;:::-;36114:147:::0;;;:::o;60340:92::-;60398:5;60423:1;60416:8;;60340:92;:::o;37258:218::-;37365:12;:10;:12::i;:::-;37354:23;;:7;:23;;;37346:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;37442:26;37454:4;37460:7;37442:11;:26::i;:::-;37258:218;;:::o;51751:238::-;51839:4;51856:13;51872:12;:10;:12::i;:::-;51856:28;;51895:64;51904:5;51911:7;51948:10;51920:25;51930:5;51937:7;51920:9;:25::i;:::-;:38;;;;:::i;:::-;51895:8;:64::i;:::-;51977:4;51970:11;;;51751:238;;;;:::o;59134:19::-;;;;;;;;;;;;;:::o;63441:161::-;58992:25;33774:16;33785:4;33774:10;:16::i;:::-;63525:6:::1;63519:22;;;63542:10;63561:6;63554:24;;;63587:4;63554:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63519:75;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;63441:161:::0;;:::o;49240:127::-;49314:7;49341:9;:18;49351:7;49341:18;;;;;;;;;;;;;;;;49334:25;;49240:127;;;:::o;41395:103::-;40640:13;:11;:13::i;:::-;41460:30:::1;41487:1;41460:18;:30::i;:::-;41395:103::o:0;62746:280::-;58992:25;33774:16;33785:4;33774:10;:16::i;:::-;62845:12:::1;62832:10;:25;;;;62872:6;62868:124;62883:4;;:11;;62881:1;:13;62868:124;;;62915:65;62954:9;62947:6;62944:1;62926:17;62933:1;62935:4;;62940:1;62935:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;62926:6;:17::i;:::-;:19;;;;:::i;:::-;62925:28;;;;:::i;:::-;:38;;;;:::i;:::-;62965:4;;62970:1;62965:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;62974:5;62915:9;:65::i;:::-;62895:3;;;;;:::i;:::-;;;;62868:124;;;;63014:4;63002:9;;:16;;;;;;;;;;;;;;;;;;62746:280:::0;;;:::o;59249:41::-;;;;;;;;;;;;;:::o;59099:28::-;;;;;;;;;;;;;:::o;40754:87::-;40800:7;40827:6;;;;;;;;;;;40820:13;;40754:87;:::o;34178:147::-;34264:4;34288:6;:12;34295:4;34288:12;;;;;;;;;;;:20;;:29;34309:7;34288:29;;;;;;;;;;;;;;;;;;;;;;;;;34281:36;;34178:147;;;;:::o;48159:104::-;48215:13;48248:7;48241:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48159:104;:::o;33283:49::-;33328:4;33283:49;;;:::o;52492:424::-;52585:4;52602:13;52618:12;:10;:12::i;:::-;52602:28;;52641:24;52668:25;52678:5;52685:7;52668:9;:25::i;:::-;52641:52;;52732:15;52712:16;:35;;52704:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;52817:60;52826:5;52833:7;52861:15;52842:16;:34;52817:8;:60::i;:::-;52904:4;52897:11;;;;52492:424;;;;:::o;49573:193::-;49652:4;49669:13;49685:12;:10;:12::i;:::-;49669:28;;49708;49718:5;49725:2;49729:6;49708:9;:28::i;:::-;49754:4;49747:11;;;49573:193;;;;:::o;59160:25::-;;;;:::o;36554:149::-;36638:18;36651:4;36638:12;:18::i;:::-;33774:16;33785:4;33774:10;:16::i;:::-;36669:26:::1;36681:4;36687:7;36669:11;:26::i;:::-;36554:149:::0;;;:::o;49829:151::-;49918:7;49945:11;:18;49957:5;49945:18;;;;;;;;;;;;;;;:27;49964:7;49945:27;;;;;;;;;;;;;;;;49938:34;;49829:151;;;;:::o;59677:655::-;58992:25;33774:16;33785:4;33774:10;:16::i;:::-;59784:6:::1;59779:4;;:11;;;;;;;;;;;;;;;;;;59801:12;59814:5;59801:18;;59860:4;59830:15;;:35;;;;;;;;;;;;;;;;;;59905:15;;;;;;;;;;;:23;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59892:50;;;59951:4;59958;;;;;;;;;;;59964:3;59892:76;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59876:13;;:92;;;;;;;;;;;;;;;;;;59985:4;;;;;;;;;;;59979:19;;;60007:15;;;;;;;;;;;60025:17;59979:64;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;60054:67;60071:4;60086:15;;;;;;;;;;;60103:17;60054:8;:67::i;:::-;60132:56;60149:4;60164;60170:17;60132:8;:56::i;:::-;60199:59;60208:5;;;;;;;;;;;60223:15;;;;;;;;;;;60240:17;60199:8;:59::i;:::-;60318:4;60289:35;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;60269:17;;:55;;;;;;;;;;;;;;;;;;59768:564;59677:655:::0;;;;:::o;41653:201::-;40640:13;:11;:13::i;:::-;41762:1:::1;41742:22;;:8;:22;;;;41734:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;41818:28;41837:8;41818:18;:28::i;:::-;41653:201:::0;:::o;8568:157::-;8653:4;8692:25;8677:40;;;:11;:40;;;;8670:47;;8568:157;;;:::o;34629:105::-;34696:30;34707:4;34713:12;:10;:12::i;:::-;34696:10;:30::i;:::-;34629:105;:::o;30964:98::-;31017:7;31044:10;31037:17;;30964:98;:::o;56259:346::-;56378:1;56361:19;;:5;:19;;;;56353:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56459:1;56440:21;;:7;:21;;;;56432:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56543:6;56513:11;:18;56525:5;56513:18;;;;;;;;;;;;;;;:27;56532:7;56513:27;;;;;;;;;;;;;;;:36;;;;56581:7;56565:32;;56574:5;56565:32;;;56590:6;56565:32;;;;;;:::i;:::-;;;;;;;;56259:346;;;:::o;56896:407::-;56997:24;57024:25;57034:5;57041:7;57024:9;:25::i;:::-;56997:52;;57084:17;57064:16;:37;57060:236;;57146:6;57126:16;:26;;57118:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57222:51;57231:5;57238:7;57266:6;57247:16;:25;57222:8;:51::i;:::-;57060:236;56986:317;56896:407;;;:::o;60440:915::-;60581:1;60572:6;:10;60564:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;60638:1;60622:18;;:4;:18;;;;60614:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60715:1;60701:16;;:2;:16;;;;60693:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;60781:13;;;;;;;;;;;60773:21;;:4;:21;;;;:44;;;;;60804:13;;;;;;;;;;;60798:19;;:2;:19;;;;60773:44;60770:127;;;60834:30;60847:4;60853:2;60857:6;60834:12;:30::i;:::-;60879:7;;60770:127;60918:13;;;;;;;;;;;60910:21;;:4;:21;;;60907:326;;;60967:1;60956:10;;:12;60948:33;;;;;;;;;;;;:::i;:::-;;;;;;;;;61005:14;61016:2;61005:10;:14::i;:::-;61004:15;:29;;;;61024:9;;;;;;;;;;;61023:10;61004:29;60996:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;61070:63;61086:4;61100:6;61109:23;61127:4;61109:13;61120:1;61109:6;:10;;:13;;;;:::i;:::-;:17;;:23;;;;:::i;:::-;61070:15;:63::i;:::-;61148:52;61164:4;61170:2;61174:25;61194:4;61174:15;61185:3;61174:6;:10;;:15;;;;:::i;:::-;:19;;:25;;;;:::i;:::-;61148:15;:52::i;:::-;61215:7;;60907:326;61252:13;;;;;;;;;;;61246:19;;:2;:19;;;61243:105;;;61282:33;61298:4;61304:2;61308:6;61282:15;:33::i;:::-;61330:7;;61243:105;60440:915;;;;:::o;38855:238::-;38939:22;38947:4;38953:7;38939;:22::i;:::-;38934:152;;39010:4;38978:6;:12;38985:4;38978:12;;;;;;;;;;;:20;;:29;38999:7;38978:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;39061:12;:10;:12::i;:::-;39034:40;;39052:7;39034:40;;39046:4;39034:40;;;;;;;;;;38934:152;38855:238;;:::o;39273:239::-;39357:22;39365:4;39371:7;39357;:22::i;:::-;39353:152;;;39428:5;39396:6;:12;39403:4;39396:12;;;;;;;;;;;:20;;:29;39417:7;39396:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;39480:12;:10;:12::i;:::-;39453:40;;39471:7;39453:40;;39465:4;39453:40;;;;;;;;;;39353:152;39273:239;;:::o;40919:132::-;40994:12;:10;:12::i;:::-;40983:23;;:7;:5;:7::i;:::-;:23;;;40975:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40919:132::o;42014:191::-;42088:16;42107:6;;;;;;;;;;;42088:25;;42133:8;42124:6;;:17;;;;;;;;;;;;;;;;;;42188:8;42157:40;;42178:8;42157:40;;;;;;;;;;;;42077:128;42014:191;:::o;63032:180::-;63096:4;63198:6;63152:15;63168:16;63187:5;63135:58;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;63125:69;;;;;;63120:75;;:84;;;;:::i;:::-;63113:91;;63032:180;;;;:::o;61877:861::-;61820:4;61811:6;;:13;;;;;;;;;;;;;;;;;;61973:21:::1;62011:1;61997:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61973:40;;62042:4;;;;;;;;;;;62024;62029:1;62024:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;::::0;::::1;62076:4;62058;62063:1;62058:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;::::0;::::1;62092:15;62117:4;;;;;;;;;;;62110:22;;;62141:4;62110:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62092:55;;62174:1;62161:11;:14;62158:39;;;62190:7;62176:21;;62158:39;62228:7;62213:11;:22;62210:519;;62252:48;62303:357;;;;;;;;62370:4;;;;;;;;;;;62303:357;;;;;;62408:4;62303:357;;;;;;62433:4;62303:357;;;;;;62490:2;62303:357;;;;;;62536:3;62518:15;:21;;;;:::i;:::-;62303:357;;;;62564:11;62303:357;;;;62608:1;62303:357;;;;62643:1;62303:357;;;;::::0;62252:408:::1;;62677:15;;;;;;;;;;;:32;;;62710:6;62677:40;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;62237:492;62210:519;61962:776;;61856:5:::0;61847:6;;:14;;;;;;;;;;;;;;;;;;61877:861;;;:::o;35024:460::-;35113:22;35121:4;35127:7;35113;:22::i;:::-;35108:369;;35285:28;35305:7;35285:19;:28::i;:::-;35378:38;35406:4;35398:13;;35413:2;35378:19;:38::i;:::-;35198:237;;;;;;;;;:::i;:::-;;;;;;;;;;;;;35152:313;;;;;;;;;;;:::i;:::-;;;;;;;;35108:369;35024:460;;:::o;61568:178::-;61695:43;61711:6;61719:9;61730:7;61695:15;:43::i;:::-;61568:178;;;:::o;61363:189::-;61419:4;61436:12;61503:4;61491:17;61483:25;;61543:1;61536:4;:8;61529:15;;;61363:189;;;:::o;27008:98::-;27066:7;27097:1;27093;:5;;;;:::i;:::-;27086:12;;27008:98;;;;:::o;27407:::-;27465:7;27496:1;27492;:5;;;;:::i;:::-;27485:12;;27407:98;;;;:::o;53386:628::-;53477:38;53498:4;53504:2;53508:6;53477:20;:38::i;:::-;53528:19;53550:9;:15;53560:4;53550:15;;;;;;;;;;;;;;;;53528:37;;53599:6;53584:11;:21;;53576:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;53708:6;53694:11;:20;53676:9;:15;53686:4;53676:15;;;;;;;;;;;;;;;:38;;;;53899:6;53882:9;:13;53892:2;53882:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;53945:2;53930:26;;53939:4;53930:26;;;53949:6;53930:26;;;;;;:::i;:::-;;;;;;;;53969:37;53989:4;53995:2;53999:6;53969:19;:37::i;:::-;53464:550;53386:628;;;:::o;20071:151::-;20129:13;20162:52;20190:4;20174:22;;18034:2;20162:52;;:11;:52::i;:::-;20155:59;;20071:151;;;:::o;19467:447::-;19542:13;19568:19;19613:1;19604:6;19600:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;19590:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19568:47;;19626:15;:6;19633:1;19626:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;19652;:6;19659:1;19652:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;19683:9;19708:1;19699:6;19695:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;19683:26;;19678:131;19715:1;19711;:5;19678:131;;;19750:8;19767:3;19759:5;:11;19750:21;;;;;;;:::i;:::-;;;;;19738:6;19745:1;19738:9;;;;;;;;:::i;:::-;;;;;:33;;;;;;;;;;;19796:1;19786:11;;;;;19718:3;;;;:::i;:::-;;;19678:131;;;;19836:1;19827:5;:10;19819:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;19899:6;19885:21;;;19467:447;;;;:::o;57903:91::-;;;;:::o;58598:90::-;;;;:::o;-1:-1:-1:-;;;;;;;;:::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:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:126::-;2945:7;2985:42;2978:5;2974:54;2963:65;;2908:126;;;:::o;3040:96::-;3077:7;3106:24;3124:5;3106:24;:::i;:::-;3095:35;;3040:96;;;:::o;3142:122::-;3215:24;3233:5;3215:24;:::i;:::-;3208:5;3205:35;3195:63;;3254:1;3251;3244:12;3195:63;3142:122;:::o;3270:139::-;3316:5;3354:6;3341:20;3332:29;;3370:33;3397:5;3370:33;:::i;:::-;3270:139;;;;:::o;3415:77::-;3452:7;3481:5;3470:16;;3415:77;;;:::o;3498:122::-;3571:24;3589:5;3571:24;:::i;:::-;3564:5;3561:35;3551:63;;3610:1;3607;3600:12;3551:63;3498:122;:::o;3626:139::-;3672:5;3710:6;3697:20;3688:29;;3726:33;3753:5;3726:33;:::i;:::-;3626:139;;;;:::o;3771:474::-;3839:6;3847;3896:2;3884:9;3875:7;3871:23;3867:32;3864:119;;;3902:79;;:::i;:::-;3864:119;4022:1;4047:53;4092:7;4083:6;4072:9;4068:22;4047:53;:::i;:::-;4037:63;;3993:117;4149:2;4175:53;4220:7;4211:6;4200:9;4196:22;4175:53;:::i;:::-;4165:63;;4120:118;3771:474;;;;;:::o;4251:118::-;4338:24;4356:5;4338:24;:::i;:::-;4333:3;4326:37;4251:118;;:::o;4375:222::-;4468:4;4506:2;4495:9;4491:18;4483:26;;4519:71;4587:1;4576:9;4572:17;4563:6;4519:71;:::i;:::-;4375:222;;;;:::o;4603:116::-;4673:21;4688:5;4673:21;:::i;:::-;4666:5;4663:32;4653:60;;4709:1;4706;4699:12;4653:60;4603:116;:::o;4725:133::-;4768:5;4806:6;4793:20;4784:29;;4822:30;4846:5;4822:30;:::i;:::-;4725:133;;;;:::o;4864:323::-;4920:6;4969:2;4957:9;4948:7;4944:23;4940:32;4937:119;;;4975:79;;:::i;:::-;4937:119;5095:1;5120:50;5162:7;5153:6;5142:9;5138:22;5120:50;:::i;:::-;5110:60;;5066:114;4864:323;;;;:::o;5193:619::-;5270:6;5278;5286;5335:2;5323:9;5314:7;5310:23;5306:32;5303:119;;;5341:79;;:::i;:::-;5303:119;5461:1;5486:53;5531:7;5522:6;5511:9;5507:22;5486:53;:::i;:::-;5476:63;;5432:117;5588:2;5614:53;5659:7;5650:6;5639:9;5635:22;5614:53;:::i;:::-;5604:63;;5559:118;5716:2;5742:53;5787:7;5778:6;5767:9;5763:22;5742:53;:::i;:::-;5732:63;;5687:118;5193:619;;;;;:::o;5818:77::-;5855:7;5884:5;5873:16;;5818:77;;;:::o;5901:122::-;5974:24;5992:5;5974:24;:::i;:::-;5967:5;5964:35;5954:63;;6013:1;6010;6003:12;5954:63;5901:122;:::o;6029:139::-;6075:5;6113:6;6100:20;6091:29;;6129:33;6156:5;6129:33;:::i;:::-;6029:139;;;;:::o;6174:329::-;6233:6;6282:2;6270:9;6261:7;6257:23;6253:32;6250:119;;;6288:79;;:::i;:::-;6250:119;6408:1;6433:53;6478:7;6469:6;6458:9;6454:22;6433:53;:::i;:::-;6423:63;;6379:117;6174:329;;;;:::o;6509:118::-;6596:24;6614:5;6596:24;:::i;:::-;6591:3;6584:37;6509:118;;:::o;6633:222::-;6726:4;6764:2;6753:9;6749:18;6741:26;;6777:71;6845:1;6834:9;6830:17;6821:6;6777:71;:::i;:::-;6633:222;;;;:::o;6861:474::-;6929:6;6937;6986:2;6974:9;6965:7;6961:23;6957:32;6954:119;;;6992:79;;:::i;:::-;6954:119;7112:1;7137:53;7182:7;7173:6;7162:9;7158:22;7137:53;:::i;:::-;7127:63;;7083:117;7239:2;7265:53;7310:7;7301:6;7290:9;7286:22;7265:53;:::i;:::-;7255:63;;7210:118;6861:474;;;;;:::o;7341:86::-;7376:7;7416:4;7409:5;7405:16;7394:27;;7341:86;;;:::o;7433:112::-;7516:22;7532:5;7516:22;:::i;:::-;7511:3;7504:35;7433:112;;:::o;7551:214::-;7640:4;7678:2;7667:9;7663:18;7655:26;;7691:67;7755:1;7744:9;7740:17;7731:6;7691:67;:::i;:::-;7551:214;;;;:::o;7771:118::-;7858:24;7876:5;7858:24;:::i;:::-;7853:3;7846:37;7771:118;;:::o;7895:222::-;7988:4;8026:2;8015:9;8011:18;8003:26;;8039:71;8107:1;8096:9;8092:17;8083:6;8039:71;:::i;:::-;7895:222;;;;:::o;8123:329::-;8182:6;8231:2;8219:9;8210:7;8206:23;8202:32;8199:119;;;8237:79;;:::i;:::-;8199:119;8357:1;8382:53;8427:7;8418:6;8407:9;8403:22;8382:53;:::i;:::-;8372:63;;8328:117;8123:329;;;;:::o;8458:117::-;8567:1;8564;8557:12;8581:117;8690:1;8687;8680:12;8704:117;8813:1;8810;8803:12;8844:568;8917:8;8927:6;8977:3;8970:4;8962:6;8958:17;8954:27;8944:122;;8985:79;;:::i;:::-;8944:122;9098:6;9085:20;9075:30;;9128:18;9120:6;9117:30;9114:117;;;9150:79;;:::i;:::-;9114:117;9264:4;9256:6;9252:17;9240:29;;9318:3;9310:4;9302:6;9298:17;9288:8;9284:32;9281:41;9278:128;;;9325:79;;:::i;:::-;9278:128;8844:568;;;;;:::o;9418:559::-;9504:6;9512;9561:2;9549:9;9540:7;9536:23;9532:32;9529:119;;;9567:79;;:::i;:::-;9529:119;9715:1;9704:9;9700:17;9687:31;9745:18;9737:6;9734:30;9731:117;;;9767:79;;:::i;:::-;9731:117;9880:80;9952:7;9943:6;9932:9;9928:22;9880:80;:::i;:::-;9862:98;;;;9658:312;9418:559;;;;;:::o;9983:60::-;10011:3;10032:5;10025:12;;9983:60;;;:::o;10049:142::-;10099:9;10132:53;10150:34;10159:24;10177:5;10159:24;:::i;:::-;10150:34;:::i;:::-;10132:53;:::i;:::-;10119:66;;10049:142;;;:::o;10197:126::-;10247:9;10280:37;10311:5;10280:37;:::i;:::-;10267:50;;10197:126;;;:::o;10329:151::-;10404:9;10437:37;10468:5;10437:37;:::i;:::-;10424:50;;10329:151;;;:::o;10486:181::-;10598:62;10654:5;10598:62;:::i;:::-;10593:3;10586:75;10486:181;;:::o;10673:272::-;10791:4;10829:2;10818:9;10814:18;10806:26;;10842:96;10935:1;10924:9;10920:17;10911:6;10842:96;:::i;:::-;10673:272;;;;:::o;10951:474::-;11019:6;11027;11076:2;11064:9;11055:7;11051:23;11047:32;11044:119;;;11082:79;;:::i;:::-;11044:119;11202:1;11227:53;11272:7;11263:6;11252:9;11248:22;11227:53;:::i;:::-;11217:63;;11173:117;11329:2;11355:53;11400:7;11391:6;11380:9;11376:22;11355:53;:::i;:::-;11345:63;;11300:118;10951:474;;;;;:::o;11431:91::-;11467:7;11507:8;11500:5;11496:20;11485:31;;11431:91;;;:::o;11528:120::-;11600:23;11617:5;11600:23;:::i;:::-;11593:5;11590:34;11580:62;;11638:1;11635;11628:12;11580:62;11528:120;:::o;11654:137::-;11699:5;11737:6;11724:20;11715:29;;11753:32;11779:5;11753:32;:::i;:::-;11654:137;;;;:::o;11797:617::-;11873:6;11881;11889;11938:2;11926:9;11917:7;11913:23;11909:32;11906:119;;;11944:79;;:::i;:::-;11906:119;12064:1;12089:53;12134:7;12125:6;12114:9;12110:22;12089:53;:::i;:::-;12079:63;;12035:117;12191:2;12217:53;12262:7;12253:6;12242:9;12238:22;12217:53;:::i;:::-;12207:63;;12162:118;12319:2;12345:52;12389:7;12380:6;12369:9;12365:22;12345:52;:::i;:::-;12335:62;;12290:117;11797:617;;;;;:::o;12420:180::-;12468:77;12465:1;12458:88;12565:4;12562:1;12555:15;12589:4;12586:1;12579:15;12606:320;12650:6;12687:1;12681:4;12677:12;12667:22;;12734:1;12728:4;12724:12;12755:18;12745:81;;12811:4;12803:6;12799:17;12789:27;;12745:81;12873:2;12865:6;12862:14;12842:18;12839:38;12836:84;;;12892:18;;:::i;:::-;12836:84;12657:269;12606:320;;;:::o;12932:234::-;13072:34;13068:1;13060:6;13056:14;13049:58;13141:17;13136:2;13128:6;13124:15;13117:42;12932:234;:::o;13172:366::-;13314:3;13335:67;13399:2;13394:3;13335:67;:::i;:::-;13328:74;;13411:93;13500:3;13411:93;:::i;:::-;13529:2;13524:3;13520:12;13513:19;;13172:366;;;:::o;13544:419::-;13710:4;13748:2;13737:9;13733:18;13725:26;;13797:9;13791:4;13787:20;13783:1;13772:9;13768:17;13761:47;13825:131;13951:4;13825:131;:::i;:::-;13817:139;;13544:419;;;:::o;13969:180::-;14017:77;14014:1;14007:88;14114:4;14111:1;14104:15;14138:4;14135:1;14128:15;14155:305;14195:3;14214:20;14232:1;14214:20;:::i;:::-;14209:25;;14248:20;14266:1;14248:20;:::i;:::-;14243:25;;14402:1;14334:66;14330:74;14327:1;14324:81;14321:107;;;14408:18;;:::i;:::-;14321:107;14452:1;14449;14445:9;14438:16;;14155:305;;;;:::o;14466:143::-;14523:5;14554:6;14548:13;14539:22;;14570:33;14597:5;14570:33;:::i;:::-;14466:143;;;;:::o;14615:351::-;14685:6;14734:2;14722:9;14713:7;14709:23;14705:32;14702:119;;;14740:79;;:::i;:::-;14702:119;14860:1;14885:64;14941:7;14932:6;14921:9;14917:22;14885:64;:::i;:::-;14875:74;;14831:128;14615:351;;;;:::o;14972:332::-;15093:4;15131:2;15120:9;15116:18;15108:26;;15144:71;15212:1;15201:9;15197:17;15188:6;15144:71;:::i;:::-;15225:72;15293:2;15282:9;15278:18;15269:6;15225:72;:::i;:::-;14972:332;;;;;:::o;15310:137::-;15364:5;15395:6;15389:13;15380:22;;15411:30;15435:5;15411:30;:::i;:::-;15310:137;;;;:::o;15453:345::-;15520:6;15569:2;15557:9;15548:7;15544:23;15540:32;15537:119;;;15575:79;;:::i;:::-;15537:119;15695:1;15720:61;15773:7;15764:6;15753:9;15749:22;15720:61;:::i;:::-;15710:71;;15666:125;15453:345;;;;:::o;15804:180::-;15852:77;15849:1;15842:88;15949:4;15946:1;15939:15;15973:4;15970:1;15963:15;15990:348;16030:7;16053:20;16071:1;16053:20;:::i;:::-;16048:25;;16087:20;16105:1;16087:20;:::i;:::-;16082:25;;16275:1;16207:66;16203:74;16200:1;16197:81;16192:1;16185:9;16178:17;16174:105;16171:131;;;16282:18;;:::i;:::-;16171:131;16330:1;16327;16323:9;16312:20;;15990:348;;;;:::o;16344:233::-;16383:3;16406:24;16424:5;16406:24;:::i;:::-;16397:33;;16452:66;16445:5;16442:77;16439:103;;;16522:18;;:::i;:::-;16439:103;16569:1;16562:5;16558:13;16551:20;;16344:233;;;:::o;16583:224::-;16723:34;16719:1;16711:6;16707:14;16700:58;16792:7;16787:2;16779:6;16775:15;16768:32;16583:224;:::o;16813:366::-;16955:3;16976:67;17040:2;17035:3;16976:67;:::i;:::-;16969:74;;17052:93;17141:3;17052:93;:::i;:::-;17170:2;17165:3;17161:12;17154:19;;16813:366;;;:::o;17185:419::-;17351:4;17389:2;17378:9;17374:18;17366:26;;17438:9;17432:4;17428:20;17424:1;17413:9;17409:17;17402:47;17466:131;17592:4;17466:131;:::i;:::-;17458:139;;17185:419;;;:::o;17610:143::-;17667:5;17698:6;17692:13;17683:22;;17714:33;17741:5;17714:33;:::i;:::-;17610:143;;;;:::o;17759:351::-;17829:6;17878:2;17866:9;17857:7;17853:23;17849:32;17846:119;;;17884:79;;:::i;:::-;17846:119;18004:1;18029:64;18085:7;18076:6;18065:9;18061:22;18029:64;:::i;:::-;18019:74;;17975:128;17759:351;;;;:::o;18116:115::-;18201:23;18218:5;18201:23;:::i;:::-;18196:3;18189:36;18116:115;;:::o;18237:438::-;18384:4;18422:2;18411:9;18407:18;18399:26;;18435:71;18503:1;18492:9;18488:17;18479:6;18435:71;:::i;:::-;18516:72;18584:2;18573:9;18569:18;18560:6;18516:72;:::i;:::-;18598:70;18664:2;18653:9;18649:18;18640:6;18598:70;:::i;:::-;18237:438;;;;;;:::o;18681:225::-;18821:34;18817:1;18809:6;18805:14;18798:58;18890:8;18885:2;18877:6;18873:15;18866:33;18681:225;:::o;18912:366::-;19054:3;19075:67;19139:2;19134:3;19075:67;:::i;:::-;19068:74;;19151:93;19240:3;19151:93;:::i;:::-;19269:2;19264:3;19260:12;19253:19;;18912:366;;;:::o;19284:419::-;19450:4;19488:2;19477:9;19473:18;19465:26;;19537:9;19531:4;19527:20;19523:1;19512:9;19508:17;19501:47;19565:131;19691:4;19565:131;:::i;:::-;19557:139;;19284:419;;;:::o;19709:223::-;19849:34;19845:1;19837:6;19833:14;19826:58;19918:6;19913:2;19905:6;19901:15;19894:31;19709:223;:::o;19938:366::-;20080:3;20101:67;20165:2;20160:3;20101:67;:::i;:::-;20094:74;;20177:93;20266:3;20177:93;:::i;:::-;20295:2;20290:3;20286:12;20279:19;;19938:366;;;:::o;20310:419::-;20476:4;20514:2;20503:9;20499:18;20491:26;;20563:9;20557:4;20553:20;20549:1;20538:9;20534:17;20527:47;20591:131;20717:4;20591:131;:::i;:::-;20583:139;;20310:419;;;:::o;20735:221::-;20875:34;20871:1;20863:6;20859:14;20852:58;20944:4;20939:2;20931:6;20927:15;20920:29;20735:221;:::o;20962:366::-;21104:3;21125:67;21189:2;21184:3;21125:67;:::i;:::-;21118:74;;21201:93;21290:3;21201:93;:::i;:::-;21319:2;21314:3;21310:12;21303:19;;20962:366;;;:::o;21334:419::-;21500:4;21538:2;21527:9;21523:18;21515:26;;21587:9;21581:4;21577:20;21573:1;21562:9;21558:17;21551:47;21615:131;21741:4;21615:131;:::i;:::-;21607:139;;21334:419;;;:::o;21759:179::-;21899:31;21895:1;21887:6;21883:14;21876:55;21759:179;:::o;21944:366::-;22086:3;22107:67;22171:2;22166:3;22107:67;:::i;:::-;22100:74;;22183:93;22272:3;22183:93;:::i;:::-;22301:2;22296:3;22292:12;22285:19;;21944:366;;;:::o;22316:419::-;22482:4;22520:2;22509:9;22505:18;22497:26;;22569:9;22563:4;22559:20;22555:1;22544:9;22540:17;22533:47;22597:131;22723:4;22597:131;:::i;:::-;22589:139;;22316:419;;;:::o;22741:166::-;22881:18;22877:1;22869:6;22865:14;22858:42;22741:166;:::o;22913:366::-;23055:3;23076:67;23140:2;23135:3;23076:67;:::i;:::-;23069:74;;23152:93;23241:3;23152:93;:::i;:::-;23270:2;23265:3;23261:12;23254:19;;22913:366;;;:::o;23285:419::-;23451:4;23489:2;23478:9;23474:18;23466:26;;23538:9;23532:4;23528:20;23524:1;23513:9;23509:17;23502:47;23566:131;23692:4;23566:131;:::i;:::-;23558:139;;23285:419;;;:::o;23710:224::-;23850:34;23846:1;23838:6;23834:14;23827:58;23919:7;23914:2;23906:6;23902:15;23895:32;23710:224;:::o;23940:366::-;24082:3;24103:67;24167:2;24162:3;24103:67;:::i;:::-;24096:74;;24179:93;24268:3;24179:93;:::i;:::-;24297:2;24292:3;24288:12;24281:19;;23940:366;;;:::o;24312:419::-;24478:4;24516:2;24505:9;24501:18;24493:26;;24565:9;24559:4;24555:20;24551:1;24540:9;24536:17;24529:47;24593:131;24719:4;24593:131;:::i;:::-;24585:139;;24312:419;;;:::o;24737:222::-;24877:34;24873:1;24865:6;24861:14;24854:58;24946:5;24941:2;24933:6;24929:15;24922:30;24737:222;:::o;24965:366::-;25107:3;25128:67;25192:2;25187:3;25128:67;:::i;:::-;25121:74;;25204:93;25293:3;25204:93;:::i;:::-;25322:2;25317:3;25313:12;25306:19;;24965:366;;;:::o;25337:419::-;25503:4;25541:2;25530:9;25526:18;25518:26;;25590:9;25584:4;25580:20;25576:1;25565:9;25561:17;25554:47;25618:131;25744:4;25618:131;:::i;:::-;25610:139;;25337:419;;;:::o;25762:158::-;25902:10;25898:1;25890:6;25886:14;25879:34;25762:158;:::o;25926:365::-;26068:3;26089:66;26153:1;26148:3;26089:66;:::i;:::-;26082:73;;26164:93;26253:3;26164:93;:::i;:::-;26282:2;26277:3;26273:12;26266:19;;25926:365;;;:::o;26297:419::-;26463:4;26501:2;26490:9;26486:18;26478:26;;26550:9;26544:4;26540:20;26536:1;26525:9;26521:17;26514:47;26578:131;26704:4;26578:131;:::i;:::-;26570:139;;26297:419;;;:::o;26722:167::-;26862:19;26858:1;26850:6;26846:14;26839:43;26722:167;:::o;26895:366::-;27037:3;27058:67;27122:2;27117:3;27058:67;:::i;:::-;27051:74;;27134:93;27223:3;27134:93;:::i;:::-;27252:2;27247:3;27243:12;27236:19;;26895:366;;;:::o;27267:419::-;27433:4;27471:2;27460:9;27456:18;27448:26;;27520:9;27514:4;27510:20;27506:1;27495:9;27491:17;27484:47;27548:131;27674:4;27548:131;:::i;:::-;27540:139;;27267:419;;;:::o;27692:182::-;27832:34;27828:1;27820:6;27816:14;27809:58;27692:182;:::o;27880:366::-;28022:3;28043:67;28107:2;28102:3;28043:67;:::i;:::-;28036:74;;28119:93;28208:3;28119:93;:::i;:::-;28237:2;28232:3;28228:12;28221:19;;27880:366;;;:::o;28252:419::-;28418:4;28456:2;28445:9;28441:18;28433:26;;28505:9;28499:4;28495:20;28491:1;28480:9;28476:17;28469:47;28533:131;28659:4;28533:131;:::i;:::-;28525:139;;28252:419;;;:::o;28677:79::-;28716:7;28745:5;28734:16;;28677:79;;;:::o;28762:157::-;28867:45;28887:24;28905:5;28887:24;:::i;:::-;28867:45;:::i;:::-;28862:3;28855:58;28762:157;;:::o;28925:94::-;28958:8;29006:5;29002:2;28998:14;28977:35;;28925:94;;;:::o;29025:::-;29064:7;29093:20;29107:5;29093:20;:::i;:::-;29082:31;;29025:94;;;:::o;29125:100::-;29164:7;29193:26;29213:5;29193:26;:::i;:::-;29182:37;;29125:100;;;:::o;29231:157::-;29336:45;29356:24;29374:5;29356:24;:::i;:::-;29336:45;:::i;:::-;29331:3;29324:58;29231:157;;:::o;29394:538::-;29562:3;29577:75;29648:3;29639:6;29577:75;:::i;:::-;29677:2;29672:3;29668:12;29661:19;;29690:75;29761:3;29752:6;29690:75;:::i;:::-;29790:2;29785:3;29781:12;29774:19;;29803:75;29874:3;29865:6;29803:75;:::i;:::-;29903:2;29898:3;29894:12;29887:19;;29923:3;29916:10;;29394:538;;;;;;:::o;29938:180::-;29986:77;29983:1;29976:88;30083:4;30080:1;30073:15;30107:4;30104:1;30097:15;30124:176;30156:1;30173:20;30191:1;30173:20;:::i;:::-;30168:25;;30207:20;30225:1;30207:20;:::i;:::-;30202:25;;30246:1;30236:35;;30251:18;;:::i;:::-;30236:35;30292:1;30289;30285:9;30280:14;;30124:176;;;;:::o;30306:180::-;30354:77;30351:1;30344:88;30451:4;30448:1;30441:15;30475:4;30472:1;30465:15;30492:108;30569:24;30587:5;30569:24;:::i;:::-;30564:3;30557:37;30492:108;;:::o;30606:105::-;30681:23;30698:5;30681:23;:::i;:::-;30676:3;30669:36;30606:105;;:::o;30717:108::-;30794:24;30812:5;30794:24;:::i;:::-;30789:3;30782:37;30717:108;;:::o;30831:::-;30908:24;30926:5;30908:24;:::i;:::-;30903:3;30896:37;30831:108;;:::o;31039:1621::-;31212:6;31207:3;31203:16;31304:4;31297:5;31293:16;31287:23;31323:63;31380:4;31375:3;31371:14;31357:12;31323:63;:::i;:::-;31229:167;31482:4;31475:5;31471:16;31465:23;31501:63;31558:4;31553:3;31549:14;31535:12;31501:63;:::i;:::-;31406:168;31655:4;31648:5;31644:16;31638:23;31674:61;31729:4;31724:3;31720:14;31706:12;31674:61;:::i;:::-;31584:161;31832:4;31825:5;31821:16;31815:23;31851:63;31908:4;31903:3;31899:14;31885:12;31851:63;:::i;:::-;31755:169;32010:4;32003:5;31999:16;31993:23;32029:63;32086:4;32081:3;32077:14;32063:12;32029:63;:::i;:::-;31934:168;32188:4;32181:5;32177:16;32171:23;32207:63;32264:4;32259:3;32255:14;32241:12;32207:63;:::i;:::-;32112:168;32374:4;32367:5;32363:16;32357:23;32393:63;32450:4;32445:3;32441:14;32427:12;32393:63;:::i;:::-;32290:176;32561:4;32554:5;32550:16;32544:23;32580:63;32637:4;32632:3;32628:14;32614:12;32580:63;:::i;:::-;32476:177;31181:1479;31039:1621;;:::o;32666:375::-;32835:4;32873:3;32862:9;32858:19;32850:27;;32887:147;33031:1;33020:9;33016:17;33007:6;32887:147;:::i;:::-;32666:375;;;;:::o;33047:148::-;33149:11;33186:3;33171:18;;33047:148;;;;:::o;33201:173::-;33341:25;33337:1;33329:6;33325:14;33318:49;33201:173;:::o;33380:402::-;33540:3;33561:85;33643:2;33638:3;33561:85;:::i;:::-;33554:92;;33655:93;33744:3;33655:93;:::i;:::-;33773:2;33768:3;33764:12;33757:19;;33380:402;;;:::o;33788:377::-;33894:3;33922:39;33955:5;33922:39;:::i;:::-;33977:89;34059:6;34054:3;33977:89;:::i;:::-;33970:96;;34075:52;34120:6;34115:3;34108:4;34101:5;34097:16;34075:52;:::i;:::-;34152:6;34147:3;34143:16;34136:23;;33898:267;33788:377;;;;:::o;34171:167::-;34311:19;34307:1;34299:6;34295:14;34288:43;34171:167;:::o;34344:402::-;34504:3;34525:85;34607:2;34602:3;34525:85;:::i;:::-;34518:92;;34619:93;34708:3;34619:93;:::i;:::-;34737:2;34732:3;34728:12;34721:19;;34344:402;;;:::o;34752:967::-;35134:3;35156:148;35300:3;35156:148;:::i;:::-;35149:155;;35321:95;35412:3;35403:6;35321:95;:::i;:::-;35314:102;;35433:148;35577:3;35433:148;:::i;:::-;35426:155;;35598:95;35689:3;35680:6;35598:95;:::i;:::-;35591:102;;35710:3;35703:10;;34752:967;;;;;:::o;35725:185::-;35765:1;35782:20;35800:1;35782:20;:::i;:::-;35777:25;;35816:20;35834:1;35816:20;:::i;:::-;35811:25;;35855:1;35845:35;;35860:18;;:::i;:::-;35845:35;35902:1;35899;35895:9;35890:14;;35725:185;;;;:::o;35916:225::-;36056:34;36052:1;36044:6;36040:14;36033:58;36125:8;36120:2;36112:6;36108:15;36101:33;35916:225;:::o;36147:366::-;36289:3;36310:67;36374:2;36369:3;36310:67;:::i;:::-;36303:74;;36386:93;36475:3;36386:93;:::i;:::-;36504:2;36499:3;36495:12;36488:19;;36147:366;;;:::o;36519:419::-;36685:4;36723:2;36712:9;36708:18;36700:26;;36772:9;36766:4;36762:20;36758:1;36747:9;36743:17;36736:47;36800:131;36926:4;36800:131;:::i;:::-;36792:139;;36519:419;;;:::o;36944:171::-;36983:3;37006:24;37024:5;37006:24;:::i;:::-;36997:33;;37052:4;37045:5;37042:15;37039:41;;;37060:18;;:::i;:::-;37039:41;37107:1;37100:5;37096:13;37089:20;;36944:171;;;:::o;37121:182::-;37261:34;37257:1;37249:6;37245:14;37238:58;37121:182;:::o;37309:366::-;37451:3;37472:67;37536:2;37531:3;37472:67;:::i;:::-;37465:74;;37548:93;37637:3;37548:93;:::i;:::-;37666:2;37661:3;37657:12;37650:19;;37309:366;;;:::o;37681:419::-;37847:4;37885:2;37874:9;37870:18;37862:26;;37934:9;37928:4;37924:20;37920:1;37909:9;37905:17;37898:47;37962:131;38088:4;37962:131;:::i;:::-;37954:139;;37681:419;;;:::o

Swarm Source

ipfs://7b2696abc5f99a94a5c2d7fdeeb580eb49c798cc3f52db218d32c8f2d063d23c
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.