Overview
APE Balance
APE Value
$0.00More Info
Private Name Tags
ContractCreator
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Source Code Verified (Exact Match)
Contract Name:
DegenSlot
Compiler Version
v0.8.28+commit.7893614a
Contract Source Code (Solidity)
/** *Submitted for verification at apescan.io on 2025-02-20 */ // Sources flattened with hardhat v2.22.18 https://hardhat.org // SPDX-License-Identifier: MIT AND UNLICENSED // File @openzeppelin/contracts-upgradeable/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // File @openzeppelin/contracts-upgradeable/proxy/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ``` * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. * * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a * constructor. * * Emits an {Initialized} event. */ modifier initializer() { bool isTopLevelCall = !_initializing; require( (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1), "Initializable: contract is already initialized" ); _initialized = 1; if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * A reinitializer may be used after the original initialization step. This is essential to configure modules that * are added through upgrades and that require initialization. * * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer` * cannot be nested. If one is invoked in the context of another, execution will revert. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. * * WARNING: setting the version to 255 will prevent any future reinitialization. * * Emits an {Initialized} event. */ modifier reinitializer(uint8 version) { require(!_initializing && _initialized < version, "Initializable: contract is already initialized"); _initialized = version; _initializing = true; _; _initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. * * Emits an {Initialized} event the first time it is successfully executed. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); if (_initialized < type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } /** * @dev Internal function that returns the initialized version. Returns `_initialized` */ function _getInitializedVersion() internal view returns (uint8) { return _initialized; } /** * @dev Internal function that returns the initialized version. Returns `_initializing` */ function _isInitializing() internal view returns (bool) { return _initializing; } } // File @openzeppelin/contracts-upgradeable/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // 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 ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/access/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal onlyInitializing { __Ownable_init_unchained(); } function __Ownable_init_unchained() internal onlyInitializing { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; } // File @openzeppelin/contracts-upgradeable/interfaces/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol) pragma solidity ^0.8.0; /** * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified * proxy whose upgrades are fully controlled by the current implementation. */ interface IERC1822ProxiableUpgradeable { /** * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation * address. * * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this * function revert if invoked through a proxy. */ function proxiableUUID() external view returns (bytes32); } // File @openzeppelin/contracts-upgradeable/proxy/beacon/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol) pragma solidity ^0.8.0; /** * @dev This is the interface that {BeaconProxy} expects of its beacon. */ interface IBeaconUpgradeable { /** * @dev Must return an address that can be used as a delegate call target. * * {BeaconProxy} will check that this address is a contract. */ function implementation() external view returns (address); } // File @openzeppelin/contracts-upgradeable/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/StorageSlot.sol) pragma solidity ^0.8.0; /** * @dev Library for reading and writing primitive types to specific storage slots. * * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts. * This library helps with reading and writing to such slots without the need for inline assembly. * * The functions in this library return Slot structs that contain a `value` member that can be used to read or write. * * Example usage to set ERC1967 implementation slot: * ``` * contract ERC1967 { * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; * * function _getImplementation() internal view returns (address) { * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value; * } * * function _setImplementation(address newImplementation) internal { * require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract"); * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; * } * } * ``` * * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._ */ library StorageSlotUpgradeable { struct AddressSlot { address value; } struct BooleanSlot { bool value; } struct Bytes32Slot { bytes32 value; } struct Uint256Slot { uint256 value; } /** * @dev Returns an `AddressSlot` with member `value` located at `slot`. */ function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `BooleanSlot` with member `value` located at `slot`. */ function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `Bytes32Slot` with member `value` located at `slot`. */ function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `Uint256Slot` with member `value` located at `slot`. */ function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } } // File @openzeppelin/contracts-upgradeable/proxy/ERC1967/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (proxy/ERC1967/ERC1967Upgrade.sol) pragma solidity ^0.8.2; /** * @dev This abstract contract provides getters and event emitting update functions for * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots. * * _Available since v4.1._ * * @custom:oz-upgrades-unsafe-allow delegatecall */ abstract contract ERC1967UpgradeUpgradeable is Initializable { function __ERC1967Upgrade_init() internal onlyInitializing { } function __ERC1967Upgrade_init_unchained() internal onlyInitializing { } // This is the keccak-256 hash of "eip1967.proxy.rollback" subtracted by 1 bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143; /** * @dev Storage slot with the address of the current implementation. * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is * validated in the constructor. */ bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; /** * @dev Emitted when the implementation is upgraded. */ event Upgraded(address indexed implementation); /** * @dev Returns the current implementation address. */ function _getImplementation() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value; } /** * @dev Stores a new address in the EIP1967 implementation slot. */ function _setImplementation(address newImplementation) private { require(AddressUpgradeable.isContract(newImplementation), "ERC1967: new implementation is not a contract"); StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; } /** * @dev Perform implementation upgrade * * Emits an {Upgraded} event. */ function _upgradeTo(address newImplementation) internal { _setImplementation(newImplementation); emit Upgraded(newImplementation); } /** * @dev Perform implementation upgrade with additional setup call. * * Emits an {Upgraded} event. */ function _upgradeToAndCall( address newImplementation, bytes memory data, bool forceCall ) internal { _upgradeTo(newImplementation); if (data.length > 0 || forceCall) { _functionDelegateCall(newImplementation, data); } } /** * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call. * * Emits an {Upgraded} event. */ function _upgradeToAndCallUUPS( address newImplementation, bytes memory data, bool forceCall ) internal { // Upgrades from old implementations will perform a rollback test. This test requires the new // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing // this special case will break upgrade paths from old UUPS implementation to new ones. if (StorageSlotUpgradeable.getBooleanSlot(_ROLLBACK_SLOT).value) { _setImplementation(newImplementation); } else { try IERC1822ProxiableUpgradeable(newImplementation).proxiableUUID() returns (bytes32 slot) { require(slot == _IMPLEMENTATION_SLOT, "ERC1967Upgrade: unsupported proxiableUUID"); } catch { revert("ERC1967Upgrade: new implementation is not UUPS"); } _upgradeToAndCall(newImplementation, data, forceCall); } } /** * @dev Storage slot with the admin of the contract. * This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1, and is * validated in the constructor. */ bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; /** * @dev Emitted when the admin account has changed. */ event AdminChanged(address previousAdmin, address newAdmin); /** * @dev Returns the current admin. */ function _getAdmin() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value; } /** * @dev Stores a new address in the EIP1967 admin slot. */ function _setAdmin(address newAdmin) private { require(newAdmin != address(0), "ERC1967: new admin is the zero address"); StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value = newAdmin; } /** * @dev Changes the admin of the proxy. * * Emits an {AdminChanged} event. */ function _changeAdmin(address newAdmin) internal { emit AdminChanged(_getAdmin(), newAdmin); _setAdmin(newAdmin); } /** * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy. * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor. */ bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50; /** * @dev Emitted when the beacon is upgraded. */ event BeaconUpgraded(address indexed beacon); /** * @dev Returns the current beacon. */ function _getBeacon() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value; } /** * @dev Stores a new beacon in the EIP1967 beacon slot. */ function _setBeacon(address newBeacon) private { require(AddressUpgradeable.isContract(newBeacon), "ERC1967: new beacon is not a contract"); require( AddressUpgradeable.isContract(IBeaconUpgradeable(newBeacon).implementation()), "ERC1967: beacon implementation is not a contract" ); StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value = newBeacon; } /** * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that). * * Emits a {BeaconUpgraded} event. */ function _upgradeBeaconToAndCall( address newBeacon, bytes memory data, bool forceCall ) internal { _setBeacon(newBeacon); emit BeaconUpgraded(newBeacon); if (data.length > 0 || forceCall) { _functionDelegateCall(IBeaconUpgradeable(newBeacon).implementation(), data); } } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function _functionDelegateCall(address target, bytes memory data) private returns (bytes memory) { require(AddressUpgradeable.isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return AddressUpgradeable.verifyCallResult(success, returndata, "Address: low-level delegate call failed"); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/proxy/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (proxy/utils/UUPSUpgradeable.sol) pragma solidity ^0.8.0; /** * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy. * * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing * `UUPSUpgradeable` with a custom implementation of upgrades. * * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism. * * _Available since v4.1._ */ abstract contract UUPSUpgradeable is Initializable, IERC1822ProxiableUpgradeable, ERC1967UpgradeUpgradeable { function __UUPSUpgradeable_init() internal onlyInitializing { } function __UUPSUpgradeable_init_unchained() internal onlyInitializing { } /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment address private immutable __self = address(this); /** * @dev Check that the execution is being performed through a delegatecall call and that the execution context is * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to * fail. */ modifier onlyProxy() { require(address(this) != __self, "Function must be called through delegatecall"); require(_getImplementation() == __self, "Function must be called through active proxy"); _; } /** * @dev Check that the execution is not being performed through a delegate call. This allows a function to be * callable on the implementing contract but not through proxies. */ modifier notDelegated() { require(address(this) == __self, "UUPSUpgradeable: must not be called through delegatecall"); _; } /** * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the * implementation. It is used to validate the implementation's compatibility when performing an upgrade. * * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier. */ function proxiableUUID() external view virtual override notDelegated returns (bytes32) { return _IMPLEMENTATION_SLOT; } /** * @dev Upgrade the implementation of the proxy to `newImplementation`. * * Calls {_authorizeUpgrade}. * * Emits an {Upgraded} event. */ function upgradeTo(address newImplementation) external virtual onlyProxy { _authorizeUpgrade(newImplementation); _upgradeToAndCallUUPS(newImplementation, new bytes(0), false); } /** * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call * encoded in `data`. * * Calls {_authorizeUpgrade}. * * Emits an {Upgraded} event. */ function upgradeToAndCall(address newImplementation, bytes memory data) external payable virtual onlyProxy { _authorizeUpgrade(newImplementation); _upgradeToAndCallUUPS(newImplementation, data, true); } /** * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by * {upgradeTo} and {upgradeToAndCall}. * * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}. * * ```solidity * function _authorizeUpgrade(address) internal override onlyOwner {} * ``` */ function _authorizeUpgrade(address newImplementation) internal virtual; /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/security/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuardUpgradeable is Initializable { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; function __ReentrancyGuard_init() internal onlyInitializing { __ReentrancyGuard_init_unchained(); } function __ReentrancyGuard_init_unchained() internal onlyInitializing { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; } // File @openzeppelin/contracts-upgradeable/utils/math/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library MathUpgradeable { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } } // File contracts/DegenSlot.sol // Original license: SPDX_License_Identifier: MIT pragma solidity ^0.8.28; // Import upgradeable contracts from OpenZeppelin. contract DegenSlot is OwnableUpgradeable, UUPSUpgradeable, ReentrancyGuardUpgradeable { // ===== Jackpot & Fee Parameters ===== uint256 public majorJackpotChance; // e.g., default: 1 (0.01% chance if scaled appropriately) uint256 public minorJackpotChance; // e.g., default: 4 (0.04% chance) uint256 public jackpotContribution1; // e.g., default: 10 (%) uint256 public jackpotContribution2; // e.g., default: 3 (%) uint256 public feePercentage; // e.g., default: 5 (%) address payable public feeWallet; // Track total fees collected. uint256 public totalFeesCollected; // Jackpot pools. uint256 public jackpotPool1; uint256 public jackpotPool2; // ===== Cycle-Based Payout Parameters ===== uint256 public cycleTarget; // Current cycle target (in wei) uint256 public cyclePayoutRatio; // Overall payout ratio (e.g., 70 means 70%) uint256 public cycleTotalBets; // Cumulative normal bets in current cycle uint256 public accumulatedPayout; // Accumulated payout credit for the cycle // Target payout for the cycle: R = (cyclePayoutRatio/100) * cycleTarget // ===== Smoothing/Dampening Parameters ===== uint256 public dampeningFactor; // Scaled to 1e18; e.g., 0.8e18 means 80% weight on new value. uint256 public smoothedWinProb; // Smoothed win probability (scaled to 1e18) uint256 public baselineWinProb; // Baseline win probability (scaled to 1e18) // ===== Random Cycle Target Bounds ===== uint256 public minCycleTarget; // e.g., default: 10 ether uint256 public maxCycleTarget; // e.g., default: 100 ether // ===== Mitigation Parameters ===== uint256 public constant MIN_BET = 1 ether; // Minimum bet allowed uint256 public betCooldown; // Cooldown (seconds) between bets per address mapping(address => uint256) public lastBetTimestamp; // ===== On-Chain Bet History & Events ===== event SpinResult( address indexed player, uint256 bet, string winType, uint256 payout ); event JackpotPaid( address indexed player, string winType, uint256 payout ); struct Bet { uint256 timestamp; uint256 betAmount; string winType; uint256 amountWon; } mapping(address => Bet[]) public betHistory; /// @notice Internal helper to record bet history. function recordBetHistory( address _player, uint256 _bet, string memory _winType, uint256 _amountWon ) internal { betHistory[_player].push( Bet({ timestamp: block.timestamp, betAmount: _bet, winType: _winType, amountWon: _amountWon }) ); } /// @notice Default initializer with default values. function initialize() public initializer { __Ownable_init(); __UUPSUpgradeable_init(); __ReentrancyGuard_init(); feeWallet = payable(msg.sender); majorJackpotChance = 1; minorJackpotChance = 4; jackpotContribution1 = 20; jackpotContribution2 = 5; feePercentage = 5; cycleTarget = 50 ether; cyclePayoutRatio = 70; betCooldown = 3; // seconds dampeningFactor = 800000000000000000; // 0.8e18 smoothedWinProb = 0; baselineWinProb = 300000000000000000; // 0.3e18 (30%) minCycleTarget = 100 ether; maxCycleTarget = 1000 ether; totalFeesCollected = 0; } /// @notice UUPS upgrade authorization. function _authorizeUpgrade(address newImplementation) internal override onlyOwner {} // ==================================================== // Owner-only parameter update functions. // ==================================================== function updateMajorJackpotChance(uint256 _newChance) external onlyOwner { majorJackpotChance = _newChance; } function updateMinorJackpotChance(uint256 _newChance) external onlyOwner { minorJackpotChance = _newChance; } function updateJackpotContributions(uint256 _newContribution1, uint256 _newContribution2) external onlyOwner { jackpotContribution1 = _newContribution1; jackpotContribution2 = _newContribution2; } function updateFeePercentage(uint256 _newFeePercentage) external onlyOwner { feePercentage = _newFeePercentage; } function updateFeeWallet(address payable _newFeeWallet) external onlyOwner { feeWallet = _newFeeWallet; } function updateCycleTarget(uint256 _newTarget) external onlyOwner { require(_newTarget > 0, "Cycle target must be > 0"); cycleTarget = _newTarget; } function updateCyclePayoutRatio(uint256 _newPayoutRatio) external onlyOwner { cyclePayoutRatio = _newPayoutRatio; } function updateBetCooldown(uint256 _newCooldown) external onlyOwner { betCooldown = _newCooldown; } function updateDampeningFactor(uint256 _newFactor) external onlyOwner { dampeningFactor = _newFactor; } function updateBaselineWinProb(uint256 _newBaseline) external onlyOwner { require(_newBaseline <= 1e18, "Baseline must be <= 1e18"); baselineWinProb = _newBaseline; } function updateCycleTargetBounds(uint256 _minTarget, uint256 _maxTarget) external onlyOwner { require(_minTarget > 0 && _maxTarget > _minTarget, "Invalid bounds"); minCycleTarget = _minTarget; maxCycleTarget = _maxTarget; } // ==================================================== // Internal helper functions. // ==================================================== /// @notice Calculates the normal bet amount after deducting fees and jackpot contributions. function _calculateNormalBet(uint256 bet) internal view returns (uint256) { uint256 feeAmount = (bet * feePercentage) / 100; uint256 jp1Amount = (bet * jackpotContribution1) / 100; uint256 jp2Amount = (bet * jackpotContribution2) / 100; return bet - feeAmount - jp1Amount - jp2Amount; } /// @notice Internal helper to generate a random number in [min, max). function _randomInRange(uint256 min, uint256 max) internal view returns (uint256) { require(max > min, "Invalid range"); uint256 range = max - min; uint256 rand = uint256(keccak256(abi.encodePacked(block.timestamp, block.prevrandao, msg.sender))); return (rand % range) + min; } /// @notice Checks for jackpot wins with weighted chance based on bet size. /// Returns (true, winType, payout) if a jackpot is won. function _jackpotCheck(uint256 bet) internal returns (bool, string memory, uint256) { uint256 betFactor = MathUpgradeable.sqrt(bet / MIN_BET); uint256 effectiveMajorChance = majorJackpotChance * betFactor; if (effectiveMajorChance > 5000) { effectiveMajorChance = 5000; } uint256 effectiveMinorChance = minorJackpotChance * betFactor; if (effectiveMinorChance > 5000) { effectiveMinorChance = 5000; } uint256 randomVal = uint256(keccak256(abi.encodePacked(block.timestamp, block.prevrandao, msg.sender, bet))) % 10000; if (randomVal < effectiveMajorChance && jackpotPool1 > 0) { uint256 payout = jackpotPool1; jackpotPool1 = 0; emit JackpotPaid(msg.sender, "Major Jackpot", payout); return (true, "Major Jackpot", payout); } else if (randomVal < (effectiveMajorChance + effectiveMinorChance) && jackpotPool2 > 0) { uint256 payout = jackpotPool2; jackpotPool2 = 0; emit JackpotPaid(msg.sender, "Minor Jackpot", payout); return (true, "Minor Jackpot", payout); } return (false, "", 0); } /// @notice Processes cycle-based accumulation and smoothing for a normal bet. /// Returns (true, payout) if a win is triggered; otherwise, (false, 0). function _processCycle(uint256 normalBet) internal returns (bool, uint256) { uint256 R = (cyclePayoutRatio * cycleTarget) / 100; // Target payout for cycle. cycleTotalBets += normalBet; accumulatedPayout += (normalBet * R) / cycleTarget; uint256 rawProb = (accumulatedPayout * 1e18) / R; if (rawProb > 1e18) { rawProb = 1e18; } smoothedWinProb = (smoothedWinProb * (1e18 - dampeningFactor) + rawProb * dampeningFactor) / 1e18; if (cycleTotalBets >= cycleTarget) { smoothedWinProb = 1e18; } uint256 effectiveProb = baselineWinProb + ((1e18 - baselineWinProb) * smoothedWinProb) / 1e18; if (effectiveProb > 1e18) { effectiveProb = 1e18; } uint256 randomNormal = uint256(keccak256(abi.encodePacked(block.timestamp, msg.sender, normalBet))) % 1e18; if (randomNormal < effectiveProb) { uint256 payout = accumulatedPayout; // Reset cycle variables. cycleTotalBets = 0; accumulatedPayout = 0; smoothedWinProb = 0; return (true, payout); } return (false, 0); } // ==================================================== // Main spin function. // ==================================================== function spin() external payable nonReentrant { require(msg.value >= MIN_BET, "Bet below minimum allowed"); require(block.timestamp >= lastBetTimestamp[msg.sender] + betCooldown, "Cooldown active"); lastBetTimestamp[msg.sender] = block.timestamp; uint256 betAmount = msg.value; uint256 normalBet = _calculateNormalBet(betAmount); { uint256 feeAmount = (betAmount * feePercentage) / 100; uint256 jp1Amount = (betAmount * jackpotContribution1) / 100; uint256 jp2Amount = (betAmount * jackpotContribution2) / 100; if (feeAmount > 0) { feeWallet.transfer(feeAmount); totalFeesCollected += feeAmount; } jackpotPool1 += jp1Amount; jackpotPool2 += jp2Amount; } (bool jackpotWin, string memory winType, uint256 jackpotPayout) = _jackpotCheck(betAmount); if (jackpotWin) { require(address(this).balance >= jackpotPayout, "Insufficient funds (jackpot)"); (bool success, ) = msg.sender.call{value: jackpotPayout}(""); require(success, "Transfer failed"); emit SpinResult(msg.sender, betAmount, winType, jackpotPayout); recordBetHistory(msg.sender, betAmount, winType, jackpotPayout); return; } (bool normalWin, uint256 normalPayout) = _processCycle(normalBet); if (normalWin) { require(address(this).balance >= normalPayout, "Insufficient funds (normal win)"); (bool success, ) = msg.sender.call{value: normalPayout}(""); require(success, "Transfer failed"); emit SpinResult(msg.sender, betAmount, "Normal Win", normalPayout); recordBetHistory(msg.sender, betAmount, "Normal Win", normalPayout); cycleTarget = _randomInRange(minCycleTarget, maxCycleTarget); } else { emit SpinResult(msg.sender, betAmount, "Loss", 0); recordBetHistory(msg.sender, betAmount, "Loss", 0); } } /// @notice Owner-only function to withdraw funds. function withdraw(uint256 amount) external onlyOwner { require(address(this).balance >= amount, "Insufficient funds (withdraw)"); (bool success, ) = owner().call{value: amount}(""); require(success, "Withdrawal failed"); } receive() external payable {} fallback() external payable {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beacon","type":"address"}],"name":"BeaconUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"player","type":"address"},{"indexed":false,"internalType":"string","name":"winType","type":"string"},{"indexed":false,"internalType":"uint256","name":"payout","type":"uint256"}],"name":"JackpotPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"player","type":"address"},{"indexed":false,"internalType":"uint256","name":"bet","type":"uint256"},{"indexed":false,"internalType":"string","name":"winType","type":"string"},{"indexed":false,"internalType":"uint256","name":"payout","type":"uint256"}],"name":"SpinResult","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"MIN_BET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"accumulatedPayout","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baselineWinProb","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"betCooldown","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"betHistory","outputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"betAmount","type":"uint256"},{"internalType":"string","name":"winType","type":"string"},{"internalType":"uint256","name":"amountWon","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cyclePayoutRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cycleTarget","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cycleTotalBets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dampeningFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feePercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"jackpotContribution1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"jackpotContribution2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"jackpotPool1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"jackpotPool2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastBetTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"majorJackpotChance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxCycleTarget","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minCycleTarget","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minorJackpotChance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"smoothedWinProb","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"spin","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"totalFeesCollected","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newBaseline","type":"uint256"}],"name":"updateBaselineWinProb","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCooldown","type":"uint256"}],"name":"updateBetCooldown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPayoutRatio","type":"uint256"}],"name":"updateCyclePayoutRatio","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newTarget","type":"uint256"}],"name":"updateCycleTarget","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minTarget","type":"uint256"},{"internalType":"uint256","name":"_maxTarget","type":"uint256"}],"name":"updateCycleTargetBounds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newFactor","type":"uint256"}],"name":"updateDampeningFactor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newFeePercentage","type":"uint256"}],"name":"updateFeePercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_newFeeWallet","type":"address"}],"name":"updateFeeWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newContribution1","type":"uint256"},{"internalType":"uint256","name":"_newContribution2","type":"uint256"}],"name":"updateJackpotContributions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newChance","type":"uint256"}],"name":"updateMajorJackpotChance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newChance","type":"uint256"}],"name":"updateMinorJackpotChance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"upgradeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60a06040523073ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff16815250348015610042575f5ffd5b506080516142e96100775f395f8181610ac001528181610b4e01528181610c5f01528181610ced0152610e7001526142e95ff3fe608060405260043610610254575f3560e01c80637f3e212d11610138578063baede602116100b5578063d5596b8911610079578063d5596b8914610816578063d6471c6614610840578063e7f374831461086a578063f0acd7d514610894578063f25f4b561461089e578063f2fde38b146108c857610255565b8063baede6021461074e578063bbdc07fa14610776578063c45748d21461079e578063cdc15877146107c6578063cdd66497146107ee57610255565b8063a001ecdd116100fc578063a001ecdd1461067c578063a877360c146106a6578063b12d0e7a146106d0578063b56ec68e146106fa578063b9914e1f1461072457610255565b80637f3e212d146105be5780638129fc1c146105e8578063851ed2d2146105fe5780638da5cb5b14610628578063960484fd1461065257610255565b806351a7121a116101d157806360c6d8ae1161019557806360c6d8ae146104da5780636540742f14610504578063667185241461052e5780636cad3fb014610556578063715018a61461057e5780637986c8971461059457610255565b806351a7121a1461040a57806352d1902d14610434578063552713bb1461045e57806356866d481461048857806357a69d95146104b057610255565b80633659cfe6116102185780633659cfe6146103355780633e2bab211461035d5780634b4331b9146103855780634f1ef286146103af5780634fe6d26c146103cb57610255565b806304053e69146102575780630933a3b6146102815780631b5a0a4b146102bd5780632e1a7d4d146102e5578063321fc6321461030d57610255565b5b005b348015610262575f5ffd5b5061026b6108f0565b60405161027891906129ed565b60405180910390f35b34801561028c575f5ffd5b506102a760048036038101906102a29190612a71565b6108f7565b6040516102b491906129ed565b60405180910390f35b3480156102c8575f5ffd5b506102e360048036038101906102de9190612ac6565b61090d565b005b3480156102f0575f5ffd5b5061030b60048036038101906103069190612ac6565b61096b565b005b348015610318575f5ffd5b50610333600480360381019061032e9190612ac6565b610a69565b005b348015610340575f5ffd5b5061035b60048036038101906103569190612a71565b610abe565b005b348015610368575f5ffd5b50610383600480360381019061037e9190612ac6565b610c44565b005b348015610390575f5ffd5b50610399610c57565b6040516103a691906129ed565b60405180910390f35b6103c960048036038101906103c49190612c2d565b610c5d565b005b3480156103d6575f5ffd5b506103f160048036038101906103ec9190612c87565b610d99565b6040516104019493929190612d25565b60405180910390f35b348015610415575f5ffd5b5061041e610e66565b60405161042b91906129ed565b60405180910390f35b34801561043f575f5ffd5b50610448610e6d565b6040516104559190612d87565b60405180910390f35b348015610469575f5ffd5b50610472610f24565b60405161047f91906129ed565b60405180910390f35b348015610493575f5ffd5b506104ae60048036038101906104a99190612da0565b610f2a565b005b3480156104bb575f5ffd5b506104c4610f93565b6040516104d191906129ed565b60405180910390f35b3480156104e5575f5ffd5b506104ee610f99565b6040516104fb91906129ed565b60405180910390f35b34801561050f575f5ffd5b50610518610fa0565b60405161052591906129ed565b60405180910390f35b348015610539575f5ffd5b50610554600480360381019061054f9190612e19565b610fac565b005b348015610561575f5ffd5b5061057c60048036038101906105779190612ac6565b610ff8565b005b348015610589575f5ffd5b5061059261100a565b005b34801561059f575f5ffd5b506105a861101d565b6040516105b591906129ed565b60405180910390f35b3480156105c9575f5ffd5b506105d2611023565b6040516105df91906129ed565b60405180910390f35b3480156105f3575f5ffd5b506105fc61102a565b005b348015610609575f5ffd5b50610612611252565b60405161061f91906129ed565b60405180910390f35b348015610633575f5ffd5b5061063c611259565b6040516106499190612e53565b60405180910390f35b34801561065d575f5ffd5b50610666611281565b60405161067391906129ed565b60405180910390f35b348015610687575f5ffd5b50610690611288565b60405161069d91906129ed565b60405180910390f35b3480156106b1575f5ffd5b506106ba61128e565b6040516106c791906129ed565b60405180910390f35b3480156106db575f5ffd5b506106e4611295565b6040516106f191906129ed565b60405180910390f35b348015610705575f5ffd5b5061070e61129c565b60405161071b91906129ed565b60405180910390f35b34801561072f575f5ffd5b506107386112a3565b60405161074591906129ed565b60405180910390f35b348015610759575f5ffd5b50610774600480360381019061076f9190612ac6565b6112aa565b005b348015610781575f5ffd5b5061079c60048036038101906107979190612ac6565b6112bd565b005b3480156107a9575f5ffd5b506107c460048036038101906107bf9190612ac6565b6112cf565b005b3480156107d1575f5ffd5b506107ec60048036038101906107e79190612da0565b6112e2565b005b3480156107f9575f5ffd5b50610814600480360381019061080f9190612ac6565b6112fc565b005b348015610821575f5ffd5b5061082a61130e565b60405161083791906129ed565b60405180910390f35b34801561084b575f5ffd5b50610854611315565b60405161086191906129ed565b60405180910390f35b348015610875575f5ffd5b5061087e61131c565b60405161088b91906129ed565b60405180910390f35b61089c611323565b005b3480156108a9575f5ffd5b506108b261192a565b6040516108bf9190612e7b565b60405180910390f35b3480156108d3575f5ffd5b506108ee60048036038101906108e99190612a71565b611950565b005b6101065481565b61010e602052805f5260405f205f915090505481565b6109156119d2565b670de0b6b3a7640000811115610960576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095790612ede565b60405180910390fd5b8061010a8190555050565b6109736119d2565b804710156109b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ad90612f46565b60405180910390fd5b5f6109bf611259565b73ffffffffffffffffffffffffffffffffffffffff16826040516109e290612f91565b5f6040518083038185875af1925050503d805f8114610a1c576040519150601f19603f3d011682016040523d82523d5f602084013e610a21565b606091505b5050905080610a65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5c90612fef565b60405180910390fd5b5050565b610a716119d2565b5f8111610ab3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aaa90613057565b60405180910390fd5b806101048190555050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1603610b4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b43906130e5565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16610b8b611a50565b73ffffffffffffffffffffffffffffffffffffffff1614610be1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd890613173565b60405180910390fd5b610bea81611aa3565b610c41815f67ffffffffffffffff811115610c0857610c07612b09565b5b6040519080825280601f01601f191660200182016040528015610c3a5781602001600182028036833780820191505090505b505f611aae565b50565b610c4c6119d2565b806101088190555050565b60fb5481565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1603610ceb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce2906130e5565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16610d2a611a50565b73ffffffffffffffffffffffffffffffffffffffff1614610d80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7790613173565b60405180910390fd5b610d8982611aa3565b610d9582826001611aae565b5050565b61010f602052815f5260405f208181548110610db3575f80fd5b905f5260205f2090600402015f9150915050805f015490806001015490806002018054610ddf906131be565b80601f0160208091040260200160405190810160405280929190818152602001828054610e0b906131be565b8015610e565780601f10610e2d57610100808354040283529160200191610e56565b820191905f5260205f20905b815481529060010190602001808311610e3957829003601f168201915b5050505050908060030154905084565b6101055481565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614610efc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef39061325e565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b905090565b60fc5481565b610f326119d2565b5f82118015610f4057508181115b610f7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f76906132c6565b60405180910390fd5b8161010b819055508061010c819055505050565b60fe5481565b6101015481565b670de0b6b3a764000081565b610fb46119d2565b806101005f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6110006119d2565b8060ff8190555050565b6110126119d2565b61101b5f611c18565b565b60fd5481565b6101085481565b5f5f60019054906101000a900460ff1615905080801561105a575060015f5f9054906101000a900460ff1660ff16105b80611087575061106930611cdb565b158015611086575060015f5f9054906101000a900460ff1660ff16145b5b6110c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110bd90613354565b60405180910390fd5b60015f5f6101000a81548160ff021916908360ff16021790555080156111015760015f60016101000a81548160ff0219169083151502179055505b611109611cfd565b611111611d55565b611119611da5565b336101005f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160fb81905550600460fc81905550601460fd81905550600560fe81905550600560ff819055506802b5e3af16b188000061010481905550604661010581905550600361010d81905550670b1a2bc2ec500000610108819055505f61010981905550670429d069189e000061010a8190555068056bc75e2d6310000061010b81905550683635c9adc5dea0000061010c819055505f61010181905550801561124f575f5f60016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498600160405161124691906133c0565b60405180910390a15b50565b61010a5481565b5f60335f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6101095481565b60ff5481565b61010b5481565b6101045481565b61010d5481565b6101075481565b6112b26119d2565b8061010d8190555050565b6112c56119d2565b8060fc8190555050565b6112d76119d2565b806101058190555050565b6112ea6119d2565b8160fd819055508060fe819055505050565b6113046119d2565b8060fb8190555050565b61010c5481565b6101025481565b6101035481565b61132b611dfd565b670de0b6b3a7640000341015611376576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136d90613423565b60405180910390fd5b61010d5461010e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546113c3919061346e565b421015611405576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fc906134eb565b60405180910390fd5b4261010e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505f3490505f61145682611e4c565b90505f606460ff54846114699190613509565b6114739190613577565b90505f606460fd54856114869190613509565b6114909190613577565b90505f606460fe54866114a39190613509565b6114ad9190613577565b90505f831115611537576101005f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8490811502906040515f60405180830381858888f1935050505015801561151c573d5f5f3e3d5ffd5b50826101015f82825461152f919061346e565b925050819055505b816101025f828254611549919061346e565b92505081905550806101035f828254611562919061346e565b925050819055505050505f5f5f61157885611ed0565b92509250925082156116d857804710156115c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115be906135f1565b60405180910390fd5b5f3373ffffffffffffffffffffffffffffffffffffffff16826040516115ec90612f91565b5f6040518083038185875af1925050503d805f8114611626576040519150601f19603f3d011682016040523d82523d5f602084013e61162b565b606091505b505090508061166f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166690613659565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167fe0326b1d0509803e2d4ba4575046322dc8c22ea2e64fb3a02f01bd27a5b59ea28785856040516116b993929190613677565b60405180910390a26116cd3387858561211d565b505050505050611920565b5f5f6116e3866121dc565b9150915081156118865780471015611730576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611727906136fd565b60405180910390fd5b5f3373ffffffffffffffffffffffffffffffffffffffff168260405161175590612f91565b5f6040518083038185875af1925050503d805f811461178f576040519150601f19603f3d011682016040523d82523d5f602084013e611794565b606091505b50509050806117d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cf90613659565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167fe0326b1d0509803e2d4ba4575046322dc8c22ea2e64fb3a02f01bd27a5b59ea28984604051611820929190613765565b60405180910390a261186933896040518060400160405280600a81526020017f4e6f726d616c2057696e000000000000000000000000000000000000000000008152508561211d565b61187961010b5461010c546123f1565b6101048190555050611918565b3373ffffffffffffffffffffffffffffffffffffffff167fe0326b1d0509803e2d4ba4575046322dc8c22ea2e64fb3a02f01bd27a5b59ea2885f6040516118ce929190613822565b60405180910390a261191733886040518060400160405280600481526020017f4c6f7373000000000000000000000000000000000000000000000000000000008152505f61211d565b5b505050505050505b611928612494565b565b6101005f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6119586119d2565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036119c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bd906138cc565b60405180910390fd5b6119cf81611c18565b50565b6119da61249e565b73ffffffffffffffffffffffffffffffffffffffff166119f8611259565b73ffffffffffffffffffffffffffffffffffffffff1614611a4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4590613934565b60405180910390fd5b565b5f611a7c7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b6124a5565b5f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611aab6119d2565b50565b611ad97f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435f1b6124ae565b5f015f9054906101000a900460ff1615611afb57611af6836124b7565b611c13565b8273ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611b6357506040513d601f19601f82011682018060405250810190611b60919061397c565b60015b611ba2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9990613a17565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b8114611c06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfd90613aa5565b60405180910390fd5b50611c1283838361256d565b5b505050565b5f60335f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160335f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f5f8273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b5f60019054906101000a900460ff16611d4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4290613b33565b60405180910390fd5b611d53612598565b565b5f60019054906101000a900460ff16611da3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9a90613b33565b60405180910390fd5b565b5f60019054906101000a900460ff16611df3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dea90613b33565b60405180910390fd5b611dfb6125f8565b565b600260c95403611e42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3990613b9b565b60405180910390fd5b600260c981905550565b5f5f606460ff5484611e5e9190613509565b611e689190613577565b90505f606460fd5485611e7b9190613509565b611e859190613577565b90505f606460fe5486611e989190613509565b611ea29190613577565b905080828487611eb29190613bb9565b611ebc9190613bb9565b611ec69190613bb9565b9350505050919050565b5f60605f5f611ef1670de0b6b3a764000086611eec9190613577565b612650565b90505f8160fb54611f029190613509565b9050611388811115611f145761138890505b5f8260fc54611f239190613509565b9050611388811115611f355761138890505b5f6127104244338b604051602001611f509493929190613c51565b604051602081830303815290604052805190602001205f1c611f729190613c9e565b90508281108015611f8557505f61010254115b15612031575f6101025490505f610102819055503373ffffffffffffffffffffffffffffffffffffffff167f6a5be25a13184ad2820b401821493d193dbde0ec92f681ae85c5c9b1c8159eba82604051611fdf9190613d18565b60405180910390a26001816040518060400160405280600d81526020017f4d616a6f72204a61636b706f7400000000000000000000000000000000000000815250909750975097505050505050612116565b818361203d919061346e565b8110801561204d57505f61010354115b156120f9575f6101035490505f610103819055503373ffffffffffffffffffffffffffffffffffffffff167f6a5be25a13184ad2820b401821493d193dbde0ec92f681ae85c5c9b1c8159eba826040516120a79190613d8e565b60405180910390a26001816040518060400160405280600d81526020017f4d696e6f72204a61636b706f7400000000000000000000000000000000000000815250909750975097505050505050612116565b5f5f60405180602001604052805f81525090965096509650505050505b9193909250565b61010f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20604051806080016040528042815260200185815260200184815260200183815250908060018154018082558091505060019003905f5260205f2090600402015f909190919091505f820151815f01556020820151816001015560408201518160020190816121c99190613f51565b5060608201518160030155505050505050565b5f5f5f606461010454610105546121f39190613509565b6121fd9190613577565b9050836101065f828254612211919061346e565b925050819055506101045481856122289190613509565b6122329190613577565b6101075f828254612243919061346e565b925050819055505f81670de0b6b3a7640000610107546122639190613509565b61226d9190613577565b9050670de0b6b3a764000081111561228b57670de0b6b3a764000090505b670de0b6b3a764000061010854826122a39190613509565b61010854670de0b6b3a76400006122ba9190613bb9565b610109546122c89190613509565b6122d2919061346e565b6122dc9190613577565b6101098190555061010454610106541061230157670de0b6b3a7640000610109819055505b5f670de0b6b3a76400006101095461010a54670de0b6b3a76400006123269190613bb9565b6123309190613509565b61233a9190613577565b61010a54612348919061346e565b9050670de0b6b3a764000081111561236657670de0b6b3a764000090505b5f670de0b6b3a764000042338960405160200161238593929190614020565b604051602081830303815290604052805190602001205f1c6123a79190613c9e565b9050818110156123e1575f6101075490505f610106819055505f610107819055505f610109819055506001819650965050505050506123ec565b5f5f95509550505050505b915091565b5f828211612434576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242b906140a6565b60405180910390fd5b5f83836124419190613bb9565b90505f424433604051602001612459939291906140c4565b604051602081830303815290604052805190602001205f1c90508482826124809190613c9e565b61248a919061346e565b9250505092915050565b600160c981905550565b5f33905090565b5f819050919050565b5f819050919050565b6124c081611cdb565b6124ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f690614170565b60405180910390fd5b8061252b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b6124a5565b5f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61257683612746565b5f825111806125825750805b15612593576125918383612795565b505b505050565b5f60019054906101000a900460ff166125e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125dd90613b33565b60405180910390fd5b6125f66125f161249e565b611c18565b565b5f60019054906101000a900460ff16612646576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263d90613b33565b60405180910390fd5b600160c981905550565b5f5f8203612660575f9050612741565b5f600161266c84612875565b901c6001901b905060018184816126865761268561354a565b5b048201901c9050600181848161269f5761269e61354a565b5b048201901c905060018184816126b8576126b761354a565b5b048201901c905060018184816126d1576126d061354a565b5b048201901c905060018184816126ea576126e961354a565b5b048201901c905060018184816127035761270261354a565b5b048201901c9050600181848161271c5761271b61354a565b5b048201901c905061273d818285816127375761273661354a565b5b0461294c565b9150505b919050565b61274f816124b7565b8073ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a250565b60606127a083611cdb565b6127df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127d6906141fe565b60405180910390fd5b5f5f8473ffffffffffffffffffffffffffffffffffffffff16846040516128069190614256565b5f60405180830381855af49150503d805f811461283e576040519150601f19603f3d011682016040523d82523d5f602084013e612843565b606091505b509150915061286b828260405180606001604052806027815260200161428d60279139612964565b9250505092915050565b5f5f5f90505f608084901c111561289457608083901c92506080810190505b5f604084901c11156128ae57604083901c92506040810190505b5f602084901c11156128c857602083901c92506020810190505b5f601084901c11156128e257601083901c92506010810190505b5f600884901c11156128fc57600883901c92506008810190505b5f600484901c111561291657600483901c92506004810190505b5f600284901c111561293057600283901c92506002810190505b5f600184901c1115612943576001810190505b80915050919050565b5f81831061295a578161295c565b825b905092915050565b606083156129745782905061297f565b61297e8383612986565b5b9392505050565b5f825111156129985781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129cc919061426c565b60405180910390fd5b5f819050919050565b6129e7816129d5565b82525050565b5f602082019050612a005f8301846129de565b92915050565b5f604051905090565b5f5ffd5b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612a4082612a17565b9050919050565b612a5081612a36565b8114612a5a575f5ffd5b50565b5f81359050612a6b81612a47565b92915050565b5f60208284031215612a8657612a85612a0f565b5b5f612a9384828501612a5d565b91505092915050565b612aa5816129d5565b8114612aaf575f5ffd5b50565b5f81359050612ac081612a9c565b92915050565b5f60208284031215612adb57612ada612a0f565b5b5f612ae884828501612ab2565b91505092915050565b5f5ffd5b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b612b3f82612af9565b810181811067ffffffffffffffff82111715612b5e57612b5d612b09565b5b80604052505050565b5f612b70612a06565b9050612b7c8282612b36565b919050565b5f67ffffffffffffffff821115612b9b57612b9a612b09565b5b612ba482612af9565b9050602081019050919050565b828183375f83830152505050565b5f612bd1612bcc84612b81565b612b67565b905082815260208101848484011115612bed57612bec612af5565b5b612bf8848285612bb1565b509392505050565b5f82601f830112612c1457612c13612af1565b5b8135612c24848260208601612bbf565b91505092915050565b5f5f60408385031215612c4357612c42612a0f565b5b5f612c5085828601612a5d565b925050602083013567ffffffffffffffff811115612c7157612c70612a13565b5b612c7d85828601612c00565b9150509250929050565b5f5f60408385031215612c9d57612c9c612a0f565b5b5f612caa85828601612a5d565b9250506020612cbb85828601612ab2565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f612cf782612cc5565b612d018185612ccf565b9350612d11818560208601612cdf565b612d1a81612af9565b840191505092915050565b5f608082019050612d385f8301876129de565b612d4560208301866129de565b8181036040830152612d578185612ced565b9050612d6660608301846129de565b95945050505050565b5f819050919050565b612d8181612d6f565b82525050565b5f602082019050612d9a5f830184612d78565b92915050565b5f5f60408385031215612db657612db5612a0f565b5b5f612dc385828601612ab2565b9250506020612dd485828601612ab2565b9150509250929050565b5f612de882612a17565b9050919050565b612df881612dde565b8114612e02575f5ffd5b50565b5f81359050612e1381612def565b92915050565b5f60208284031215612e2e57612e2d612a0f565b5b5f612e3b84828501612e05565b91505092915050565b612e4d81612a36565b82525050565b5f602082019050612e665f830184612e44565b92915050565b612e7581612dde565b82525050565b5f602082019050612e8e5f830184612e6c565b92915050565b7f426173656c696e65206d757374206265203c3d203165313800000000000000005f82015250565b5f612ec8601883612ccf565b9150612ed382612e94565b602082019050919050565b5f6020820190508181035f830152612ef581612ebc565b9050919050565b7f496e73756666696369656e742066756e647320287769746864726177290000005f82015250565b5f612f30601d83612ccf565b9150612f3b82612efc565b602082019050919050565b5f6020820190508181035f830152612f5d81612f24565b9050919050565b5f81905092915050565b50565b5f612f7c5f83612f64565b9150612f8782612f6e565b5f82019050919050565b5f612f9b82612f71565b9150819050919050565b7f5769746864726177616c206661696c65640000000000000000000000000000005f82015250565b5f612fd9601183612ccf565b9150612fe482612fa5565b602082019050919050565b5f6020820190508181035f83015261300681612fcd565b9050919050565b7f4379636c6520746172676574206d757374206265203e203000000000000000005f82015250565b5f613041601883612ccf565b915061304c8261300d565b602082019050919050565b5f6020820190508181035f83015261306e81613035565b9050919050565b7f46756e6374696f6e206d7573742062652063616c6c6564207468726f756768205f8201527f64656c656761746563616c6c0000000000000000000000000000000000000000602082015250565b5f6130cf602c83612ccf565b91506130da82613075565b604082019050919050565b5f6020820190508181035f8301526130fc816130c3565b9050919050565b7f46756e6374696f6e206d7573742062652063616c6c6564207468726f756768205f8201527f6163746976652070726f78790000000000000000000000000000000000000000602082015250565b5f61315d602c83612ccf565b915061316882613103565b604082019050919050565b5f6020820190508181035f83015261318a81613151565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806131d557607f821691505b6020821081036131e8576131e7613191565b5b50919050565b7f555550535570677261646561626c653a206d757374206e6f742062652063616c5f8201527f6c6564207468726f7567682064656c656761746563616c6c0000000000000000602082015250565b5f613248603883612ccf565b9150613253826131ee565b604082019050919050565b5f6020820190508181035f8301526132758161323c565b9050919050565b7f496e76616c696420626f756e64730000000000000000000000000000000000005f82015250565b5f6132b0600e83612ccf565b91506132bb8261327c565b602082019050919050565b5f6020820190508181035f8301526132dd816132a4565b9050919050565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c7265615f8201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b5f61333e602e83612ccf565b9150613349826132e4565b604082019050919050565b5f6020820190508181035f83015261336b81613332565b9050919050565b5f819050919050565b5f60ff82169050919050565b5f819050919050565b5f6133aa6133a56133a084613372565b613387565b61337b565b9050919050565b6133ba81613390565b82525050565b5f6020820190506133d35f8301846133b1565b92915050565b7f4265742062656c6f77206d696e696d756d20616c6c6f776564000000000000005f82015250565b5f61340d601983612ccf565b9150613418826133d9565b602082019050919050565b5f6020820190508181035f83015261343a81613401565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f613478826129d5565b9150613483836129d5565b925082820190508082111561349b5761349a613441565b5b92915050565b7f436f6f6c646f776e2061637469766500000000000000000000000000000000005f82015250565b5f6134d5600f83612ccf565b91506134e0826134a1565b602082019050919050565b5f6020820190508181035f830152613502816134c9565b9050919050565b5f613513826129d5565b915061351e836129d5565b925082820261352c816129d5565b9150828204841483151761354357613542613441565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f613581826129d5565b915061358c836129d5565b92508261359c5761359b61354a565b5b828204905092915050565b7f496e73756666696369656e742066756e647320286a61636b706f7429000000005f82015250565b5f6135db601c83612ccf565b91506135e6826135a7565b602082019050919050565b5f6020820190508181035f830152613608816135cf565b9050919050565b7f5472616e73666572206661696c656400000000000000000000000000000000005f82015250565b5f613643600f83612ccf565b915061364e8261360f565b602082019050919050565b5f6020820190508181035f83015261367081613637565b9050919050565b5f60608201905061368a5f8301866129de565b818103602083015261369c8185612ced565b90506136ab60408301846129de565b949350505050565b7f496e73756666696369656e742066756e647320286e6f726d616c2077696e29005f82015250565b5f6136e7601f83612ccf565b91506136f2826136b3565b602082019050919050565b5f6020820190508181035f830152613714816136db565b9050919050565b7f4e6f726d616c2057696e000000000000000000000000000000000000000000005f82015250565b5f61374f600a83612ccf565b915061375a8261371b565b602082019050919050565b5f6060820190506137785f8301856129de565b818103602083015261378981613743565b905061379860408301846129de565b9392505050565b7f4c6f7373000000000000000000000000000000000000000000000000000000005f82015250565b5f6137d3600483612ccf565b91506137de8261379f565b602082019050919050565b5f819050919050565b5f61380c613807613802846137e9565b613387565b6129d5565b9050919050565b61381c816137f2565b82525050565b5f6060820190506138355f8301856129de565b8181036020830152613846816137c7565b90506138556040830184613813565b9392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f6138b6602683612ccf565b91506138c18261385c565b604082019050919050565b5f6020820190508181035f8301526138e3816138aa565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f61391e602083612ccf565b9150613929826138ea565b602082019050919050565b5f6020820190508181035f83015261394b81613912565b9050919050565b61395b81612d6f565b8114613965575f5ffd5b50565b5f8151905061397681613952565b92915050565b5f6020828403121561399157613990612a0f565b5b5f61399e84828501613968565b91505092915050565b7f45524331393637557067726164653a206e657720696d706c656d656e746174695f8201527f6f6e206973206e6f742055555053000000000000000000000000000000000000602082015250565b5f613a01602e83612ccf565b9150613a0c826139a7565b604082019050919050565b5f6020820190508181035f830152613a2e816139f5565b9050919050565b7f45524331393637557067726164653a20756e737570706f727465642070726f785f8201527f6961626c65555549440000000000000000000000000000000000000000000000602082015250565b5f613a8f602983612ccf565b9150613a9a82613a35565b604082019050919050565b5f6020820190508181035f830152613abc81613a83565b9050919050565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f7420695f8201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b5f613b1d602b83612ccf565b9150613b2882613ac3565b604082019050919050565b5f6020820190508181035f830152613b4a81613b11565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f613b85601f83612ccf565b9150613b9082613b51565b602082019050919050565b5f6020820190508181035f830152613bb281613b79565b9050919050565b5f613bc3826129d5565b9150613bce836129d5565b9250828203905081811115613be657613be5613441565b5b92915050565b5f819050919050565b613c06613c01826129d5565b613bec565b82525050565b5f8160601b9050919050565b5f613c2282613c0c565b9050919050565b5f613c3382613c18565b9050919050565b613c4b613c4682612a36565b613c29565b82525050565b5f613c5c8287613bf5565b602082019150613c6c8286613bf5565b602082019150613c7c8285613c3a565b601482019150613c8c8284613bf5565b60208201915081905095945050505050565b5f613ca8826129d5565b9150613cb3836129d5565b925082613cc357613cc261354a565b5b828206905092915050565b7f4d616a6f72204a61636b706f74000000000000000000000000000000000000005f82015250565b5f613d02600d83612ccf565b9150613d0d82613cce565b602082019050919050565b5f6040820190508181035f830152613d2f81613cf6565b9050613d3e60208301846129de565b92915050565b7f4d696e6f72204a61636b706f74000000000000000000000000000000000000005f82015250565b5f613d78600d83612ccf565b9150613d8382613d44565b602082019050919050565b5f6040820190508181035f830152613da581613d6c565b9050613db460208301846129de565b92915050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302613e167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613ddb565b613e208683613ddb565b95508019841693508086168417925050509392505050565b5f613e52613e4d613e48846129d5565b613387565b6129d5565b9050919050565b5f819050919050565b613e6b83613e38565b613e7f613e7782613e59565b848454613de7565b825550505050565b5f5f905090565b613e96613e87565b613ea1818484613e62565b505050565b5b81811015613ec457613eb95f82613e8e565b600181019050613ea7565b5050565b601f821115613f0957613eda81613dba565b613ee384613dcc565b81016020851015613ef2578190505b613f06613efe85613dcc565b830182613ea6565b50505b505050565b5f82821c905092915050565b5f613f295f1984600802613f0e565b1980831691505092915050565b5f613f418383613f1a565b9150826002028217905092915050565b613f5a82612cc5565b67ffffffffffffffff811115613f7357613f72612b09565b5b613f7d82546131be565b613f88828285613ec8565b5f60209050601f831160018114613fb9575f8415613fa7578287015190505b613fb18582613f36565b865550614018565b601f198416613fc786613dba565b5f5b82811015613fee57848901518255600182019150602085019450602081019050613fc9565b8683101561400b5784890151614007601f891682613f1a565b8355505b6001600288020188555050505b505050505050565b5f61402b8286613bf5565b60208201915061403b8285613c3a565b60148201915061404b8284613bf5565b602082019150819050949350505050565b7f496e76616c69642072616e6765000000000000000000000000000000000000005f82015250565b5f614090600d83612ccf565b915061409b8261405c565b602082019050919050565b5f6020820190508181035f8301526140bd81614084565b9050919050565b5f6140cf8286613bf5565b6020820191506140df8285613bf5565b6020820191506140ef8284613c3a565b601482019150819050949350505050565b7f455243313936373a206e657720696d706c656d656e746174696f6e206973206e5f8201527f6f74206120636f6e747261637400000000000000000000000000000000000000602082015250565b5f61415a602d83612ccf565b915061416582614100565b604082019050919050565b5f6020820190508181035f8301526141878161414e565b9050919050565b7f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f5f8201527f6e74726163740000000000000000000000000000000000000000000000000000602082015250565b5f6141e8602683612ccf565b91506141f38261418e565b604082019050919050565b5f6020820190508181035f830152614215816141dc565b9050919050565b5f81519050919050565b5f6142308261421c565b61423a8185612f64565b935061424a818560208601612cdf565b80840191505092915050565b5f6142618284614226565b915081905092915050565b5f6020820190508181035f8301526142848184612ced565b90509291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220c3ea8a03ec86cec28080fc6a4dacede8440880e44000e3740d565a73c2cd9f7164736f6c634300081c0033
Deployed Bytecode
0x608060405260043610610254575f3560e01c80637f3e212d11610138578063baede602116100b5578063d5596b8911610079578063d5596b8914610816578063d6471c6614610840578063e7f374831461086a578063f0acd7d514610894578063f25f4b561461089e578063f2fde38b146108c857610255565b8063baede6021461074e578063bbdc07fa14610776578063c45748d21461079e578063cdc15877146107c6578063cdd66497146107ee57610255565b8063a001ecdd116100fc578063a001ecdd1461067c578063a877360c146106a6578063b12d0e7a146106d0578063b56ec68e146106fa578063b9914e1f1461072457610255565b80637f3e212d146105be5780638129fc1c146105e8578063851ed2d2146105fe5780638da5cb5b14610628578063960484fd1461065257610255565b806351a7121a116101d157806360c6d8ae1161019557806360c6d8ae146104da5780636540742f14610504578063667185241461052e5780636cad3fb014610556578063715018a61461057e5780637986c8971461059457610255565b806351a7121a1461040a57806352d1902d14610434578063552713bb1461045e57806356866d481461048857806357a69d95146104b057610255565b80633659cfe6116102185780633659cfe6146103355780633e2bab211461035d5780634b4331b9146103855780634f1ef286146103af5780634fe6d26c146103cb57610255565b806304053e69146102575780630933a3b6146102815780631b5a0a4b146102bd5780632e1a7d4d146102e5578063321fc6321461030d57610255565b5b005b348015610262575f5ffd5b5061026b6108f0565b60405161027891906129ed565b60405180910390f35b34801561028c575f5ffd5b506102a760048036038101906102a29190612a71565b6108f7565b6040516102b491906129ed565b60405180910390f35b3480156102c8575f5ffd5b506102e360048036038101906102de9190612ac6565b61090d565b005b3480156102f0575f5ffd5b5061030b60048036038101906103069190612ac6565b61096b565b005b348015610318575f5ffd5b50610333600480360381019061032e9190612ac6565b610a69565b005b348015610340575f5ffd5b5061035b60048036038101906103569190612a71565b610abe565b005b348015610368575f5ffd5b50610383600480360381019061037e9190612ac6565b610c44565b005b348015610390575f5ffd5b50610399610c57565b6040516103a691906129ed565b60405180910390f35b6103c960048036038101906103c49190612c2d565b610c5d565b005b3480156103d6575f5ffd5b506103f160048036038101906103ec9190612c87565b610d99565b6040516104019493929190612d25565b60405180910390f35b348015610415575f5ffd5b5061041e610e66565b60405161042b91906129ed565b60405180910390f35b34801561043f575f5ffd5b50610448610e6d565b6040516104559190612d87565b60405180910390f35b348015610469575f5ffd5b50610472610f24565b60405161047f91906129ed565b60405180910390f35b348015610493575f5ffd5b506104ae60048036038101906104a99190612da0565b610f2a565b005b3480156104bb575f5ffd5b506104c4610f93565b6040516104d191906129ed565b60405180910390f35b3480156104e5575f5ffd5b506104ee610f99565b6040516104fb91906129ed565b60405180910390f35b34801561050f575f5ffd5b50610518610fa0565b60405161052591906129ed565b60405180910390f35b348015610539575f5ffd5b50610554600480360381019061054f9190612e19565b610fac565b005b348015610561575f5ffd5b5061057c60048036038101906105779190612ac6565b610ff8565b005b348015610589575f5ffd5b5061059261100a565b005b34801561059f575f5ffd5b506105a861101d565b6040516105b591906129ed565b60405180910390f35b3480156105c9575f5ffd5b506105d2611023565b6040516105df91906129ed565b60405180910390f35b3480156105f3575f5ffd5b506105fc61102a565b005b348015610609575f5ffd5b50610612611252565b60405161061f91906129ed565b60405180910390f35b348015610633575f5ffd5b5061063c611259565b6040516106499190612e53565b60405180910390f35b34801561065d575f5ffd5b50610666611281565b60405161067391906129ed565b60405180910390f35b348015610687575f5ffd5b50610690611288565b60405161069d91906129ed565b60405180910390f35b3480156106b1575f5ffd5b506106ba61128e565b6040516106c791906129ed565b60405180910390f35b3480156106db575f5ffd5b506106e4611295565b6040516106f191906129ed565b60405180910390f35b348015610705575f5ffd5b5061070e61129c565b60405161071b91906129ed565b60405180910390f35b34801561072f575f5ffd5b506107386112a3565b60405161074591906129ed565b60405180910390f35b348015610759575f5ffd5b50610774600480360381019061076f9190612ac6565b6112aa565b005b348015610781575f5ffd5b5061079c60048036038101906107979190612ac6565b6112bd565b005b3480156107a9575f5ffd5b506107c460048036038101906107bf9190612ac6565b6112cf565b005b3480156107d1575f5ffd5b506107ec60048036038101906107e79190612da0565b6112e2565b005b3480156107f9575f5ffd5b50610814600480360381019061080f9190612ac6565b6112fc565b005b348015610821575f5ffd5b5061082a61130e565b60405161083791906129ed565b60405180910390f35b34801561084b575f5ffd5b50610854611315565b60405161086191906129ed565b60405180910390f35b348015610875575f5ffd5b5061087e61131c565b60405161088b91906129ed565b60405180910390f35b61089c611323565b005b3480156108a9575f5ffd5b506108b261192a565b6040516108bf9190612e7b565b60405180910390f35b3480156108d3575f5ffd5b506108ee60048036038101906108e99190612a71565b611950565b005b6101065481565b61010e602052805f5260405f205f915090505481565b6109156119d2565b670de0b6b3a7640000811115610960576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095790612ede565b60405180910390fd5b8061010a8190555050565b6109736119d2565b804710156109b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ad90612f46565b60405180910390fd5b5f6109bf611259565b73ffffffffffffffffffffffffffffffffffffffff16826040516109e290612f91565b5f6040518083038185875af1925050503d805f8114610a1c576040519150601f19603f3d011682016040523d82523d5f602084013e610a21565b606091505b5050905080610a65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5c90612fef565b60405180910390fd5b5050565b610a716119d2565b5f8111610ab3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aaa90613057565b60405180910390fd5b806101048190555050565b7f000000000000000000000000cb9e03a1ea225e3e3605e6f6678cb00733e4315f73ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1603610b4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b43906130e5565b60405180910390fd5b7f000000000000000000000000cb9e03a1ea225e3e3605e6f6678cb00733e4315f73ffffffffffffffffffffffffffffffffffffffff16610b8b611a50565b73ffffffffffffffffffffffffffffffffffffffff1614610be1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd890613173565b60405180910390fd5b610bea81611aa3565b610c41815f67ffffffffffffffff811115610c0857610c07612b09565b5b6040519080825280601f01601f191660200182016040528015610c3a5781602001600182028036833780820191505090505b505f611aae565b50565b610c4c6119d2565b806101088190555050565b60fb5481565b7f000000000000000000000000cb9e03a1ea225e3e3605e6f6678cb00733e4315f73ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1603610ceb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce2906130e5565b60405180910390fd5b7f000000000000000000000000cb9e03a1ea225e3e3605e6f6678cb00733e4315f73ffffffffffffffffffffffffffffffffffffffff16610d2a611a50565b73ffffffffffffffffffffffffffffffffffffffff1614610d80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7790613173565b60405180910390fd5b610d8982611aa3565b610d9582826001611aae565b5050565b61010f602052815f5260405f208181548110610db3575f80fd5b905f5260205f2090600402015f9150915050805f015490806001015490806002018054610ddf906131be565b80601f0160208091040260200160405190810160405280929190818152602001828054610e0b906131be565b8015610e565780601f10610e2d57610100808354040283529160200191610e56565b820191905f5260205f20905b815481529060010190602001808311610e3957829003601f168201915b5050505050908060030154905084565b6101055481565b5f7f000000000000000000000000cb9e03a1ea225e3e3605e6f6678cb00733e4315f73ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614610efc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef39061325e565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b905090565b60fc5481565b610f326119d2565b5f82118015610f4057508181115b610f7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f76906132c6565b60405180910390fd5b8161010b819055508061010c819055505050565b60fe5481565b6101015481565b670de0b6b3a764000081565b610fb46119d2565b806101005f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6110006119d2565b8060ff8190555050565b6110126119d2565b61101b5f611c18565b565b60fd5481565b6101085481565b5f5f60019054906101000a900460ff1615905080801561105a575060015f5f9054906101000a900460ff1660ff16105b80611087575061106930611cdb565b158015611086575060015f5f9054906101000a900460ff1660ff16145b5b6110c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110bd90613354565b60405180910390fd5b60015f5f6101000a81548160ff021916908360ff16021790555080156111015760015f60016101000a81548160ff0219169083151502179055505b611109611cfd565b611111611d55565b611119611da5565b336101005f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160fb81905550600460fc81905550601460fd81905550600560fe81905550600560ff819055506802b5e3af16b188000061010481905550604661010581905550600361010d81905550670b1a2bc2ec500000610108819055505f61010981905550670429d069189e000061010a8190555068056bc75e2d6310000061010b81905550683635c9adc5dea0000061010c819055505f61010181905550801561124f575f5f60016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498600160405161124691906133c0565b60405180910390a15b50565b61010a5481565b5f60335f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6101095481565b60ff5481565b61010b5481565b6101045481565b61010d5481565b6101075481565b6112b26119d2565b8061010d8190555050565b6112c56119d2565b8060fc8190555050565b6112d76119d2565b806101058190555050565b6112ea6119d2565b8160fd819055508060fe819055505050565b6113046119d2565b8060fb8190555050565b61010c5481565b6101025481565b6101035481565b61132b611dfd565b670de0b6b3a7640000341015611376576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136d90613423565b60405180910390fd5b61010d5461010e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546113c3919061346e565b421015611405576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fc906134eb565b60405180910390fd5b4261010e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505f3490505f61145682611e4c565b90505f606460ff54846114699190613509565b6114739190613577565b90505f606460fd54856114869190613509565b6114909190613577565b90505f606460fe54866114a39190613509565b6114ad9190613577565b90505f831115611537576101005f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8490811502906040515f60405180830381858888f1935050505015801561151c573d5f5f3e3d5ffd5b50826101015f82825461152f919061346e565b925050819055505b816101025f828254611549919061346e565b92505081905550806101035f828254611562919061346e565b925050819055505050505f5f5f61157885611ed0565b92509250925082156116d857804710156115c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115be906135f1565b60405180910390fd5b5f3373ffffffffffffffffffffffffffffffffffffffff16826040516115ec90612f91565b5f6040518083038185875af1925050503d805f8114611626576040519150601f19603f3d011682016040523d82523d5f602084013e61162b565b606091505b505090508061166f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166690613659565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167fe0326b1d0509803e2d4ba4575046322dc8c22ea2e64fb3a02f01bd27a5b59ea28785856040516116b993929190613677565b60405180910390a26116cd3387858561211d565b505050505050611920565b5f5f6116e3866121dc565b9150915081156118865780471015611730576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611727906136fd565b60405180910390fd5b5f3373ffffffffffffffffffffffffffffffffffffffff168260405161175590612f91565b5f6040518083038185875af1925050503d805f811461178f576040519150601f19603f3d011682016040523d82523d5f602084013e611794565b606091505b50509050806117d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cf90613659565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167fe0326b1d0509803e2d4ba4575046322dc8c22ea2e64fb3a02f01bd27a5b59ea28984604051611820929190613765565b60405180910390a261186933896040518060400160405280600a81526020017f4e6f726d616c2057696e000000000000000000000000000000000000000000008152508561211d565b61187961010b5461010c546123f1565b6101048190555050611918565b3373ffffffffffffffffffffffffffffffffffffffff167fe0326b1d0509803e2d4ba4575046322dc8c22ea2e64fb3a02f01bd27a5b59ea2885f6040516118ce929190613822565b60405180910390a261191733886040518060400160405280600481526020017f4c6f7373000000000000000000000000000000000000000000000000000000008152505f61211d565b5b505050505050505b611928612494565b565b6101005f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6119586119d2565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036119c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bd906138cc565b60405180910390fd5b6119cf81611c18565b50565b6119da61249e565b73ffffffffffffffffffffffffffffffffffffffff166119f8611259565b73ffffffffffffffffffffffffffffffffffffffff1614611a4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4590613934565b60405180910390fd5b565b5f611a7c7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b6124a5565b5f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611aab6119d2565b50565b611ad97f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435f1b6124ae565b5f015f9054906101000a900460ff1615611afb57611af6836124b7565b611c13565b8273ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611b6357506040513d601f19601f82011682018060405250810190611b60919061397c565b60015b611ba2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9990613a17565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b8114611c06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfd90613aa5565b60405180910390fd5b50611c1283838361256d565b5b505050565b5f60335f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160335f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f5f8273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b5f60019054906101000a900460ff16611d4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4290613b33565b60405180910390fd5b611d53612598565b565b5f60019054906101000a900460ff16611da3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9a90613b33565b60405180910390fd5b565b5f60019054906101000a900460ff16611df3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dea90613b33565b60405180910390fd5b611dfb6125f8565b565b600260c95403611e42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3990613b9b565b60405180910390fd5b600260c981905550565b5f5f606460ff5484611e5e9190613509565b611e689190613577565b90505f606460fd5485611e7b9190613509565b611e859190613577565b90505f606460fe5486611e989190613509565b611ea29190613577565b905080828487611eb29190613bb9565b611ebc9190613bb9565b611ec69190613bb9565b9350505050919050565b5f60605f5f611ef1670de0b6b3a764000086611eec9190613577565b612650565b90505f8160fb54611f029190613509565b9050611388811115611f145761138890505b5f8260fc54611f239190613509565b9050611388811115611f355761138890505b5f6127104244338b604051602001611f509493929190613c51565b604051602081830303815290604052805190602001205f1c611f729190613c9e565b90508281108015611f8557505f61010254115b15612031575f6101025490505f610102819055503373ffffffffffffffffffffffffffffffffffffffff167f6a5be25a13184ad2820b401821493d193dbde0ec92f681ae85c5c9b1c8159eba82604051611fdf9190613d18565b60405180910390a26001816040518060400160405280600d81526020017f4d616a6f72204a61636b706f7400000000000000000000000000000000000000815250909750975097505050505050612116565b818361203d919061346e565b8110801561204d57505f61010354115b156120f9575f6101035490505f610103819055503373ffffffffffffffffffffffffffffffffffffffff167f6a5be25a13184ad2820b401821493d193dbde0ec92f681ae85c5c9b1c8159eba826040516120a79190613d8e565b60405180910390a26001816040518060400160405280600d81526020017f4d696e6f72204a61636b706f7400000000000000000000000000000000000000815250909750975097505050505050612116565b5f5f60405180602001604052805f81525090965096509650505050505b9193909250565b61010f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20604051806080016040528042815260200185815260200184815260200183815250908060018154018082558091505060019003905f5260205f2090600402015f909190919091505f820151815f01556020820151816001015560408201518160020190816121c99190613f51565b5060608201518160030155505050505050565b5f5f5f606461010454610105546121f39190613509565b6121fd9190613577565b9050836101065f828254612211919061346e565b925050819055506101045481856122289190613509565b6122329190613577565b6101075f828254612243919061346e565b925050819055505f81670de0b6b3a7640000610107546122639190613509565b61226d9190613577565b9050670de0b6b3a764000081111561228b57670de0b6b3a764000090505b670de0b6b3a764000061010854826122a39190613509565b61010854670de0b6b3a76400006122ba9190613bb9565b610109546122c89190613509565b6122d2919061346e565b6122dc9190613577565b6101098190555061010454610106541061230157670de0b6b3a7640000610109819055505b5f670de0b6b3a76400006101095461010a54670de0b6b3a76400006123269190613bb9565b6123309190613509565b61233a9190613577565b61010a54612348919061346e565b9050670de0b6b3a764000081111561236657670de0b6b3a764000090505b5f670de0b6b3a764000042338960405160200161238593929190614020565b604051602081830303815290604052805190602001205f1c6123a79190613c9e565b9050818110156123e1575f6101075490505f610106819055505f610107819055505f610109819055506001819650965050505050506123ec565b5f5f95509550505050505b915091565b5f828211612434576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242b906140a6565b60405180910390fd5b5f83836124419190613bb9565b90505f424433604051602001612459939291906140c4565b604051602081830303815290604052805190602001205f1c90508482826124809190613c9e565b61248a919061346e565b9250505092915050565b600160c981905550565b5f33905090565b5f819050919050565b5f819050919050565b6124c081611cdb565b6124ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f690614170565b60405180910390fd5b8061252b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b6124a5565b5f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61257683612746565b5f825111806125825750805b15612593576125918383612795565b505b505050565b5f60019054906101000a900460ff166125e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125dd90613b33565b60405180910390fd5b6125f66125f161249e565b611c18565b565b5f60019054906101000a900460ff16612646576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263d90613b33565b60405180910390fd5b600160c981905550565b5f5f8203612660575f9050612741565b5f600161266c84612875565b901c6001901b905060018184816126865761268561354a565b5b048201901c9050600181848161269f5761269e61354a565b5b048201901c905060018184816126b8576126b761354a565b5b048201901c905060018184816126d1576126d061354a565b5b048201901c905060018184816126ea576126e961354a565b5b048201901c905060018184816127035761270261354a565b5b048201901c9050600181848161271c5761271b61354a565b5b048201901c905061273d818285816127375761273661354a565b5b0461294c565b9150505b919050565b61274f816124b7565b8073ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a250565b60606127a083611cdb565b6127df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127d6906141fe565b60405180910390fd5b5f5f8473ffffffffffffffffffffffffffffffffffffffff16846040516128069190614256565b5f60405180830381855af49150503d805f811461283e576040519150601f19603f3d011682016040523d82523d5f602084013e612843565b606091505b509150915061286b828260405180606001604052806027815260200161428d60279139612964565b9250505092915050565b5f5f5f90505f608084901c111561289457608083901c92506080810190505b5f604084901c11156128ae57604083901c92506040810190505b5f602084901c11156128c857602083901c92506020810190505b5f601084901c11156128e257601083901c92506010810190505b5f600884901c11156128fc57600883901c92506008810190505b5f600484901c111561291657600483901c92506004810190505b5f600284901c111561293057600283901c92506002810190505b5f600184901c1115612943576001810190505b80915050919050565b5f81831061295a578161295c565b825b905092915050565b606083156129745782905061297f565b61297e8383612986565b5b9392505050565b5f825111156129985781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129cc919061426c565b60405180910390fd5b5f819050919050565b6129e7816129d5565b82525050565b5f602082019050612a005f8301846129de565b92915050565b5f604051905090565b5f5ffd5b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612a4082612a17565b9050919050565b612a5081612a36565b8114612a5a575f5ffd5b50565b5f81359050612a6b81612a47565b92915050565b5f60208284031215612a8657612a85612a0f565b5b5f612a9384828501612a5d565b91505092915050565b612aa5816129d5565b8114612aaf575f5ffd5b50565b5f81359050612ac081612a9c565b92915050565b5f60208284031215612adb57612ada612a0f565b5b5f612ae884828501612ab2565b91505092915050565b5f5ffd5b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b612b3f82612af9565b810181811067ffffffffffffffff82111715612b5e57612b5d612b09565b5b80604052505050565b5f612b70612a06565b9050612b7c8282612b36565b919050565b5f67ffffffffffffffff821115612b9b57612b9a612b09565b5b612ba482612af9565b9050602081019050919050565b828183375f83830152505050565b5f612bd1612bcc84612b81565b612b67565b905082815260208101848484011115612bed57612bec612af5565b5b612bf8848285612bb1565b509392505050565b5f82601f830112612c1457612c13612af1565b5b8135612c24848260208601612bbf565b91505092915050565b5f5f60408385031215612c4357612c42612a0f565b5b5f612c5085828601612a5d565b925050602083013567ffffffffffffffff811115612c7157612c70612a13565b5b612c7d85828601612c00565b9150509250929050565b5f5f60408385031215612c9d57612c9c612a0f565b5b5f612caa85828601612a5d565b9250506020612cbb85828601612ab2565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f612cf782612cc5565b612d018185612ccf565b9350612d11818560208601612cdf565b612d1a81612af9565b840191505092915050565b5f608082019050612d385f8301876129de565b612d4560208301866129de565b8181036040830152612d578185612ced565b9050612d6660608301846129de565b95945050505050565b5f819050919050565b612d8181612d6f565b82525050565b5f602082019050612d9a5f830184612d78565b92915050565b5f5f60408385031215612db657612db5612a0f565b5b5f612dc385828601612ab2565b9250506020612dd485828601612ab2565b9150509250929050565b5f612de882612a17565b9050919050565b612df881612dde565b8114612e02575f5ffd5b50565b5f81359050612e1381612def565b92915050565b5f60208284031215612e2e57612e2d612a0f565b5b5f612e3b84828501612e05565b91505092915050565b612e4d81612a36565b82525050565b5f602082019050612e665f830184612e44565b92915050565b612e7581612dde565b82525050565b5f602082019050612e8e5f830184612e6c565b92915050565b7f426173656c696e65206d757374206265203c3d203165313800000000000000005f82015250565b5f612ec8601883612ccf565b9150612ed382612e94565b602082019050919050565b5f6020820190508181035f830152612ef581612ebc565b9050919050565b7f496e73756666696369656e742066756e647320287769746864726177290000005f82015250565b5f612f30601d83612ccf565b9150612f3b82612efc565b602082019050919050565b5f6020820190508181035f830152612f5d81612f24565b9050919050565b5f81905092915050565b50565b5f612f7c5f83612f64565b9150612f8782612f6e565b5f82019050919050565b5f612f9b82612f71565b9150819050919050565b7f5769746864726177616c206661696c65640000000000000000000000000000005f82015250565b5f612fd9601183612ccf565b9150612fe482612fa5565b602082019050919050565b5f6020820190508181035f83015261300681612fcd565b9050919050565b7f4379636c6520746172676574206d757374206265203e203000000000000000005f82015250565b5f613041601883612ccf565b915061304c8261300d565b602082019050919050565b5f6020820190508181035f83015261306e81613035565b9050919050565b7f46756e6374696f6e206d7573742062652063616c6c6564207468726f756768205f8201527f64656c656761746563616c6c0000000000000000000000000000000000000000602082015250565b5f6130cf602c83612ccf565b91506130da82613075565b604082019050919050565b5f6020820190508181035f8301526130fc816130c3565b9050919050565b7f46756e6374696f6e206d7573742062652063616c6c6564207468726f756768205f8201527f6163746976652070726f78790000000000000000000000000000000000000000602082015250565b5f61315d602c83612ccf565b915061316882613103565b604082019050919050565b5f6020820190508181035f83015261318a81613151565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806131d557607f821691505b6020821081036131e8576131e7613191565b5b50919050565b7f555550535570677261646561626c653a206d757374206e6f742062652063616c5f8201527f6c6564207468726f7567682064656c656761746563616c6c0000000000000000602082015250565b5f613248603883612ccf565b9150613253826131ee565b604082019050919050565b5f6020820190508181035f8301526132758161323c565b9050919050565b7f496e76616c696420626f756e64730000000000000000000000000000000000005f82015250565b5f6132b0600e83612ccf565b91506132bb8261327c565b602082019050919050565b5f6020820190508181035f8301526132dd816132a4565b9050919050565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c7265615f8201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b5f61333e602e83612ccf565b9150613349826132e4565b604082019050919050565b5f6020820190508181035f83015261336b81613332565b9050919050565b5f819050919050565b5f60ff82169050919050565b5f819050919050565b5f6133aa6133a56133a084613372565b613387565b61337b565b9050919050565b6133ba81613390565b82525050565b5f6020820190506133d35f8301846133b1565b92915050565b7f4265742062656c6f77206d696e696d756d20616c6c6f776564000000000000005f82015250565b5f61340d601983612ccf565b9150613418826133d9565b602082019050919050565b5f6020820190508181035f83015261343a81613401565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f613478826129d5565b9150613483836129d5565b925082820190508082111561349b5761349a613441565b5b92915050565b7f436f6f6c646f776e2061637469766500000000000000000000000000000000005f82015250565b5f6134d5600f83612ccf565b91506134e0826134a1565b602082019050919050565b5f6020820190508181035f830152613502816134c9565b9050919050565b5f613513826129d5565b915061351e836129d5565b925082820261352c816129d5565b9150828204841483151761354357613542613441565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f613581826129d5565b915061358c836129d5565b92508261359c5761359b61354a565b5b828204905092915050565b7f496e73756666696369656e742066756e647320286a61636b706f7429000000005f82015250565b5f6135db601c83612ccf565b91506135e6826135a7565b602082019050919050565b5f6020820190508181035f830152613608816135cf565b9050919050565b7f5472616e73666572206661696c656400000000000000000000000000000000005f82015250565b5f613643600f83612ccf565b915061364e8261360f565b602082019050919050565b5f6020820190508181035f83015261367081613637565b9050919050565b5f60608201905061368a5f8301866129de565b818103602083015261369c8185612ced565b90506136ab60408301846129de565b949350505050565b7f496e73756666696369656e742066756e647320286e6f726d616c2077696e29005f82015250565b5f6136e7601f83612ccf565b91506136f2826136b3565b602082019050919050565b5f6020820190508181035f830152613714816136db565b9050919050565b7f4e6f726d616c2057696e000000000000000000000000000000000000000000005f82015250565b5f61374f600a83612ccf565b915061375a8261371b565b602082019050919050565b5f6060820190506137785f8301856129de565b818103602083015261378981613743565b905061379860408301846129de565b9392505050565b7f4c6f7373000000000000000000000000000000000000000000000000000000005f82015250565b5f6137d3600483612ccf565b91506137de8261379f565b602082019050919050565b5f819050919050565b5f61380c613807613802846137e9565b613387565b6129d5565b9050919050565b61381c816137f2565b82525050565b5f6060820190506138355f8301856129de565b8181036020830152613846816137c7565b90506138556040830184613813565b9392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f6138b6602683612ccf565b91506138c18261385c565b604082019050919050565b5f6020820190508181035f8301526138e3816138aa565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f61391e602083612ccf565b9150613929826138ea565b602082019050919050565b5f6020820190508181035f83015261394b81613912565b9050919050565b61395b81612d6f565b8114613965575f5ffd5b50565b5f8151905061397681613952565b92915050565b5f6020828403121561399157613990612a0f565b5b5f61399e84828501613968565b91505092915050565b7f45524331393637557067726164653a206e657720696d706c656d656e746174695f8201527f6f6e206973206e6f742055555053000000000000000000000000000000000000602082015250565b5f613a01602e83612ccf565b9150613a0c826139a7565b604082019050919050565b5f6020820190508181035f830152613a2e816139f5565b9050919050565b7f45524331393637557067726164653a20756e737570706f727465642070726f785f8201527f6961626c65555549440000000000000000000000000000000000000000000000602082015250565b5f613a8f602983612ccf565b9150613a9a82613a35565b604082019050919050565b5f6020820190508181035f830152613abc81613a83565b9050919050565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f7420695f8201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b5f613b1d602b83612ccf565b9150613b2882613ac3565b604082019050919050565b5f6020820190508181035f830152613b4a81613b11565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f613b85601f83612ccf565b9150613b9082613b51565b602082019050919050565b5f6020820190508181035f830152613bb281613b79565b9050919050565b5f613bc3826129d5565b9150613bce836129d5565b9250828203905081811115613be657613be5613441565b5b92915050565b5f819050919050565b613c06613c01826129d5565b613bec565b82525050565b5f8160601b9050919050565b5f613c2282613c0c565b9050919050565b5f613c3382613c18565b9050919050565b613c4b613c4682612a36565b613c29565b82525050565b5f613c5c8287613bf5565b602082019150613c6c8286613bf5565b602082019150613c7c8285613c3a565b601482019150613c8c8284613bf5565b60208201915081905095945050505050565b5f613ca8826129d5565b9150613cb3836129d5565b925082613cc357613cc261354a565b5b828206905092915050565b7f4d616a6f72204a61636b706f74000000000000000000000000000000000000005f82015250565b5f613d02600d83612ccf565b9150613d0d82613cce565b602082019050919050565b5f6040820190508181035f830152613d2f81613cf6565b9050613d3e60208301846129de565b92915050565b7f4d696e6f72204a61636b706f74000000000000000000000000000000000000005f82015250565b5f613d78600d83612ccf565b9150613d8382613d44565b602082019050919050565b5f6040820190508181035f830152613da581613d6c565b9050613db460208301846129de565b92915050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302613e167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613ddb565b613e208683613ddb565b95508019841693508086168417925050509392505050565b5f613e52613e4d613e48846129d5565b613387565b6129d5565b9050919050565b5f819050919050565b613e6b83613e38565b613e7f613e7782613e59565b848454613de7565b825550505050565b5f5f905090565b613e96613e87565b613ea1818484613e62565b505050565b5b81811015613ec457613eb95f82613e8e565b600181019050613ea7565b5050565b601f821115613f0957613eda81613dba565b613ee384613dcc565b81016020851015613ef2578190505b613f06613efe85613dcc565b830182613ea6565b50505b505050565b5f82821c905092915050565b5f613f295f1984600802613f0e565b1980831691505092915050565b5f613f418383613f1a565b9150826002028217905092915050565b613f5a82612cc5565b67ffffffffffffffff811115613f7357613f72612b09565b5b613f7d82546131be565b613f88828285613ec8565b5f60209050601f831160018114613fb9575f8415613fa7578287015190505b613fb18582613f36565b865550614018565b601f198416613fc786613dba565b5f5b82811015613fee57848901518255600182019150602085019450602081019050613fc9565b8683101561400b5784890151614007601f891682613f1a565b8355505b6001600288020188555050505b505050505050565b5f61402b8286613bf5565b60208201915061403b8285613c3a565b60148201915061404b8284613bf5565b602082019150819050949350505050565b7f496e76616c69642072616e6765000000000000000000000000000000000000005f82015250565b5f614090600d83612ccf565b915061409b8261405c565b602082019050919050565b5f6020820190508181035f8301526140bd81614084565b9050919050565b5f6140cf8286613bf5565b6020820191506140df8285613bf5565b6020820191506140ef8284613c3a565b601482019150819050949350505050565b7f455243313936373a206e657720696d706c656d656e746174696f6e206973206e5f8201527f6f74206120636f6e747261637400000000000000000000000000000000000000602082015250565b5f61415a602d83612ccf565b915061416582614100565b604082019050919050565b5f6020820190508181035f8301526141878161414e565b9050919050565b7f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f5f8201527f6e74726163740000000000000000000000000000000000000000000000000000602082015250565b5f6141e8602683612ccf565b91506141f38261418e565b604082019050919050565b5f6020820190508181035f830152614215816141dc565b9050919050565b5f81519050919050565b5f6142308261421c565b61423a8185612f64565b935061424a818560208601612cdf565b80840191505092915050565b5f6142618284614226565b915081905092915050565b5f6020820190508181035f8301526142848184612ced565b90509291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220c3ea8a03ec86cec28080fc6a4dacede8440880e44000e3740d565a73c2cd9f7164736f6c634300081c0033
Deployed Bytecode Sourcemap
54218:12215:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55166:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56125:51;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59553:189;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66103:254;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58999:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36073:200;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59430:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54356:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36532:225;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56620:43;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;55082:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35751:133;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54460:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59748:255;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54610:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54825:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55957:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58874:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58741:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19169:103;;;;;;;;;;;;;:::i;:::-;;54540:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55461:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57191:721;;;;;;;;;;;;;:::i;:::-;;55647:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18521:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55563:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54679:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55780:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55010:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56029;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55248:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59311:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58387:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59176:129;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58516:219;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58258:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55846:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54890:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54924;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63931:2108;;;:::i;:::-;;54748:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19427:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55166:29;;;;:::o;56125:51::-;;;;;;;;;;;;;;;;;:::o;59553:189::-;18407:13;:11;:13::i;:::-;59660:4:::1;59644:12;:20;;59636:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;59722:12;59704:15;:30;;;;59553:189:::0;:::o;66103:254::-;18407:13;:11;:13::i;:::-;66200:6:::1;66175:21;:31;;66167:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;66252:12;66270:7;:5;:7::i;:::-;:12;;66290:6;66270:31;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66251:50;;;66320:7;66312:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;66156:201;66103:254:::0;:::o;58999:171::-;18407:13;:11;:13::i;:::-;59097:1:::1;59084:10;:14;59076:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;59152:10;59138:11;:24;;;;58999:171:::0;:::o;36073:200::-;34621:6;34604:23;;34612:4;34604:23;;;34596:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;34719:6;34695:30;;:20;:18;:20::i;:::-;:30;;;34687:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;36157:36:::1;36175:17;36157;:36::i;:::-;36204:61;36226:17;36255:1;36245:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36259:5;36204:21;:61::i;:::-;36073:200:::0;:::o;59430:117::-;18407:13;:11;:13::i;:::-;59529:10:::1;59511:15;:28;;;;59430:117:::0;:::o;54356:33::-;;;;:::o;36532:225::-;34621:6;34604:23;;34612:4;34604:23;;;34596:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;34719:6;34695:30;;:20;:18;:20::i;:::-;:30;;;34687:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;36650:36:::1;36668:17;36650;:36::i;:::-;36697:52;36719:17;36738:4;36744;36697:21;:52::i;:::-;36532:225:::0;;:::o;56620:43::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;55082:31::-;;;;:::o;35751:133::-;35829:7;35066:6;35049:23;;35057:4;35049:23;;;35041:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;25992:66:::1;35856:20;;35849:27;;35751:133:::0;:::o;54460:33::-;;;;:::o;59748:255::-;18407:13;:11;:13::i;:::-;59872:1:::1;59859:10;:14;:41;;;;;59890:10;59877;:23;59859:41;59851:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59947:10;59930:14;:27;;;;59985:10;59968:14;:27;;;;59748:255:::0;;:::o;54610:35::-;;;;:::o;54825:33::-;;;;:::o;55957:41::-;55991:7;55957:41;:::o;58874:119::-;18407:13;:11;:13::i;:::-;58972::::1;58960:9;;:25;;;;;;;;;;;;;;;;;;58874:119:::0;:::o;58741:127::-;18407:13;:11;:13::i;:::-;58843:17:::1;58827:13;:33;;;;58741:127:::0;:::o;19169:103::-;18407:13;:11;:13::i;:::-;19234:30:::1;19261:1;19234:18;:30::i;:::-;19169:103::o:0;54540:35::-;;;;:::o;55461:30::-;;;;:::o;57191:721::-;12127:19;12150:13;;;;;;;;;;;12149:14;12127:36;;12197:14;:34;;;;;12230:1;12215:12;;;;;;;;;;;:16;;;12197:34;12196:108;;;;12238:44;12276:4;12238:29;:44::i;:::-;12237:45;:66;;;;;12302:1;12286:12;;;;;;;;;;;:17;;;12237:66;12196:108;12174:204;;;;;;;;;;;;:::i;:::-;;;;;;;;;12404:1;12389:12;;:16;;;;;;;;;;;;;;;;;;12420:14;12416:67;;;12467:4;12451:13;;:20;;;;;;;;;;;;;;;;;;12416:67;57243:16:::1;:14;:16::i;:::-;57270:24;:22;:24::i;:::-;57305;:22;:24::i;:::-;57362:10;57342:9;;:31;;;;;;;;;;;;;;;;;;57405:1;57384:18;:22;;;;57438:1;57417:18;:22;;;;57473:2;57450:20;:25;;;;57509:1;57486:20;:24;;;;57537:1;57521:13;:17;;;;57563:8;57549:11;:22;;;;57601:2;57582:16;:21;;;;57628:1;57614:11;:15;;;;57671:18;57653:15;:36;;;;57728:1;57710:15;:19;;;;57758:18;57740:15;:36;;;;57822:9;57805:14;:26;;;;57859:10;57842:14;:27;;;;57903:1;57882:18;:22;;;;12509:14:::0;12505:102;;;12556:5;12540:13;;:21;;;;;;;;;;;;;;;;;;12581:14;12593:1;12581:14;;;;;;:::i;:::-;;;;;;;;12505:102;12116:498;57191:721::o;55647:30::-;;;;:::o;18521:87::-;18567:7;18594:6;;;;;;;;;;;18587:13;;18521:87;:::o;55563:30::-;;;;:::o;54679:28::-;;;;:::o;55780:29::-;;;;:::o;55010:26::-;;;;:::o;56029:::-;;;;:::o;55248:32::-;;;;:::o;59311:113::-;18407:13;:11;:13::i;:::-;59404:12:::1;59390:11;:26;;;;59311:113:::0;:::o;58387:123::-;18407:13;:11;:13::i;:::-;58492:10:::1;58471:18;:31;;;;58387:123:::0;:::o;59176:129::-;18407:13;:11;:13::i;:::-;59282:15:::1;59263:16;:34;;;;59176:129:::0;:::o;58516:219::-;18407:13;:11;:13::i;:::-;58659:17:::1;58636:20;:40;;;;58710:17;58687:20;:40;;;;58516:219:::0;;:::o;58258:123::-;18407:13;:11;:13::i;:::-;58363:10:::1;58342:18;:31;;;;58258:123:::0;:::o;55846:29::-;;;;:::o;54890:27::-;;;;:::o;54924:::-;;;;:::o;63931:2108::-;40183:21;:19;:21::i;:::-;55991:7:::1;63996:9;:20;;63988:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;64115:11;;64084:16;:28;64101:10;64084:28;;;;;;;;;;;;;;;;:42;;;;:::i;:::-;64065:15;:61;;64057:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;64188:15;64157:16;:28;64174:10;64157:28;;;;;;;;;;;;;;;:46;;;;64216:17;64236:9;64216:29;;64256:17;64276:30;64296:9;64276:19;:30::i;:::-;64256:50;;64334:17;64384:3;64367:13;;64355:9;:25;;;;:::i;:::-;64354:33;;;;:::i;:::-;64334:53;;64402:17;64459:3;64435:20;;64423:9;:32;;;;:::i;:::-;64422:40;;;;:::i;:::-;64402:60;;64477:17;64534:3;64510:20;;64498:9;:32;;;;:::i;:::-;64497:40;;;;:::i;:::-;64477:60;;64568:1;64556:9;:13;64552:133;;;64590:9;;;;;;;;;;;:18;;:29;64609:9;64590:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64660:9;64638:18;;:31;;;;;;;:::i;:::-;;;;;;;;64552:133;64715:9;64699:12;;:25;;;;;;;:::i;:::-;;;;;;;;64755:9;64739:12;;:25;;;;;;;:::i;:::-;;;;;;;;64319:457;;;64789:15;64806:21;64829;64854:24;64868:9;64854:13;:24::i;:::-;64788:90;;;;;;64893:10;64889:423;;;64953:13;64928:21;:38;;64920:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;65015:12;65033:10;:15;;65056:13;65033:41;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65014:60;;;65097:7;65089:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;65155:10;65144:57;;;65167:9;65178:7;65187:13;65144:57;;;;;;;;:::i;:::-;;;;;;;;65216:63;65233:10;65245:9;65256:7;65265:13;65216:16;:63::i;:::-;65294:7;;;;;;;;64889:423;65325:14;65341:20;65365:24;65379:9;65365:13;:24::i;:::-;65324:65;;;;65404:9;65400:632;;;65463:12;65438:21;:37;;65430:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;65527:12;65545:10;:15;;65568:12;65545:40;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65526:59;;;65608:7;65600:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;65666:10;65655:61;;;65678:9;65703:12;65655:61;;;;;;;:::i;:::-;;;;;;;;65731:67;65748:10;65760:9;65731:67;;;;;;;;;;;;;;;;::::0;65785:12:::1;65731:16;:67::i;:::-;65827:46;65842:14;;65858;;65827;:46::i;:::-;65813:11;:60;;;;65415:470;65400:632;;;65922:10;65911:44;;;65934:9;65953:1;65911:44;;;;;;;:::i;:::-;;;;;;;;65970:50;65987:10;65999:9;65970:50;;;;;;;;;;;;;;;;::::0;66018:1:::1;65970:16;:50::i;:::-;65400:632;63977:2062;;;;;;;40215:1;40227:20:::0;:18;:20::i;:::-;63931:2108::o;54748:32::-;;;;;;;;;;;;;:::o;19427:201::-;18407:13;:11;:13::i;:::-;19536:1:::1;19516:22;;:8;:22;;::::0;19508:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;19592:28;19611:8;19592:18;:28::i;:::-;19427:201:::0;:::o;18686:132::-;18761:12;:10;:12::i;:::-;18750:23;;:7;:5;:7::i;:::-;:23;;;18742:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18686:132::o;26273:153::-;26326:7;26353:59;25992:66;26391:20;;26353:37;:59::i;:::-;:65;;;;;;;;;;;;26346:72;;26273:153;:::o;57965:116::-;18407:13;:11;:13::i;:::-;57965:116;:::o;27691:992::-;28145:53;25644:66;28183:14;;28145:37;:53::i;:::-;:59;;;;;;;;;;;;28141:535;;;28221:37;28240:17;28221:18;:37::i;:::-;28141:535;;;28324:17;28295:61;;;:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;28291:306;;28525:56;;;;;;;;;;:::i;:::-;;;;;;;;28291:306;25992:66;28417:20;;28409:4;:28;28401:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;28359:140;28611:53;28629:17;28648:4;28654:9;28611:17;:53::i;:::-;28141:535;27691:992;;;:::o;19788:191::-;19862:16;19881:6;;;;;;;;;;;19862:25;;19907:8;19898:6;;:17;;;;;;;;;;;;;;;;;;19962:8;19931:40;;19952:8;19931:40;;;;;;;;;;;;19851:128;19788:191;:::o;1438:326::-;1498:4;1755:1;1733:7;:19;;;:23;1726:30;;1438:326;;;:::o;18064:97::-;14270:13;;;;;;;;;;;14262:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;18127:26:::1;:24;:26::i;:::-;18064:97::o:0;33749:68::-;14270:13;;;;;;;;;;;14262:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;33749:68::o;39530:113::-;14270:13;;;;;;;;;;;14262:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;39601:34:::1;:32;:34::i;:::-;39530:113::o:0;40263:293::-;39488:1;40397:7;;:19;40389:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;39488:1;40530:7;:18;;;;40263:293::o;60268:327::-;60333:7;60353:17;60397:3;60380:13;;60374:3;:19;;;;:::i;:::-;60373:27;;;;:::i;:::-;60353:47;;60411:17;60462:3;60438:20;;60432:3;:26;;;;:::i;:::-;60431:34;;;;:::i;:::-;60411:54;;60476:17;60527:3;60503:20;;60497:3;:26;;;;:::i;:::-;60496:34;;;;:::i;:::-;60476:54;;60578:9;60566;60554;60548:3;:15;;;;:::i;:::-;:27;;;;:::i;:::-;:39;;;;:::i;:::-;60541:46;;;;;60268:327;;;:::o;61149:1232::-;61203:4;61209:13;61224:7;61244:17;61264:35;55991:7;61285:3;:13;;;;:::i;:::-;61264:20;:35::i;:::-;61244:55;;61314:28;61366:9;61345:18;;:30;;;;:::i;:::-;61314:61;;61413:4;61390:20;:27;61386:87;;;61457:4;61434:27;;61386:87;61483:28;61535:9;61514:18;;:30;;;;:::i;:::-;61483:61;;61582:4;61559:20;:27;61555:87;;;61626:4;61603:27;;61555:87;61652:17;61763:5;61707:15;61724:16;61742:10;61754:3;61690:68;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61680:79;;;;;;61672:88;;:96;;;;:::i;:::-;61652:116;;61795:20;61783:9;:32;:52;;;;;61834:1;61819:12;;:16;61783:52;61779:563;;;61852:14;61869:12;;61852:29;;61911:1;61896:12;:16;;;;61944:10;61932:48;;;61973:6;61932:48;;;;;;:::i;:::-;;;;;;;;62003:4;62026:6;61995:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61779:563;62091:20;62068;:43;;;;:::i;:::-;62055:9;:57;:77;;;;;62131:1;62116:12;;:16;62055:77;62051:291;;;62149:14;62166:12;;62149:29;;62208:1;62193:12;:16;;;;62241:10;62229:48;;;62270:6;62229:48;;;;;;:::i;:::-;;;;;;;;62300:4;62323:6;62292:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62051:291;62360:5;62371:1;62352:21;;;;;;;;;;;;;;;;;;;;;;;61149:1232;;;;;;:::o;56728:397::-;56892:10;:19;56903:7;56892:19;;;;;;;;;;;;;;;56931:175;;;;;;;;56965:15;56931:175;;;;57010:4;56931:175;;;;57042:8;56931:175;;;;57080:10;56931:175;;;56892:225;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;56728:397;;;;:::o;62551:1222::-;62611:4;62617:7;62637:9;62684:3;62669:11;;62650:16;;:30;;;;:::i;:::-;62649:38;;;;:::i;:::-;62637:50;;62744:9;62726:14;;:27;;;;;;;:::i;:::-;;;;;;;;62803:11;;62798:1;62786:9;:13;;;;:::i;:::-;62785:29;;;;:::i;:::-;62764:17;;:50;;;;;;;:::i;:::-;;;;;;;;62827:15;62874:1;62866:4;62846:17;;:24;;;;:::i;:::-;62845:30;;;;:::i;:::-;62827:48;;62900:4;62890:7;:14;62886:61;;;62931:4;62921:14;;62886:61;63050:4;63031:15;;63021:7;:25;;;;:::i;:::-;63002:15;;62995:4;:22;;;;:::i;:::-;62976:15;;:42;;;;:::i;:::-;:70;;;;:::i;:::-;62975:79;;;;:::i;:::-;62957:15;:97;;;;63087:11;;63069:14;;:29;63065:84;;63133:4;63115:15;:22;;;;63065:84;63159:21;63248:4;63229:15;;63210;;63203:4;:22;;;;:::i;:::-;63202:42;;;;:::i;:::-;63201:51;;;;:::i;:::-;63183:15;;:69;;;;:::i;:::-;63159:93;;63283:4;63267:13;:20;63263:73;;;63320:4;63304:20;;63263:73;63348:20;63450:4;63406:15;63423:10;63435:9;63389:56;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;63379:67;;;;;;63371:76;;:83;;;;:::i;:::-;63348:106;;63484:13;63469:12;:28;63465:273;;;63514:14;63531:17;;63514:34;;63619:1;63602:14;:18;;;;63655:1;63635:17;:21;;;;63689:1;63671:15;:19;;;;63713:4;63719:6;63705:21;;;;;;;;;;;63465:273;63756:5;63763:1;63748:17;;;;;;;;62551:1222;;;;:::o;60679:319::-;60752:7;60786:3;60780;:9;60772:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;60818:13;60840:3;60834;:9;;;;:::i;:::-;60818:25;;60854:12;60904:15;60921:16;60939:10;60887:63;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60877:74;;;;;;60869:83;;60854:98;;60987:3;60978:5;60971:4;:12;;;;:::i;:::-;60970:20;;;;:::i;:::-;60963:27;;;;60679:319;;;;:::o;40564:213::-;39444:1;40747:7;:22;;;;40564:213::o;16504:98::-;16557:7;16584:10;16577:17;;16504:98;:::o;23683:195::-;23744:21;23856:4;23846:14;;23683:195;;;:::o;23981:::-;24042:21;24154:4;24144:14;;23981:195;;;:::o;26522:284::-;26604:48;26634:17;26604:29;:48::i;:::-;26596:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;26781:17;26713:59;25992:66;26751:20;;26713:37;:59::i;:::-;:65;;;:85;;;;;;;;;;;;;;;;;;26522:284;:::o;27215:297::-;27358:29;27369:17;27358:10;:29::i;:::-;27416:1;27402:4;:11;:15;:28;;;;27421:9;27402:28;27398:107;;;27447:46;27469:17;27488:4;27447:21;:46::i;:::-;;27398:107;27215:297;;;:::o;18169:113::-;14270:13;;;;;;;;;;;14262:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;18242:32:::1;18261:12;:10;:12::i;:::-;18242:18;:32::i;:::-;18169:113::o:0;39651:111::-;14270:13;;;;;;;;;;;14262:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;39444:1:::1;39732:7;:22;;;;39651:111::o:0;47635:1673::-;47683:7;47712:1;47707;:6;47703:47;;47737:1;47730:8;;;;47703:47;48441:14;48475:1;48464:7;48469:1;48464:4;:7::i;:::-;:12;;48458:1;:19;;48441:36;;48943:1;48932:6;48928:1;:10;;;;;:::i;:::-;;;48919:6;:19;48918:26;;48909:35;;48993:1;48982:6;48978:1;:10;;;;;:::i;:::-;;;48969:6;:19;48968:26;;48959:35;;49043:1;49032:6;49028:1;:10;;;;;:::i;:::-;;;49019:6;:19;49018:26;;49009:35;;49093:1;49082:6;49078:1;:10;;;;;:::i;:::-;;;49069:6;:19;49068:26;;49059:35;;49143:1;49132:6;49128:1;:10;;;;;:::i;:::-;;;49119:6;:19;49118:26;;49109:35;;49193:1;49182:6;49178:1;:10;;;;;:::i;:::-;;;49169:6;:19;49168:26;;49159:35;;49243:1;49232:6;49228:1;:10;;;;;:::i;:::-;;;49219:6;:19;49218:26;;49209:35;;49266:23;49270:6;49282;49278:1;:10;;;;;:::i;:::-;;;49266:3;:23::i;:::-;49259:30;;;47635:1673;;;;:::o;26919:155::-;26986:37;27005:17;26986:18;:37::i;:::-;27048:17;27039:27;;;;;;;;;;;;26919:155;:::o;31952:461::-;32035:12;32068:37;32098:6;32068:29;:37::i;:::-;32060:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;32222:12;32236:23;32263:6;:19;;32283:4;32263:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32221:67;;;;32306:99;32342:7;32351:10;32306:99;;;;;;;;;;;;;;;;;:35;:99::i;:::-;32299:106;;;;31952:461;;;;:::o;49785:1019::-;49837:7;49857:14;49874:1;49857:18;;49930:1;49924:3;49915:5;:12;;:16;49911:102;;;49962:3;49952:13;;;;;49994:3;49984:13;;;;49911:102;50045:1;50040:2;50031:5;:11;;:15;50027:99;;;50077:2;50067:12;;;;;50108:2;50098:12;;;;50027:99;50158:1;50153:2;50144:5;:11;;:15;50140:99;;;50190:2;50180:12;;;;;50221:2;50211:12;;;;50140:99;50271:1;50266:2;50257:5;:11;;:15;50253:99;;;50303:2;50293:12;;;;;50334:2;50324:12;;;;50253:99;50383:1;50379;50370:5;:10;;:14;50366:96;;;50415:1;50405:11;;;;;50445:1;50435:11;;;;50366:96;50493:1;50489;50480:5;:10;;:14;50476:96;;;50525:1;50515:11;;;;;50555:1;50545:11;;;;50476:96;50603:1;50599;50590:5;:10;;:14;50586:96;;;50635:1;50625:11;;;;;50665:1;50655:11;;;;50586:96;50713:1;50709;50700:5;:10;;:14;50696:66;;;50745:1;50735:11;;;;50696:66;50790:6;50783:13;;;49785:1019;;;:::o;41811:106::-;41869:7;41900:1;41896;:5;:13;;41908:1;41896:13;;;41904:1;41896:13;41889:20;;41811:106;;;;:::o;7848:305::-;7998:12;8027:7;8023:123;;;8058:10;8051:17;;;;8023:123;8101:33;8109:10;8121:12;8101:7;:33::i;:::-;7848:305;;;;;;:::o;8161:552::-;8342:1;8322:10;:17;:21;8318:388;;;8554:10;8548:17;8611:15;8598:10;8594:2;8590:19;8583:44;8318:388;8681:12;8674:20;;;;;;;;;;;:::i;:::-;;;;;;;;7:77:1;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;442:75::-;475:6;508:2;502:9;492:19;;442:75;:::o;523:117::-;632:1;629;622:12;646:117;755:1;752;745:12;769:126;806:7;846:42;839:5;835:54;824:65;;769:126;;;:::o;901:96::-;938:7;967:24;985:5;967:24;:::i;:::-;956:35;;901:96;;;:::o;1003:122::-;1076:24;1094:5;1076:24;:::i;:::-;1069:5;1066:35;1056:63;;1115:1;1112;1105:12;1056:63;1003:122;:::o;1131:139::-;1177:5;1215:6;1202:20;1193:29;;1231:33;1258:5;1231:33;:::i;:::-;1131:139;;;;:::o;1276:329::-;1335:6;1384:2;1372:9;1363:7;1359:23;1355:32;1352:119;;;1390:79;;:::i;:::-;1352:119;1510:1;1535:53;1580:7;1571:6;1560:9;1556:22;1535:53;:::i;:::-;1525:63;;1481:117;1276:329;;;;:::o;1611:122::-;1684:24;1702:5;1684:24;:::i;:::-;1677:5;1674:35;1664:63;;1723:1;1720;1713:12;1664:63;1611:122;:::o;1739:139::-;1785:5;1823:6;1810:20;1801:29;;1839:33;1866:5;1839:33;:::i;:::-;1739:139;;;;:::o;1884:329::-;1943:6;1992:2;1980:9;1971:7;1967:23;1963:32;1960:119;;;1998:79;;:::i;:::-;1960:119;2118:1;2143:53;2188:7;2179:6;2168:9;2164:22;2143:53;:::i;:::-;2133:63;;2089:117;1884:329;;;;:::o;2219:117::-;2328:1;2325;2318:12;2342:117;2451:1;2448;2441:12;2465:102;2506:6;2557:2;2553:7;2548:2;2541:5;2537:14;2533:28;2523:38;;2465:102;;;:::o;2573:180::-;2621:77;2618:1;2611:88;2718:4;2715:1;2708:15;2742:4;2739:1;2732:15;2759:281;2842:27;2864:4;2842:27;:::i;:::-;2834:6;2830:40;2972:6;2960:10;2957:22;2936:18;2924:10;2921:34;2918:62;2915:88;;;2983:18;;:::i;:::-;2915:88;3023:10;3019:2;3012:22;2802:238;2759:281;;:::o;3046:129::-;3080:6;3107:20;;:::i;:::-;3097:30;;3136:33;3164:4;3156:6;3136:33;:::i;:::-;3046:129;;;:::o;3181:307::-;3242:4;3332:18;3324:6;3321:30;3318:56;;;3354:18;;:::i;:::-;3318:56;3392:29;3414:6;3392:29;:::i;:::-;3384:37;;3476:4;3470;3466:15;3458:23;;3181:307;;;:::o;3494:148::-;3592:6;3587:3;3582;3569:30;3633:1;3624:6;3619:3;3615:16;3608:27;3494:148;;;:::o;3648:423::-;3725:5;3750:65;3766:48;3807:6;3766:48;:::i;:::-;3750:65;:::i;:::-;3741:74;;3838:6;3831:5;3824:21;3876:4;3869:5;3865:16;3914:3;3905:6;3900:3;3896:16;3893:25;3890:112;;;3921:79;;:::i;:::-;3890:112;4011:54;4058:6;4053:3;4048;4011:54;:::i;:::-;3731:340;3648:423;;;;;:::o;4090:338::-;4145:5;4194:3;4187:4;4179:6;4175:17;4171:27;4161:122;;4202:79;;:::i;:::-;4161:122;4319:6;4306:20;4344:78;4418:3;4410:6;4403:4;4395:6;4391:17;4344:78;:::i;:::-;4335:87;;4151:277;4090:338;;;;:::o;4434:652::-;4511:6;4519;4568:2;4556:9;4547:7;4543:23;4539:32;4536:119;;;4574:79;;:::i;:::-;4536:119;4694:1;4719:53;4764:7;4755:6;4744:9;4740:22;4719:53;:::i;:::-;4709:63;;4665:117;4849:2;4838:9;4834:18;4821:32;4880:18;4872:6;4869:30;4866:117;;;4902:79;;:::i;:::-;4866:117;5007:62;5061:7;5052:6;5041:9;5037:22;5007:62;:::i;:::-;4997:72;;4792:287;4434:652;;;;;:::o;5092:474::-;5160:6;5168;5217:2;5205:9;5196:7;5192:23;5188:32;5185:119;;;5223:79;;:::i;:::-;5185:119;5343:1;5368:53;5413:7;5404:6;5393:9;5389:22;5368:53;:::i;:::-;5358:63;;5314:117;5470:2;5496:53;5541:7;5532:6;5521:9;5517:22;5496:53;:::i;:::-;5486:63;;5441:118;5092:474;;;;;:::o;5572:99::-;5624:6;5658:5;5652:12;5642:22;;5572:99;;;:::o;5677:169::-;5761:11;5795:6;5790:3;5783:19;5835:4;5830:3;5826:14;5811:29;;5677:169;;;;:::o;5852:139::-;5941:6;5936:3;5931;5925:23;5982:1;5973:6;5968:3;5964:16;5957:27;5852:139;;;:::o;5997:377::-;6085:3;6113:39;6146:5;6113:39;:::i;:::-;6168:71;6232:6;6227:3;6168:71;:::i;:::-;6161:78;;6248:65;6306:6;6301:3;6294:4;6287:5;6283:16;6248:65;:::i;:::-;6338:29;6360:6;6338:29;:::i;:::-;6333:3;6329:39;6322:46;;6089:285;5997:377;;;;:::o;6380:644::-;6577:4;6615:3;6604:9;6600:19;6592:27;;6629:71;6697:1;6686:9;6682:17;6673:6;6629:71;:::i;:::-;6710:72;6778:2;6767:9;6763:18;6754:6;6710:72;:::i;:::-;6829:9;6823:4;6819:20;6814:2;6803:9;6799:18;6792:48;6857:78;6930:4;6921:6;6857:78;:::i;:::-;6849:86;;6945:72;7013:2;7002:9;6998:18;6989:6;6945:72;:::i;:::-;6380:644;;;;;;;:::o;7030:77::-;7067:7;7096:5;7085:16;;7030:77;;;:::o;7113:118::-;7200:24;7218:5;7200:24;:::i;:::-;7195:3;7188:37;7113:118;;:::o;7237:222::-;7330:4;7368:2;7357:9;7353:18;7345:26;;7381:71;7449:1;7438:9;7434:17;7425:6;7381:71;:::i;:::-;7237:222;;;;:::o;7465:474::-;7533:6;7541;7590:2;7578:9;7569:7;7565:23;7561:32;7558:119;;;7596:79;;:::i;:::-;7558:119;7716:1;7741:53;7786:7;7777:6;7766:9;7762:22;7741:53;:::i;:::-;7731:63;;7687:117;7843:2;7869:53;7914:7;7905:6;7894:9;7890:22;7869:53;:::i;:::-;7859:63;;7814:118;7465:474;;;;;:::o;7945:104::-;7990:7;8019:24;8037:5;8019:24;:::i;:::-;8008:35;;7945:104;;;:::o;8055:138::-;8136:32;8162:5;8136:32;:::i;:::-;8129:5;8126:43;8116:71;;8183:1;8180;8173:12;8116:71;8055:138;:::o;8199:155::-;8253:5;8291:6;8278:20;8269:29;;8307:41;8342:5;8307:41;:::i;:::-;8199:155;;;;:::o;8360:345::-;8427:6;8476:2;8464:9;8455:7;8451:23;8447:32;8444:119;;;8482:79;;:::i;:::-;8444:119;8602:1;8627:61;8680:7;8671:6;8660:9;8656:22;8627:61;:::i;:::-;8617:71;;8573:125;8360:345;;;;:::o;8711:118::-;8798:24;8816:5;8798:24;:::i;:::-;8793:3;8786:37;8711:118;;:::o;8835:222::-;8928:4;8966:2;8955:9;8951:18;8943:26;;8979:71;9047:1;9036:9;9032:17;9023:6;8979:71;:::i;:::-;8835:222;;;;:::o;9063:142::-;9166:32;9192:5;9166:32;:::i;:::-;9161:3;9154:45;9063:142;;:::o;9211:254::-;9320:4;9358:2;9347:9;9343:18;9335:26;;9371:87;9455:1;9444:9;9440:17;9431:6;9371:87;:::i;:::-;9211:254;;;;:::o;9471:174::-;9611:26;9607:1;9599:6;9595:14;9588:50;9471:174;:::o;9651:366::-;9793:3;9814:67;9878:2;9873:3;9814:67;:::i;:::-;9807:74;;9890:93;9979:3;9890:93;:::i;:::-;10008:2;10003:3;9999:12;9992:19;;9651:366;;;:::o;10023:419::-;10189:4;10227:2;10216:9;10212:18;10204:26;;10276:9;10270:4;10266:20;10262:1;10251:9;10247:17;10240:47;10304:131;10430:4;10304:131;:::i;:::-;10296:139;;10023:419;;;:::o;10448:179::-;10588:31;10584:1;10576:6;10572:14;10565:55;10448:179;:::o;10633:366::-;10775:3;10796:67;10860:2;10855:3;10796:67;:::i;:::-;10789:74;;10872:93;10961:3;10872:93;:::i;:::-;10990:2;10985:3;10981:12;10974:19;;10633:366;;;:::o;11005:419::-;11171:4;11209:2;11198:9;11194:18;11186:26;;11258:9;11252:4;11248:20;11244:1;11233:9;11229:17;11222:47;11286:131;11412:4;11286:131;:::i;:::-;11278:139;;11005:419;;;:::o;11430:147::-;11531:11;11568:3;11553:18;;11430:147;;;;:::o;11583:114::-;;:::o;11703:398::-;11862:3;11883:83;11964:1;11959:3;11883:83;:::i;:::-;11876:90;;11975:93;12064:3;11975:93;:::i;:::-;12093:1;12088:3;12084:11;12077:18;;11703:398;;;:::o;12107:379::-;12291:3;12313:147;12456:3;12313:147;:::i;:::-;12306:154;;12477:3;12470:10;;12107:379;;;:::o;12492:167::-;12632:19;12628:1;12620:6;12616:14;12609:43;12492:167;:::o;12665:366::-;12807:3;12828:67;12892:2;12887:3;12828:67;:::i;:::-;12821:74;;12904:93;12993:3;12904:93;:::i;:::-;13022:2;13017:3;13013:12;13006:19;;12665:366;;;:::o;13037:419::-;13203:4;13241:2;13230:9;13226:18;13218:26;;13290:9;13284:4;13280:20;13276:1;13265:9;13261:17;13254:47;13318:131;13444:4;13318:131;:::i;:::-;13310:139;;13037:419;;;:::o;13462:174::-;13602:26;13598:1;13590:6;13586:14;13579:50;13462:174;:::o;13642:366::-;13784:3;13805:67;13869:2;13864:3;13805:67;:::i;:::-;13798:74;;13881:93;13970:3;13881:93;:::i;:::-;13999:2;13994:3;13990:12;13983:19;;13642:366;;;:::o;14014:419::-;14180:4;14218:2;14207:9;14203:18;14195:26;;14267:9;14261:4;14257:20;14253:1;14242:9;14238:17;14231:47;14295:131;14421:4;14295:131;:::i;:::-;14287:139;;14014:419;;;:::o;14439:231::-;14579:34;14575:1;14567:6;14563:14;14556:58;14648:14;14643:2;14635:6;14631:15;14624:39;14439:231;:::o;14676:366::-;14818:3;14839:67;14903:2;14898:3;14839:67;:::i;:::-;14832:74;;14915:93;15004:3;14915:93;:::i;:::-;15033:2;15028:3;15024:12;15017:19;;14676:366;;;:::o;15048:419::-;15214:4;15252:2;15241:9;15237:18;15229:26;;15301:9;15295:4;15291:20;15287:1;15276:9;15272:17;15265:47;15329:131;15455:4;15329:131;:::i;:::-;15321:139;;15048:419;;;:::o;15473:231::-;15613:34;15609:1;15601:6;15597:14;15590:58;15682:14;15677:2;15669:6;15665:15;15658:39;15473:231;:::o;15710:366::-;15852:3;15873:67;15937:2;15932:3;15873:67;:::i;:::-;15866:74;;15949:93;16038:3;15949:93;:::i;:::-;16067:2;16062:3;16058:12;16051:19;;15710:366;;;:::o;16082:419::-;16248:4;16286:2;16275:9;16271:18;16263:26;;16335:9;16329:4;16325:20;16321:1;16310:9;16306:17;16299:47;16363:131;16489:4;16363:131;:::i;:::-;16355:139;;16082:419;;;:::o;16507:180::-;16555:77;16552:1;16545:88;16652:4;16649:1;16642:15;16676:4;16673:1;16666:15;16693:320;16737:6;16774:1;16768:4;16764:12;16754:22;;16821:1;16815:4;16811:12;16842:18;16832:81;;16898:4;16890:6;16886:17;16876:27;;16832:81;16960:2;16952:6;16949:14;16929:18;16926:38;16923:84;;16979:18;;:::i;:::-;16923:84;16744:269;16693:320;;;:::o;17019:243::-;17159:34;17155:1;17147:6;17143:14;17136:58;17228:26;17223:2;17215:6;17211:15;17204:51;17019:243;:::o;17268:366::-;17410:3;17431:67;17495:2;17490:3;17431:67;:::i;:::-;17424:74;;17507:93;17596:3;17507:93;:::i;:::-;17625:2;17620:3;17616:12;17609:19;;17268:366;;;:::o;17640:419::-;17806:4;17844:2;17833:9;17829:18;17821:26;;17893:9;17887:4;17883:20;17879:1;17868:9;17864:17;17857:47;17921:131;18047:4;17921:131;:::i;:::-;17913:139;;17640:419;;;:::o;18065:164::-;18205:16;18201:1;18193:6;18189:14;18182:40;18065:164;:::o;18235:366::-;18377:3;18398:67;18462:2;18457:3;18398:67;:::i;:::-;18391:74;;18474:93;18563:3;18474:93;:::i;:::-;18592:2;18587:3;18583:12;18576:19;;18235:366;;;:::o;18607:419::-;18773:4;18811:2;18800:9;18796:18;18788:26;;18860:9;18854:4;18850:20;18846:1;18835:9;18831:17;18824:47;18888:131;19014:4;18888:131;:::i;:::-;18880:139;;18607:419;;;:::o;19032:233::-;19172:34;19168:1;19160:6;19156:14;19149:58;19241:16;19236:2;19228:6;19224:15;19217:41;19032:233;:::o;19271:366::-;19413:3;19434:67;19498:2;19493:3;19434:67;:::i;:::-;19427:74;;19510:93;19599:3;19510:93;:::i;:::-;19628:2;19623:3;19619:12;19612:19;;19271:366;;;:::o;19643:419::-;19809:4;19847:2;19836:9;19832:18;19824:26;;19896:9;19890:4;19886:20;19882:1;19871:9;19867:17;19860:47;19924:131;20050:4;19924:131;:::i;:::-;19916:139;;19643:419;;;:::o;20068:85::-;20113:7;20142:5;20131:16;;20068:85;;;:::o;20159:86::-;20194:7;20234:4;20227:5;20223:16;20212:27;;20159:86;;;:::o;20251:60::-;20279:3;20300:5;20293:12;;20251:60;;;:::o;20317:154::-;20373:9;20406:59;20422:42;20431:32;20457:5;20431:32;:::i;:::-;20422:42;:::i;:::-;20406:59;:::i;:::-;20393:72;;20317:154;;;:::o;20477:143::-;20570:43;20607:5;20570:43;:::i;:::-;20565:3;20558:56;20477:143;;:::o;20626:234::-;20725:4;20763:2;20752:9;20748:18;20740:26;;20776:77;20850:1;20839:9;20835:17;20826:6;20776:77;:::i;:::-;20626:234;;;;:::o;20866:175::-;21006:27;21002:1;20994:6;20990:14;20983:51;20866:175;:::o;21047:366::-;21189:3;21210:67;21274:2;21269:3;21210:67;:::i;:::-;21203:74;;21286:93;21375:3;21286:93;:::i;:::-;21404:2;21399:3;21395:12;21388:19;;21047:366;;;:::o;21419:419::-;21585:4;21623:2;21612:9;21608:18;21600:26;;21672:9;21666:4;21662:20;21658:1;21647:9;21643:17;21636:47;21700:131;21826:4;21700:131;:::i;:::-;21692:139;;21419:419;;;:::o;21844:180::-;21892:77;21889:1;21882:88;21989:4;21986:1;21979:15;22013:4;22010:1;22003:15;22030:191;22070:3;22089:20;22107:1;22089:20;:::i;:::-;22084:25;;22123:20;22141:1;22123:20;:::i;:::-;22118:25;;22166:1;22163;22159:9;22152:16;;22187:3;22184:1;22181:10;22178:36;;;22194:18;;:::i;:::-;22178:36;22030:191;;;;:::o;22227:165::-;22367:17;22363:1;22355:6;22351:14;22344:41;22227:165;:::o;22398:366::-;22540:3;22561:67;22625:2;22620:3;22561:67;:::i;:::-;22554:74;;22637:93;22726:3;22637:93;:::i;:::-;22755:2;22750:3;22746:12;22739:19;;22398:366;;;:::o;22770:419::-;22936:4;22974:2;22963:9;22959:18;22951:26;;23023:9;23017:4;23013:20;23009:1;22998:9;22994:17;22987:47;23051:131;23177:4;23051:131;:::i;:::-;23043:139;;22770:419;;;:::o;23195:410::-;23235:7;23258:20;23276:1;23258:20;:::i;:::-;23253:25;;23292:20;23310:1;23292:20;:::i;:::-;23287:25;;23347:1;23344;23340:9;23369:30;23387:11;23369:30;:::i;:::-;23358:41;;23548:1;23539:7;23535:15;23532:1;23529:22;23509:1;23502:9;23482:83;23459:139;;23578:18;;:::i;:::-;23459:139;23243:362;23195:410;;;;:::o;23611:180::-;23659:77;23656:1;23649:88;23756:4;23753:1;23746:15;23780:4;23777:1;23770:15;23797:185;23837:1;23854:20;23872:1;23854:20;:::i;:::-;23849:25;;23888:20;23906:1;23888:20;:::i;:::-;23883:25;;23927:1;23917:35;;23932:18;;:::i;:::-;23917:35;23974:1;23971;23967:9;23962:14;;23797:185;;;;:::o;23988:178::-;24128:30;24124:1;24116:6;24112:14;24105:54;23988:178;:::o;24172:366::-;24314:3;24335:67;24399:2;24394:3;24335:67;:::i;:::-;24328:74;;24411:93;24500:3;24411:93;:::i;:::-;24529:2;24524:3;24520:12;24513:19;;24172:366;;;:::o;24544:419::-;24710:4;24748:2;24737:9;24733:18;24725:26;;24797:9;24791:4;24787:20;24783:1;24772:9;24768:17;24761:47;24825:131;24951:4;24825:131;:::i;:::-;24817:139;;24544:419;;;:::o;24969:165::-;25109:17;25105:1;25097:6;25093:14;25086:41;24969:165;:::o;25140:366::-;25282:3;25303:67;25367:2;25362:3;25303:67;:::i;:::-;25296:74;;25379:93;25468:3;25379:93;:::i;:::-;25497:2;25492:3;25488:12;25481:19;;25140:366;;;:::o;25512:419::-;25678:4;25716:2;25705:9;25701:18;25693:26;;25765:9;25759:4;25755:20;25751:1;25740:9;25736:17;25729:47;25793:131;25919:4;25793:131;:::i;:::-;25785:139;;25512:419;;;:::o;25937:533::-;26106:4;26144:2;26133:9;26129:18;26121:26;;26157:71;26225:1;26214:9;26210:17;26201:6;26157:71;:::i;:::-;26275:9;26269:4;26265:20;26260:2;26249:9;26245:18;26238:48;26303:78;26376:4;26367:6;26303:78;:::i;:::-;26295:86;;26391:72;26459:2;26448:9;26444:18;26435:6;26391:72;:::i;:::-;25937:533;;;;;;:::o;26476:181::-;26616:33;26612:1;26604:6;26600:14;26593:57;26476:181;:::o;26663:366::-;26805:3;26826:67;26890:2;26885:3;26826:67;:::i;:::-;26819:74;;26902:93;26991:3;26902:93;:::i;:::-;27020:2;27015:3;27011:12;27004:19;;26663:366;;;:::o;27035:419::-;27201:4;27239:2;27228:9;27224:18;27216:26;;27288:9;27282:4;27278:20;27274:1;27263:9;27259:17;27252:47;27316:131;27442:4;27316:131;:::i;:::-;27308:139;;27035:419;;;:::o;27460:160::-;27600:12;27596:1;27588:6;27584:14;27577:36;27460:160;:::o;27626:366::-;27768:3;27789:67;27853:2;27848:3;27789:67;:::i;:::-;27782:74;;27865:93;27954:3;27865:93;:::i;:::-;27983:2;27978:3;27974:12;27967:19;;27626:366;;;:::o;27998:639::-;28220:4;28258:2;28247:9;28243:18;28235:26;;28271:71;28339:1;28328:9;28324:17;28315:6;28271:71;:::i;:::-;28389:9;28383:4;28379:20;28374:2;28363:9;28359:18;28352:48;28417:131;28543:4;28417:131;:::i;:::-;28409:139;;28558:72;28626:2;28615:9;28611:18;28602:6;28558:72;:::i;:::-;27998:639;;;;;:::o;28643:154::-;28783:6;28779:1;28771:6;28767:14;28760:30;28643:154;:::o;28803:365::-;28945:3;28966:66;29030:1;29025:3;28966:66;:::i;:::-;28959:73;;29041:93;29130:3;29041:93;:::i;:::-;29159:2;29154:3;29150:12;29143:19;;28803:365;;;:::o;29174:85::-;29219:7;29248:5;29237:16;;29174:85;;;:::o;29265:158::-;29323:9;29356:61;29374:42;29383:32;29409:5;29383:32;:::i;:::-;29374:42;:::i;:::-;29356:61;:::i;:::-;29343:74;;29265:158;;;:::o;29429:147::-;29524:45;29563:5;29524:45;:::i;:::-;29519:3;29512:58;29429:147;;:::o;29582:655::-;29812:4;29850:2;29839:9;29835:18;29827:26;;29863:71;29931:1;29920:9;29916:17;29907:6;29863:71;:::i;:::-;29981:9;29975:4;29971:20;29966:2;29955:9;29951:18;29944:48;30009:131;30135:4;30009:131;:::i;:::-;30001:139;;30150:80;30226:2;30215:9;30211:18;30202:6;30150:80;:::i;:::-;29582:655;;;;;:::o;30243:225::-;30383:34;30379:1;30371:6;30367:14;30360:58;30452:8;30447:2;30439:6;30435:15;30428:33;30243:225;:::o;30474:366::-;30616:3;30637:67;30701:2;30696:3;30637:67;:::i;:::-;30630:74;;30713:93;30802:3;30713:93;:::i;:::-;30831:2;30826:3;30822:12;30815:19;;30474:366;;;:::o;30846:419::-;31012:4;31050:2;31039:9;31035:18;31027:26;;31099:9;31093:4;31089:20;31085:1;31074:9;31070:17;31063:47;31127:131;31253:4;31127:131;:::i;:::-;31119:139;;30846:419;;;:::o;31271:182::-;31411:34;31407:1;31399:6;31395:14;31388:58;31271:182;:::o;31459:366::-;31601:3;31622:67;31686:2;31681:3;31622:67;:::i;:::-;31615:74;;31698:93;31787:3;31698:93;:::i;:::-;31816:2;31811:3;31807:12;31800:19;;31459:366;;;:::o;31831:419::-;31997:4;32035:2;32024:9;32020:18;32012:26;;32084:9;32078:4;32074:20;32070:1;32059:9;32055:17;32048:47;32112:131;32238:4;32112:131;:::i;:::-;32104:139;;31831:419;;;:::o;32256:122::-;32329:24;32347:5;32329:24;:::i;:::-;32322:5;32319:35;32309:63;;32368:1;32365;32358:12;32309:63;32256:122;:::o;32384:143::-;32441:5;32472:6;32466:13;32457:22;;32488:33;32515:5;32488:33;:::i;:::-;32384:143;;;;:::o;32533:351::-;32603:6;32652:2;32640:9;32631:7;32627:23;32623:32;32620:119;;;32658:79;;:::i;:::-;32620:119;32778:1;32803:64;32859:7;32850:6;32839:9;32835:22;32803:64;:::i;:::-;32793:74;;32749:128;32533:351;;;;:::o;32890:233::-;33030:34;33026:1;33018:6;33014:14;33007:58;33099:16;33094:2;33086:6;33082:15;33075:41;32890:233;:::o;33129:366::-;33271:3;33292:67;33356:2;33351:3;33292:67;:::i;:::-;33285:74;;33368:93;33457:3;33368:93;:::i;:::-;33486:2;33481:3;33477:12;33470:19;;33129:366;;;:::o;33501:419::-;33667:4;33705:2;33694:9;33690:18;33682:26;;33754:9;33748:4;33744:20;33740:1;33729:9;33725:17;33718:47;33782:131;33908:4;33782:131;:::i;:::-;33774:139;;33501:419;;;:::o;33926:228::-;34066:34;34062:1;34054:6;34050:14;34043:58;34135:11;34130:2;34122:6;34118:15;34111:36;33926:228;:::o;34160:366::-;34302:3;34323:67;34387:2;34382:3;34323:67;:::i;:::-;34316:74;;34399:93;34488:3;34399:93;:::i;:::-;34517:2;34512:3;34508:12;34501:19;;34160:366;;;:::o;34532:419::-;34698:4;34736:2;34725:9;34721:18;34713:26;;34785:9;34779:4;34775:20;34771:1;34760:9;34756:17;34749:47;34813:131;34939:4;34813:131;:::i;:::-;34805:139;;34532:419;;;:::o;34957:230::-;35097:34;35093:1;35085:6;35081:14;35074:58;35166:13;35161:2;35153:6;35149:15;35142:38;34957:230;:::o;35193:366::-;35335:3;35356:67;35420:2;35415:3;35356:67;:::i;:::-;35349:74;;35432:93;35521:3;35432:93;:::i;:::-;35550:2;35545:3;35541:12;35534:19;;35193:366;;;:::o;35565:419::-;35731:4;35769:2;35758:9;35754:18;35746:26;;35818:9;35812:4;35808:20;35804:1;35793:9;35789:17;35782:47;35846:131;35972:4;35846:131;:::i;:::-;35838:139;;35565:419;;;:::o;35990:181::-;36130:33;36126:1;36118:6;36114:14;36107:57;35990:181;:::o;36177:366::-;36319:3;36340:67;36404:2;36399:3;36340:67;:::i;:::-;36333:74;;36416:93;36505:3;36416:93;:::i;:::-;36534:2;36529:3;36525:12;36518:19;;36177:366;;;:::o;36549:419::-;36715:4;36753:2;36742:9;36738:18;36730:26;;36802:9;36796:4;36792:20;36788:1;36777:9;36773:17;36766:47;36830:131;36956:4;36830:131;:::i;:::-;36822:139;;36549:419;;;:::o;36974:194::-;37014:4;37034:20;37052:1;37034:20;:::i;:::-;37029:25;;37068:20;37086:1;37068:20;:::i;:::-;37063:25;;37112:1;37109;37105:9;37097:17;;37136:1;37130:4;37127:11;37124:37;;;37141:18;;:::i;:::-;37124:37;36974:194;;;;:::o;37174:79::-;37213:7;37242:5;37231:16;;37174:79;;;:::o;37259:157::-;37364:45;37384:24;37402:5;37384:24;:::i;:::-;37364:45;:::i;:::-;37359:3;37352:58;37259:157;;:::o;37422:94::-;37455:8;37503:5;37499:2;37495:14;37474:35;;37422:94;;;:::o;37522:::-;37561:7;37590:20;37604:5;37590:20;:::i;:::-;37579:31;;37522:94;;;:::o;37622:100::-;37661:7;37690:26;37710:5;37690:26;:::i;:::-;37679:37;;37622:100;;;:::o;37728:157::-;37833:45;37853:24;37871:5;37853:24;:::i;:::-;37833:45;:::i;:::-;37828:3;37821:58;37728:157;;:::o;37891:679::-;38087:3;38102:75;38173:3;38164:6;38102:75;:::i;:::-;38202:2;38197:3;38193:12;38186:19;;38215:75;38286:3;38277:6;38215:75;:::i;:::-;38315:2;38310:3;38306:12;38299:19;;38328:75;38399:3;38390:6;38328:75;:::i;:::-;38428:2;38423:3;38419:12;38412:19;;38441:75;38512:3;38503:6;38441:75;:::i;:::-;38541:2;38536:3;38532:12;38525:19;;38561:3;38554:10;;37891:679;;;;;;;:::o;38576:176::-;38608:1;38625:20;38643:1;38625:20;:::i;:::-;38620:25;;38659:20;38677:1;38659:20;:::i;:::-;38654:25;;38698:1;38688:35;;38703:18;;:::i;:::-;38688:35;38744:1;38741;38737:9;38732:14;;38576:176;;;;:::o;38758:163::-;38898:15;38894:1;38886:6;38882:14;38875:39;38758:163;:::o;38927:366::-;39069:3;39090:67;39154:2;39149:3;39090:67;:::i;:::-;39083:74;;39166:93;39255:3;39166:93;:::i;:::-;39284:2;39279:3;39275:12;39268:19;;38927:366;;;:::o;39299:529::-;39493:4;39531:2;39520:9;39516:18;39508:26;;39580:9;39574:4;39570:20;39566:1;39555:9;39551:17;39544:47;39608:131;39734:4;39608:131;:::i;:::-;39600:139;;39749:72;39817:2;39806:9;39802:18;39793:6;39749:72;:::i;:::-;39299:529;;;;:::o;39834:163::-;39974:15;39970:1;39962:6;39958:14;39951:39;39834:163;:::o;40003:366::-;40145:3;40166:67;40230:2;40225:3;40166:67;:::i;:::-;40159:74;;40242:93;40331:3;40242:93;:::i;:::-;40360:2;40355:3;40351:12;40344:19;;40003:366;;;:::o;40375:529::-;40569:4;40607:2;40596:9;40592:18;40584:26;;40656:9;40650:4;40646:20;40642:1;40631:9;40627:17;40620:47;40684:131;40810:4;40684:131;:::i;:::-;40676:139;;40825:72;40893:2;40882:9;40878:18;40869:6;40825:72;:::i;:::-;40375:529;;;;:::o;40910:141::-;40959:4;40982:3;40974:11;;41005:3;41002:1;40995:14;41039:4;41036:1;41026:18;41018:26;;40910:141;;;:::o;41057:93::-;41094:6;41141:2;41136;41129:5;41125:14;41121:23;41111:33;;41057:93;;;:::o;41156:107::-;41200:8;41250:5;41244:4;41240:16;41219:37;;41156:107;;;;:::o;41269:393::-;41338:6;41388:1;41376:10;41372:18;41411:97;41441:66;41430:9;41411:97;:::i;:::-;41529:39;41559:8;41548:9;41529:39;:::i;:::-;41517:51;;41601:4;41597:9;41590:5;41586:21;41577:30;;41650:4;41640:8;41636:19;41629:5;41626:30;41616:40;;41345:317;;41269:393;;;;;:::o;41668:142::-;41718:9;41751:53;41769:34;41778:24;41796:5;41778:24;:::i;:::-;41769:34;:::i;:::-;41751:53;:::i;:::-;41738:66;;41668:142;;;:::o;41816:75::-;41859:3;41880:5;41873:12;;41816:75;;;:::o;41897:269::-;42007:39;42038:7;42007:39;:::i;:::-;42068:91;42117:41;42141:16;42117:41;:::i;:::-;42109:6;42102:4;42096:11;42068:91;:::i;:::-;42062:4;42055:105;41973:193;41897:269;;;:::o;42172:73::-;42217:3;42238:1;42231:8;;42172:73;:::o;42251:189::-;42328:32;;:::i;:::-;42369:65;42427:6;42419;42413:4;42369:65;:::i;:::-;42304:136;42251:189;;:::o;42446:186::-;42506:120;42523:3;42516:5;42513:14;42506:120;;;42577:39;42614:1;42607:5;42577:39;:::i;:::-;42550:1;42543:5;42539:13;42530:22;;42506:120;;;42446:186;;:::o;42638:543::-;42739:2;42734:3;42731:11;42728:446;;;42773:38;42805:5;42773:38;:::i;:::-;42857:29;42875:10;42857:29;:::i;:::-;42847:8;42843:44;43040:2;43028:10;43025:18;43022:49;;;43061:8;43046:23;;43022:49;43084:80;43140:22;43158:3;43140:22;:::i;:::-;43130:8;43126:37;43113:11;43084:80;:::i;:::-;42743:431;;42728:446;42638:543;;;:::o;43187:117::-;43241:8;43291:5;43285:4;43281:16;43260:37;;43187:117;;;;:::o;43310:169::-;43354:6;43387:51;43435:1;43431:6;43423:5;43420:1;43416:13;43387:51;:::i;:::-;43383:56;43468:4;43462;43458:15;43448:25;;43361:118;43310:169;;;;:::o;43484:295::-;43560:4;43706:29;43731:3;43725:4;43706:29;:::i;:::-;43698:37;;43768:3;43765:1;43761:11;43755:4;43752:21;43744:29;;43484:295;;;;:::o;43784:1395::-;43901:37;43934:3;43901:37;:::i;:::-;44003:18;43995:6;43992:30;43989:56;;;44025:18;;:::i;:::-;43989:56;44069:38;44101:4;44095:11;44069:38;:::i;:::-;44154:67;44214:6;44206;44200:4;44154:67;:::i;:::-;44248:1;44272:4;44259:17;;44304:2;44296:6;44293:14;44321:1;44316:618;;;;44978:1;44995:6;44992:77;;;45044:9;45039:3;45035:19;45029:26;45020:35;;44992:77;45095:67;45155:6;45148:5;45095:67;:::i;:::-;45089:4;45082:81;44951:222;44286:887;;44316:618;44368:4;44364:9;44356:6;44352:22;44402:37;44434:4;44402:37;:::i;:::-;44461:1;44475:208;44489:7;44486:1;44483:14;44475:208;;;44568:9;44563:3;44559:19;44553:26;44545:6;44538:42;44619:1;44611:6;44607:14;44597:24;;44666:2;44655:9;44651:18;44638:31;;44512:4;44509:1;44505:12;44500:17;;44475:208;;;44711:6;44702:7;44699:19;44696:179;;;44769:9;44764:3;44760:19;44754:26;44812:48;44854:4;44846:6;44842:17;44831:9;44812:48;:::i;:::-;44804:6;44797:64;44719:156;44696:179;44921:1;44917;44909:6;44905:14;44901:22;44895:4;44888:36;44323:611;;;44286:887;;43876:1303;;;43784:1395;;:::o;45185:538::-;45353:3;45368:75;45439:3;45430:6;45368:75;:::i;:::-;45468:2;45463:3;45459:12;45452:19;;45481:75;45552:3;45543:6;45481:75;:::i;:::-;45581:2;45576:3;45572:12;45565:19;;45594:75;45665:3;45656:6;45594:75;:::i;:::-;45694:2;45689:3;45685:12;45678:19;;45714:3;45707:10;;45185:538;;;;;;:::o;45729:163::-;45869:15;45865:1;45857:6;45853:14;45846:39;45729:163;:::o;45898:366::-;46040:3;46061:67;46125:2;46120:3;46061:67;:::i;:::-;46054:74;;46137:93;46226:3;46137:93;:::i;:::-;46255:2;46250:3;46246:12;46239:19;;45898:366;;;:::o;46270:419::-;46436:4;46474:2;46463:9;46459:18;46451:26;;46523:9;46517:4;46513:20;46509:1;46498:9;46494:17;46487:47;46551:131;46677:4;46551:131;:::i;:::-;46543:139;;46270:419;;;:::o;46695:538::-;46863:3;46878:75;46949:3;46940:6;46878:75;:::i;:::-;46978:2;46973:3;46969:12;46962:19;;46991:75;47062:3;47053:6;46991:75;:::i;:::-;47091:2;47086:3;47082:12;47075:19;;47104:75;47175:3;47166:6;47104:75;:::i;:::-;47204:2;47199:3;47195:12;47188:19;;47224:3;47217:10;;46695:538;;;;;;:::o;47239:232::-;47379:34;47375:1;47367:6;47363:14;47356:58;47448:15;47443:2;47435:6;47431:15;47424:40;47239:232;:::o;47477:366::-;47619:3;47640:67;47704:2;47699:3;47640:67;:::i;:::-;47633:74;;47716:93;47805:3;47716:93;:::i;:::-;47834:2;47829:3;47825:12;47818:19;;47477:366;;;:::o;47849:419::-;48015:4;48053:2;48042:9;48038:18;48030:26;;48102:9;48096:4;48092:20;48088:1;48077:9;48073:17;48066:47;48130:131;48256:4;48130:131;:::i;:::-;48122:139;;47849:419;;;:::o;48274:225::-;48414:34;48410:1;48402:6;48398:14;48391:58;48483:8;48478:2;48470:6;48466:15;48459:33;48274:225;:::o;48505:366::-;48647:3;48668:67;48732:2;48727:3;48668:67;:::i;:::-;48661:74;;48744:93;48833:3;48744:93;:::i;:::-;48862:2;48857:3;48853:12;48846:19;;48505:366;;;:::o;48877:419::-;49043:4;49081:2;49070:9;49066:18;49058:26;;49130:9;49124:4;49120:20;49116:1;49105:9;49101:17;49094:47;49158:131;49284:4;49158:131;:::i;:::-;49150:139;;48877:419;;;:::o;49302:98::-;49353:6;49387:5;49381:12;49371:22;;49302:98;;;:::o;49406:386::-;49510:3;49538:38;49570:5;49538:38;:::i;:::-;49592:88;49673:6;49668:3;49592:88;:::i;:::-;49585:95;;49689:65;49747:6;49742:3;49735:4;49728:5;49724:16;49689:65;:::i;:::-;49779:6;49774:3;49770:16;49763:23;;49514:278;49406:386;;;;:::o;49798:271::-;49928:3;49950:93;50039:3;50030:6;49950:93;:::i;:::-;49943:100;;50060:3;50053:10;;49798:271;;;;:::o;50075:313::-;50188:4;50226:2;50215:9;50211:18;50203:26;;50275:9;50269:4;50265:20;50261:1;50250:9;50246:17;50239:47;50303:78;50376:4;50367:6;50303:78;:::i;:::-;50295:86;;50075:313;;;;:::o
Swarm Source
ipfs://c3ea8a03ec86cec28080fc6a4dacede8440880e44000e3740d565a73c2cd9f71
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.